当前位置: 首页 > news >正文

06-Linux用户管理

1. 用户

1.1 基本概述

用户: 指的是能够正常登录Linux或Windows系统的使用者. (可以理解为你租了房子, 能够正常入驻) 

Linux与Windows系统的用户区别:
本质都是登陆系统, bus
Windows系统中可以创建多个用户, 但不允许同一时刻多个用户登陆系统, 
Linux系统则允许同一时刻多个用户同时登陆, 登陆后相互之间操作并不影响.

1.2 Linux下创建用户的作用

1. 通常在公司是使用普通用户管理服务器, 因为root权限过大, 容易造成故障.
2. 系统上的每一个进程(运行的程序), 都需要一个的用户运行, 可以创建特定的用户运行某些程序.  

1.3 用户与分组

一个用户只能属于一个基本组, 可以有多个附加组.
每个组拥有一定的权限, 将用户添加到某个组, 用户就有了该组拥有的权限.

img

2. 查看用户信息

2.1 查看用户信息命令

查看用户信息命令: id [选项]  [用户]
uid: 用户id, 系统只能识别uid, 不能识别名字, 人看名字
gid:组id  
groups: 用户所属附加组的id 
context: 信息
# 查看当前用户信息(如果省略用户名, 则id命令显示有关当前登录用户的信息.)
[root@kid ~]# id
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 查看指定用户信息
[root@kid ~]# id 用户名
... # 目前只有一个root用户
ps: 每一个进程都会由一个用户身份运行
[root@kid ~]# ps aux|less 
root        279  0.0  0.0      0     0 ?        S<   14:13   0:00 [nfit]
root        280  0.0  0.0      0     0 ?        S<   14:13   0:00 [mpt/0]

2.2 查看用户信息文本

Linux系统中:
用户的信息存放在/etc/passwd, (记录了用户的信息, 但没有密码信息, 一行为一个用户).
密码被存放在/etc/shadow中, (加密后的密码).
* 这两个文件非常的重要, 不要轻易删除与修改.
# 查看第一行的文本信息
[root@kid ~]# head -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
# 1  2 3 4  5    6     7     
# /etc/passwd 配置文件解释如下图

img

# 查看用户密码文本
[root@kid ~]#  head -1 /etc/shadow 
root:$6$v0xj2KgObMg2wBhC$Ba2rnT2w4F18i0arTc/SDm6RBlJ0u.B38neZ15Ma6P.hw9yASOLKwKNu2VKXkOtUPtmdiiifW/eMeeV/uDBJu1::0:99999:7:::

# 配置文件解释如下图

img

ps: 使用change修改密码过期时间示例: https://kid.cnblogs.com/xuliangwei/p/10679004.html

2.3 系统对用户的ID的约定

用户UID系统中约定的含义
0超级管理员, 最高权限, 有着极强的破坏能力
1~200系统用户, 用来运行系统自带的进程, 默认已创建
201~999系统用户, 用来运行用户安装的程序, 所以此类用户无需登录系统
1000+普通用户, 正常可以登陆系统的用户, 权限比较小, 能执行的任务有限
ps: 在CentOS7系统之前, UID1-499用于系统用户, 而UID 500+则用于普通用户

3. 新增用户命令

新增用户命令: useradd [选项] [用户名]   (注意: adduser命令软链接指向useradd命令)
选项  
    -u 指定要创建用户的UID,不允许冲突 (某些UID已经被使用)
    -g 指定要创建用户默认组  
    -G 指定要创建用户附加组, 逗号隔开可添加多个附加组  
    -d 指定要创建用户家目录  
    -s 指定要创建用户的bash shell [/bin/bash(默认使用的)   /sbin/nologin (不可以登入, 用于运行特定软件)]
    -c 指定要创建用户注释信息  
    -M 给创建的用户不创建家目录  
    -r 创建系统账户, 默认无家目录  

3.1 新增用户组命令

新增用户组命令:groupadd [选项] [组名]	
选项:
	-g:设定组的 ID
	
第九小节详细介绍...

3.2 新增用户练习

新增xx用户
[root@kid ~]# useradd xx

[root@kid ~]# id xx
uid=1001(xx) gid=1004(xx) groups=1004(xx)

# 查看倒数第一行的信息, 新添加的用户信息, 已追加的方式添加到文本中.
[root@kid ~]# tail -1 /etc/passwd
xx:x:1001:1004::/home/xx:/bin/bash
# 按照配置文件创建用户, 在/home/下创建用户目录, 默认使用的bash shi /bin/bash,  详情见第七小节.
用户名qz, UID5001, 基本组students, 附加组f1, f2 注释信息:2022 new student,登陆shell: /bin/bash  
# 添加分组students f1 f2 
[root@kid ~]# groupadd students
[root@kid ~]# groupadd f1
[root@kid ~]# groupadd f2

# 新增用户
[root@kid ~]# useradd -u 5001 -g students -G f1,f2 -c "2022 new student" -s /bin/bash qz  

# 附加分组可以有多个使用,隔开 中间不允许有空格否则提示(useradd: group '' does not exist

# 查看用户信息
[root@kid ~]# id qz
uid=5001(qz) gid=1000(students) groups=1000(students),1001(f1),1002(f2)
创建mysql系统用户, -M不建立用户家目录 -s指定nologin使其用户无法登陆系统  
* 这个用户账户用于运行特定的运行, 不需要有家目录, 也不需要登入.
# 新增用户
[root@kid ~]# useradd mysql -M -s /sbin/nologin  

# 查看用户信息
[root@kid ~]# id mysql
uid=5002(mysql) gid=5002(mysql) groups=5002(mysql)

4. 修改用户信息

修改用户信息命令: usermod [选项] [用户名]
选项:  
    -u 指定要修改用户的UID  
    -g 指定要修改用户基本组  
    -G 指定要修改用户附加组, 使用逗号隔开多个附加组, 覆盖原有的附加组, -aG追加  
    -d 指定要修改用户家目录 -md 旧家搬新家  
    -s 指定要修改用户的bash shell  
    -c 指定要修改用户注释信息  
    -l 指定要修改用户的登陆名  
    -L 指定要锁定的用户  
    -U 指定要解锁的用户  
    -md 移动环境(家目录)
# 1.检查此前创建的qz用户信息  
[root@kid ~]# grep "qz" /etc/passwd  
qz:x:5001:1000:2022 new student:/home/qz:/bin/bash
# 2. 修改qz用户uid、gid, 附加组  -a表示追加
# 添加分组network, network
[root@kid ~]# groupadd -g 5008 network
[root@kid ~]# groupadd -g 5009 network  
[root@kid ~]# usermod -u 6001 -g 5008 -a -G 5009 qz  
[root@kid ~]# id qz
uid=6001(qz) gid=5008(network) groups=5008(network),1001(f1),1002(f2),5009(devops)
# 3.修改qz用户的注释信息, 用户家目录, 登录shell, 登录名 -l:改名字, -md, 移动环境
[root@kid ~]# usermod -c "x x x" -md /qz -s /bin/sh -l change_qz qz  
# 检查是否修改成功 
[root@kid ~]# grep "qz" /etc/passwd  
change_qz:x:6001:5008:x x x:/qz:/bin/sh
# 4.锁定用户
# 为用户设置密码 为 123
[root@kid ~]# echo "123" |passwd --stdin change_qz 
Changing password for user change_qz.
passwd: all authentication tokens updated successfully.
# 锁定用户
[root@kid ~]# usermod -L change_qz 

# 使用change_qz用户登入系统 ↓ SSH服务器拒绝了密码

image-20220829175521916

# 5.解锁用户 
[root@kid ~]# usermod -U change_

# 再次输入密码 123 登入成功

image-20220829175833407

5. 删除用户

删除账户命令: userdel [选项] [用户名]
选项:
	-r 删除用户同时删除它的家目录  
	(一般不会删除用户的家目录, 删除用户即可, 用户家目录可能安装一些需要使用的软件...)
# 1.删除mysql用户, 但不删除用户家目录用户邮箱
[root@kid ~]# userdel mysql  
[root@kid ~]# ls /var/spool/mail/  
kid  change_qz  mysql

  
#2.-r参数可以连同用户家目录一起删除(慎用)  
[root@kid ~]# userdel -r change_qz  

6. 用户相关命令

finger命名查询用户信息以及登录信息(yum install finger -y), 示例: finger UserName  
[root@kid ~]# finger root
Login: root           			Name: root
Directory: /root                    	Shell: /bin/bash
On since Sun Aug 28 22:03 (CST) on tty1    20 hours 7 minutes idle
On since Mon Aug 29 15:39 (CST) on pts/1 from 10.0.0.1
   4 seconds idle
Last login Mon Aug 29 17:53 (CST) on pts/0 from 10.0.0.1
No mail.
No Plan.
________________________________________________________________________
登录名:root                     名称:root
目录:/root                            Shell:/bin/bash
自8月28日星期日22:03(美国中部时间)起,tty1 20小时7分钟空闲
自8月29日星期一15:39(CST)起,从10.0.0.1开始在pts/1上
	4秒空闲
最后一次登录:8月29日星期一17:53(CST)从10.0.0.1开始在pts/0上
没有邮件。
没有计划。
chfn命令修改用户信息(其实是修改注释), 示例: chfn UserName 
[root@kid ~]# chfn root
Changing finger information for root.
Name [root]: root
Office []: python
Office Phone []: 21
Home Phone []: 10086

Finger information changed.
[root@kid ~]# finger root
Login: root           			Name: root
Directory: /root                    	Shell: /bin/bash
# 多了这一行备注
Office: python, 21			Home Phone: x1-0086   
On since Sun Aug 28 22:03 (CST) on tty1    20 hours 10 minutes idle
On since Mon Aug 29 15:39 (CST) on pts/1 from 10.0.0.1
   3 seconds idle
Last login Mon Aug 29 17:53 (CST) on pts/0 from 10.0.0.1
No mail.
No Plan.
chsh命令修改用户登录Bash Shell, 示例: chsh UserName  
ps: /bin/下有bash  sh
sh(Bourne Shell)是一个早期的重要shell, 1978年写的
bash(Bourne-Again Shell)是一个为GNU计划编写的Unix shell。1987年写的
# 创建用户qz
[root@kid ~]# useradd qz

# 查看用户信息
[root@kid ~]# cat /etc/passwd | grep 'qz'
qz:x:5003:5003::/home/qz:/bin/bash

# 修改登入bash
[root@kid ~]# chsh qz
Changing shell for qz.
# 输入新的bash所在路径
New shell [/bin/bash]: /bin/sh
Shell changed.
# 查看用户信息
[root@kid ~]# cat /etc/passwd | grep 'qz'
qz:x:5003:5003::/home/qz:/bin/sh
who 当前有哪些用户登录了
[root@kid ~]# who
# tty1 文本模式模式 (VMware)
root     tty1         2022-08-28 22:03
# pts/1 伪(虚拟)终端 (xshell)
root     pts/1        2022-08-29 15:39 (10.0.0.1)
whoami 查看当前有登入用户名
[root@kid ~]# whoami
root
w 查看系统中当前活动的用户
[root@kid ~]# w
# 提示边框太小无法展示, 将终端窗口拉伸一下
w: 69 column window is too narrow

[root@kid ~]# w
 18:30:07 up  4:16,  2 users,  load average: 0.01, 0.04, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      Sun22    4:07   0.21s  0.21s -bash
root     pts/0    10.0.0.1         18:26    7.00s  0.02s  0.00s w

2022-08-29_00858

7. 创建用户流程

* 1. useradd创建用户时,
系统会以/etc/login.defs、/etc/defaults/useradd两个配置文件作为参照物, 
如果在创建用户时指定了参数则会覆盖/etc/login.defs、/etc/defaults/useradd文件默认配置, 如未指定则使用默认.
[root@kid ~]# grep -Ev "^#|^$" /etc/login.defs  
[root@kid ~]# cat /etc/login.defs  
MAIL_DIR    /var/spool/mail  # 定义了邮件路径放在哪  
PASS_MAX_DAYS   99999        # 密码过期时间  
PASS_MIN_DAYS   0            # 密码最少0天  
PASS_MIN_LEN    5            # 密码长度  
PASS_WARN_AGE   7            # 7天提醒  
UID_MIN                  1000  
UID_MAX                 60000  
SYS_UID_MIN               201  
SYS_UID_MAX               999  
GID_MIN                  1000  
GID_MAX                 60000  
SYS_GID_MIN               201  
SYS_GID_MAX               999  
CREATE_HOME yes             # 是否创建home  
UMASK           077  
USERGROUPS_ENAB yes         # 用户不指定组, 默认创建一个同名组  
ENCRYPT_METHOD SHA512       # 密码加密算法  
[root@kid ~]# cat /etc/default/useradd  
GROUP=100  
HOME=/home              # 把用户的家目录建在/home中.  
INACTIVE=-1             # 是否启用账号过期停权,-1表示不启用.   
EXPIRE=                 # 账号终止日期,不设置表示不启用.  
SHELL=/bin/bash         # 新用户默认所有的shell类型.  
SKEL=/etc/skel          # 配置新用户家目录的默认文件存放路径.  
CREATE_MAIL_SPOOL=yes   # 创建mail文件.  
* 2. 当使用useradd创建用户时, 创建的用户家目录下会存在 .bash_
	环境变量相关的文件, 这些环境变量文件默认从/etc/skel目录中拷贝.
	这个默认拷贝环境变量位置是 /etc/defaults/useradd配置文件中定义的.
# 故障案例, 在当前用户家目录执行了rm -rf ., 下次登录系统时出现-bash-4.1$, 如何解决!  
-bash-4.1$ cp -a /etc/skel/.bash ./  
-bash-4.1$ exit  
# 重新连接即可恢复  
[root@kid ~]#   

8. 设置、修改密码

创建用户后, 如需要使用该用户登陆系统则需要为用户设定密码, 设定密码使用passwd命令.
建议密码复杂度高一些、长度大于10、出现各种特殊字符、无任何规律(不要出现简单的弱口令, 很容易被入侵...)

ps: 注意事项  
1.普通用户只允许变更自己的密码, 无法修改其他人密码, 并且密码长度必须8位字符  
2.管理员用户允许修改任何人的密码, 无论密码长度多长或多短.
* 1. 修改用户密码命令:  passwd 
passwd           # 给当前用户修改密码  
passwd root      # 给root用户修改密码  
passwd qz        # 给qz用户修改密码, 普通用户只能自己修改自己  
* 2. 非交互式修改密码 
[root@kid ~]# echo "123" | passwd --stdin qz  
Changing password for user qz.
# passwd:所有身份验证令牌都已成功更新。
passwd: all authentication tokens updated successfully.
* 3. 批量创建100个用户的shell脚本, 密码都为123456  
for i in {1..100}  
do  
useradd test$1  
echo "123456" |passwd --stdin test$1  
done  
* 4.系统内置变量生成随机字符串(对随机字符串进行md5加密)  
[root@kid ~]# echo $RANDOM|md5sum|cut -c 1-10  
d09fe9b1xs  
[root@kid ~]# echo $(echo $RANDOM|md5sum |cut -c 5-14) |tee pass.txt| passwd --stdin qz  
* 5. mkpasswd生成随机字符串, -l设定密码长度,-d数子,-c小写字母,-C大写字母,-s特殊字符  
# 需要安装扩展包  
[root@kid ~]# yum install -y expect   
[root@kid ~]# mkpasswd -l 10 -d 2 -c 2 -C 2 -s 4
# 密码↓
2KS1!">cp%
ps: 推荐密码保存套件工具, 支持windows、MacOS、Iphone以及浏览器插件,
Lastpass官方网站: https://kid.lastpass.com/zh

9. 用户组管理

9.1 组有类别

对于用户来说, 组分以下两种类别:
基本组: 用户只能有一个基本组, 创建时可通过-g指定.
私有组: 创建用户时未指定基本组则会创建一个默认的私有组(与用户同名).
附加组: 基本组不能满足授权要求, 创建附加组, 将用户加入该组, 用户可以属于多个附加组.  

img

9.2 组的信息位置

用户组的信息保存在 /etc/group (重点)  /etc/gshadow 两个文件中. 
[root@kid ~]# head -1 /etc/group  
root:x:0:
# /etc/group 配置文件解释如下图

img

[root@kid ~]# head -1 /etc/gshadow 
root:::
# /etc/gshadow 配置文件解释如下图  

xx

9.3 新增组

使用新增组命令: groupadd [-g GID] 组名
# 创建基本组, 不指定gid  
[root@kid ~]# groupadd no_gid 

# 查看倒数第一行的文本信息
[root@kid ~]#  tail -n1 /etc/group  
no_gid:x:5010:
# 创建基本组, 指定gid为5555  
[root@kid ~]# groupadd -g 5555 yes_gid

# 查看倒数第一行的文本信息
[root@kid ~]# tail -n1 /etc/group 
yes_gid:x:5555:

# 创建系统组, gid从201-999  
[root@kid ~]# groupadd -r sys_group  
[root@kid ~]# tail -n1 /etc/group  
sys_group:x:990:  

9.4 修改组

修改组命令: groupmod [选项] [组名]
选项:
	-g 修改组gid  
	-n 修改组名称
# 修改组id
[root@kid ~]# groupmod -g 1111 no_gid  
[root@kid ~]# tail -1 /etc/group  
no_gid:x:1111:  
# 修改组名(把yes_gid名字改为active_group)  
[root@kid ~]# groupmod yes_gid -n active_group   
[root@kid ~]# tail -1 /etc/group  
active_group:x:5555:  

9.5 删除组

删除组命令: groupdel [选项] [组名]

删除组注意事项:
用户正在使用的基本组与私有组, 无法直接删除该组,
(用户正在使用这个组, 只有删除用户或者用户变更, 解除对该组的占用, 方可删除该组).
删除用户则会移除默认的私有组, 而不会移除基本组. 
# 删除组  
[root@kid ~]# groupdel active_group  
# 添加分组students f1 f2 (之前创建过qz就不要再执行了新增qz用户的命令了)
[root@kid ~]# groupadd students
[root@kid ~]# groupadd f1
[root@kid ~]# groupadd f2

# 新增用户(指定基本组 students)
[root@kid ~]# useradd -u 5001 -g students -G f1,f2 -c "2022 new student" -s /bin/bash qz 

# 查查用户信息
[root@kid ~]# id qz
uid=5001(qz) gid=1000(students) groups=1000(students),1001(f1),1002(f2)

# 删除用户附加组   
[root@kid ~]# groupdel f1
[root@kid ~]# groupdel f2
[root@kid ~]# id qz
uid=5001(qz) gid=1000(students) groups=1000(students)

  
# 无法删除用户基本组(这个组被用户占用中...)  
[root@kid ~]# groupdel students  
groupdel: cannot remove the primary group of user 'qz'

# 删除用户qz
[root@kid ~]# userdel -r qz

# 查看qz的基本组students(这个组不上私有组是基本组, 私有组的组名与用户名一样...)
[root@kid ~]# cat /etc/group | grep 'students'
students:x:1001:

# 删除qz的基本组students
[root@kid ~]#  groupdel students  
# 新建用户没有指定基本组则会默认创建私有组(私有组的组名与用户名一致)
[root@kid ~]# useradd xxx
[root@kid ~]# id xxx
uid=1000(xxx) gid=1003(xxx) groups=1003(xxx)

# 删除私有组 (这个组被用户占用中...)  
[root@kid ~]# groupdel xxx
groupdel: cannot remove the primary group of user 'xxx'

# 删除用户 
[root@kid ~]# userdel xxx
# 查看私有组xxx(已经被移除)
[root@kid ~]# cat /etc/group | grep 'xxx'

9.6 设置组密码

设置组密码命令: gpasswd
# 创建分组
[root@kid ~]# groupadd devops  
# 设置组密码
[root@kid ~]# gpasswd devops  
Changing the password for group devops  
New Password:  123
Re-enter new password: 123

9.7 切换基本组身份

切换基本组身份命令: newgrp
# 创建用户 
[root@kid ~]# useradd qq  

# 查看用户 信息  
[root@kid ~]# id qq
uid=1000(qq) gid=1004(qq) groups=1004(qq)

# 切换普通用户  
[root@kid ~]# su - qq  

# 创建新文件,查看文件的属主和属组  
[qq@kid ~]$ touch file_roots  
[qq@kid ~]$ ll file_roots 
-rw-rw-r--. 1 qq qq 0 Aug 29 21:20 file_roots

# 使用newgrp切换到devops组  
[lqz@kid ~]$ newgrp devops  
Password:  

# 创建文件, 检查属主和属组  
[qq@kid ~]$  newgrp devops  
Password: 
[qq@kid ~]$ touch file_test
[qq@kid ~]$ ll
total 0
-rw-rw-r--. 1 qq qq     0 Aug 29 21:20 file_roots
-rw-r--r--. 1 qq devops 0 Aug 29 21:22 file_test
# 后面创建的文件属组是devops, 账户默认使用自己的基本组或私有组, 使用newgrp切换分组(临时有效)

# 用户分组信息不会改变
[qq@kid ~]$ id qq
uid=1000(qq) gid=1004(qq) groups=1004(qq)

10. 用户提权

往往公司的服务器对外都是禁止root用户直接登录, 所以通常使用的都是普通用户.
使用普通用户执行/sbin目录下的命令时, 会发现没有权限运行, 这种情况下我们无法正常的管理服务器, 
那么如何才能不使用root用户直接登录系统, 同时又保证普通用户能完成日常工作?  

通过以下两种方式:
1. su 切换用户, 使用普通用户登录, 然后使用su命令切换到root. 
   优点:简单 缺点:需要知道root密码  
2. sudo 提权, 当需要使用root权限时进行提权, 而无需切换至root用户.
   优点:安全、方便 缺点:复杂
   
* 在使用su切换前, 我们需要了解一些预备知识, 比如shell分类、环境变量配置文件有哪些

10.1 Linux Shell介绍

1. Shell分类
Linux Shell主要分为如下几类 : 

交互式shell, 等待用户输入执行的命令(终端操作,需要不断提示)  
非交互式shell, 执行shell脚本, 脚本执行结束后shell自动退出  

登陆shell, 需要输入用户名和密码才能进入Shell, 日常接触的最多的一种  
非登陆shell, 不需要输入用户和密码就能进入Shell,比如运行bash命令就会开启一个新的会话窗口
# 切换用户
[root@kid ~]# su qq
# bash新开一个会话窗口并切换到该窗口(非登陆shell)
[qq@kid ~]$ bash 
# 退出新开窗口到之前的窗口
[qq@kid ~]$ exit
exit
# 退到登入用户的窗口(由此看出切换用户其实是新开一个会话窗口)
[qq@kid ~]$ exit
exit
# 在退就退出连接了
[root@kid ~]# exit
logout
2. shell配置文件
bash shell配置文件介绍(文件主要保存用户的工作环境)  
个人配置文件(当前用户目录下)
~/.bash_profile 
~/.bashrc .

全局配置文件:
/etc/profile 
/etc/profile.d/*.sh 
/etc/bashrc  
profile类文件, 设定环境变量, 登陆前运行的脚本和命令.
bashrc 类文件, 设定本地变量, 定义命令别名.  

ps: 如果全局配置和个人配置产生冲突,以个人配置为准。

登陆系统后, 环境变量配置文件的应用顺序:
登录式shell配置文件执行顺序: 
/etc/profile-> /etc/profile.d/*.sh -> ~/.bash_profile
-> ~/.bashrc-> /etc/bashrc  

非登陆式shell配置文件执行顺序: 
~/.bashrc -> /etc/bashrc -> /etc/profile.d/*.sh  

验证方法: 使用echo在每行添加一个输出即可.

10.2 切换用户

su命令切换用户有什么关系?
su - username 属于登陆式shell, 
su username   属于非登陆式shell, 区别在于加载的环境变量不一样.  
su username   属于非登陆式shell

选项-绝对切换目录时时候, 加载当前用户的环境, 切换到当前用户的家目录中.
没有选项-执行切换用户命令不会目录不会发生改变.

普通用户输入: su - 可以直接切换至root用户, 但需要输入root用户的密码.  
超级管理员root用户输入: su - username 切换普通用户不需要输入任何密码.
# 普通用户使用su切换root  
[qq@kid ~]$ su
Password: 
[root@kid qq]# pwd
/home/qq
# 普通用户使用su -切换到root, 会加载root的环境变量  
[qq@kid ~]$ su -
Password: 
Last login: Mon Aug 29 22:18:41 CST 2022 on pts/0
[root@kid ~]# pwd
/root
# 以某个用户的身份执行某个服务(不会切换用户), 使用命令: su - 用户 -c 命令  

# ifconfig 命令需要安装 net-tools
[root@kid ~]# yum install net-tools -y
# 查看网卡信息
[root@kid ~]# su - qq -c 'ifconfig' 
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.128  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::2f36:687e:30de:1e0  prefixlen 64  scopeid 0x20<li
...

# 查看qq的home目录下的文件
[root@kid ~]# su - qq -c 'ls ~'  
file_roots  file_roots2  file_test
# pstree命令以树状图显示进程间的关系
[root@kid ~]# yum provides pstree  
...
[root@kid ~]# yum install psmisc -y  
...
[root@kid ~]# pstree  
systemd─┬─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─VGAuthService
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─login───bash───vi
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───6*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───su───bash───su───bash───su───bash─┬─su
        │                                                        └─su───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───2*[{vmtoolsd}]
# 关闭root远程登陆, 普通用户登进来, su - 切换到root用户  
[root@kid ~]#  vim /etc/ssh/sshd_config  
# 搜索
:/PermitRootLogin
# 设成no, wq保存退出
PermitRootLogin yes   

image-20220829223355789

10.3 提权

su命令在切换用户身份时, 如果每个普通用户都能拿到root用户的密码, 
当其中某个用户不小心泄漏了root的密码, 那系统会变得非常不安全.为了改进这个问题, 从而产生了sudo这个命令.
# 快速配置sudo方式  
# 切换到普通用户
[root@kid ~]# su - qq
Last login: Mon Aug 29 22:29:06 CST 2022 on pts/0
[qq@kid ~]$ pwd
/home/qq

# 查看日志文件
[qq@kid ~]$ tail -f /var/log/secure 
# 提示没有权限
tail: cannot open ‘/var/log/secure’ for reading: Permission denied
tail: no files remaining

# 在root下把qq用户加到wheel组中  wheel拥有一些权限
[root@kid ~]# usermod qq -G wheel 

# 检查普通用户能提权的命令  
[qq@kid root]$ sudo -l
[sudo] password for qq: 
Matching Defaults entries for qq on kid:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR
    LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
    LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
    XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

# 用户qq可以在kid上运行以下命令:
User qq may run the following commands on kid:
#  (全部)全部
    (ALL) ALL

# 为qq用户设置密码123
[root@kid ~]# passwd qq
Changing password for user qq.
New password: 123
# 忽略这个提示
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 123
passwd: all authentication tokens updated successfully.

# 切换用户
[root@node1 ~]$ sudo tail -f /var/log/secure    # sudo 审计日志  
[qq@kid ~]$ sudo tail -f /var/log/secure 
# 提示
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
    
    #1) 尊重他人的隐私。
    #2) 在你打字之前先想一想。
    #3) 权力越大,责任越大。

# 输入当前账户的密码不上root的密码, 如果没有密码会提示, 直接回车会提示 Sorry, try again.
[sudo] password for qq: 123
# 日志的内容
Aug 29 22:41:41 kid su: pam_unix(su-l:session): session opened for user qq by root(uid=0)
Aug 29 22:42:12 kid sudo: pam_unix(sudo:auth): authentication failure; logname=root uid=1000 euid=0 tty=/dev/pts/0 ruser=qq rhost=  user=qq
普通用户不设置密码提权会出错!

2022-08-29_00863

10.4 提权限制

提升后权限太大, 能否有办法限制仅开启某个命令的使用权限? 其他命令不允许? (提权后只允许执行特定的命令)
多用户多角色多命令配置, 需求如下:
用户角色可以执行的命令
ops1 ops2运维网络命令:ifconfig/ping 软件命令:rpm/yum 服务命令:service/systemctl 进程命令:kill/killall
dev1 dev2开发网络命令:ifconfig/ping 服务命令:service/systemctl
一般正常配置sudo方式使用visudo进入配置文件  ( visudo命令等同于 vi /etc/sudoers  )
__________________________________________方式1格式_____________________________________

# 1. 命令别名  别名 = 用户(多个用户使用,隔开)   
User_Alias OPS = ops1,ops2

# 2. Cmnd别名  别名 = 命令 (多个命令使用,隔开)
Cmnd_Alias 别名 = /usr/bin/yum,/usr/sbin/useradd 

# 3. 别名 主机名=(角色名)     命令别名(多个命令别名使用,隔开)  
用户别名       ALL=(ALL)      命令别名    
用户别名       ALL=(ALL)       命令别名   

___________________________________________方式2格式______________________________________
# 1. Cmnd别名  别名 = 命令 (多个命令使用,隔开)
Cmnd_Alias 别名 = /usr/bin/yum,/usr/sbin/useradd 

# 2. 别名 主机名=(角色名) 命令别名(多个命令别名使用,隔开)  
%group_ops ALL=(ALL) 命令别名

_________________________________________________________________________________________
# /usr/bin/yum, /usr/sbin/useradd   # 允许使用sudo执行命令  
# NOPASSWD:/bin/cp, /bin/rm        # NOPASSWD不需要使用密码 
visudo -c # 检查刚刚编辑的是否有错误  
sudo -l  # 检查用户对主机有哪些权限  
1. 方式1
编辑sudo的配置文件 /etc/sudoers
# 第1步 创建用户与分组并配置密码
[root@kid ~]# useradd ops1
[root@kid ~]# useradd ops2
[root@kid ~]# useradd dev1
[root@kid ~]# useradd dev2

# 设置密码(必须) 
[root@kid ~]# echo "123" |passwd --stdin ops1
Changing password for user ops1.
passwd: all authentication tokens updated successfully.

[root@kid ~]# echo "123"|passwd --stdin ops2
Changing password for user ops2.
passwd: all authentication tokens updated successfully.

[root@kid ~]# echo "123"|passwd --stdin dev1
Changing password for user dev1.
passwd: all authentication tokens updated successfully.

[root@kid ~]# echo "123"|passwd --stdin dev2
Changing password for user dev2.
passwd: all authentication tokens updated successfully.

# 创建分组并设置密码
[root@kid ~]# groupadd DEV
# 第2步 使用visudo命令来编辑sudo的配置文件, 命令等同于 vi /etc/sudoers
[root@kid ~]# visudo
# 将下面代码复制到文件中(末尾即可)
# 定义用户组(SPS DEV 与 group没有关系)
# 用户别名 OPS = ops1,ops2
User_Alias OPS = ops1,ops2
# 用户别名 DEV = ops1,ops2
User_Alias DEV = dev1,dev2

# 定义可执行的命令组 
# 网卡命令可以执行ifconfig, ping命令
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
# 软件类命令可u执行 rpm yum命令
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
# 服务类命令可以执行 service, systemctl start命令
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
# 进程类命令可u执行 kill, killall命令
Cmnd_Alias PROCESSES = /bin/kill, /usr/bin/kill, /usr/bin/killall

# 将用户组合命令组进行关联(OPS可以执行上面四类命令, DEV可以执行软件类, 服务类命令)
OPS ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,PROCESSES
DEV ALL=(ALL) SOFTWARE,SERVICES
# 3.登陆对应的用户使用 sudo -l 验证权限  
[root@kid ~]# su - ops1
# 查看权限
[ops1@kid ~]$ sudo -l
# 提示权限越大责任越大...
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

# 输入用户密码
[sudo] password for ops1: 
Matching Defaults entries for ops1 on kid:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset,
    env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR
    USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT
    LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",
    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

# 用户ops1可以在kid上运行以下命令:(刚才配置的所有命令, dev就不测试了)
User ops1 may run the following commands on kid:
    (ALL) /sbin/ifconfig, /bin/ping, /bin/rpm, /usr/bin/yum, /sbin/service, /usr/bin/systemctl
        start, /bin/kill, /usr/bin/kill, /usr/bin/killall

2. 方式2
使用groupadd添加组, 然后给组分配sudo的权限, 如果有新用户加入, 直接将用户添加到该组.
# 1.添加两个真实的系统组,  group_dev group_ops  
[root@kid ~]# groupadd group_dev  
[root@kid ~]# groupadd group_ops 

      
# 2.添加四个用户, 并设置分组     group_ops(user_a  user_b)   group_dev(user_c  user_d)  
[root@kid ~]# useradd user_a -G group_dev 
[root@kid ~]# useradd user_b -G group_dev  
[root@kid ~]# useradd user_c -G group_ops  
[root@kid ~]# useradd user_d -G group_ops 

# 3.设置密码(必须) 
[root@kid ~]# echo "1" | passwd --stdin user_a
Changing password for user user_a.
passwd: all authentication tokens updated successfully.
[root@kid ~]# echo "1" | passwd --stdin user_b 
Changing password for user user_b.
passwd: all authentication tokens updated successfully.
[root@kid ~]# echo "1" | passwd --stdin user_c 
Changing password for user user_c.
passwd: all authentication tokens updated successfully.
[root@kid ~]# echo "1" | passwd --stdin user_d  
Changing password for user user_d.
passwd: all authentication tokens updated successfully.

      
# 4.在sudo中配置规则 (将方法一的代码替换为下列代码)
[root@kid ~]# visudo  

# 定义可执行的命令组 
# 网卡命令可以执行ifconfig, ping命令
Cmnd_Alias NETWORKING = /sbin/ifconfig, /bin/ping
# 软件类命令可u执行 rpm yum命令
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
# 服务类命令可以执行 service, systemctl start命令
Cmnd_Alias SERVICES = /sbin/service, /usr/bin/systemctl start
# 进程类命令可u执行 kill, killall命令
Cmnd_Alias PROCESSES = /bin/kill, /usr/bin/kill, /usr/bin/killall

# 将用户组合命令组进行关联(OPS可以执行上面四类命令, DEV可以执行软件类, 服务类命令)
%group_ops ALL=(ALL) NETWORKING,SOFTWARE,SERVICES,PROCESSES 
%group_dev ALL=(ALL) SOFTWARE,SERVICES
# 5.检查sudo是否配置有错  
[root@kid ~]# visudo -c  
/etc/sudoers: parsed OK  
# 6.检查user_a 的权限  
[user_a@kid ~]$ sudo -l

...
# 用户ops1可以在kid上运行以下命令:(刚才配置的所有命令, 其他的就不测试了)
User user_a may run the following commands on kid:
    (ALL) /sbin/ifconfig, /bin/ping, /bin/rpm, /usr/bin/yum, /sbin/service, /usr/bin/systemctl
        start, /bin/kill, /usr/bin/kill, /usr/bin/killall

10.4 sudo命令执行流程

1. 普通用户执行sudo命令时, 会检查/var/db/sudo是否存在时间戳缓存  
2. 如果存在则不需要输入密码, 否则需要输入用户与密码  
3. 输入密码会检测是否该用户是否拥有该权限  
4. 如果有则执行, 否则报错退出

img

10.5 系统内置命令提权报错
问题描述: 
cd到/etc/docker, 提示权限不够的错误,
使用sudo cd /etc/docker时, 提示sudo: cd:找不到命令.

问题分析:
cd不是一个应用程序而是Linux内建的命令, 而sudo仅仅只对应用程序起作用。

>type cd 
cd is a shell builtin. cd是一个内置的shell命令.

sudo foo 只意味着以root权限运行foo程序
所以, sudo cd /etc/docker会报sudo: cd:找不到命令。

解决方法:
使用sudo -i命令提升用户权限
> sudo -i
> cd /etc/docker
使用sudo -s命令打开特殊shell(使用exit命令退出shell)
> sudo -s
> cd /etc/docker

作者:craneyuan
链接:https://www.jianshu.com/p/d172a92475f1
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

  • 十天学前端之JS篇(五)
  • python 并发、并行处理、分布式处理
  • 推荐一款国人开源的 Redis 可视化管理工具
  • 开发工程师必备————【Day22】前端开发之jQuery更多操作
  • 04【DQL查询】
  • Vscode常用插件
  • 利用MyBatisX插件自动生成代码
  • 【数据结构】——栈和链表的面试题详解
  • 如何从 apt-get 升级中排除特定软件包
  • C++/Python:罗德里格斯旋转矩阵
  • c++征途 --- STL初识
  • 学习编程的第二十三天
  • 上交所技术——2020春招应用开发工程师(Java)笔试
  • 猿创征文|时间序列分析算法之二次指数平滑法和三次指数平滑法详解+Python代码实现
  • 基于人工兔优化算法的函数寻优和工程优化
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • axios 和 cookie 的那些事
  • CSS3 变换
  • gcc介绍及安装
  • Git学习与使用心得(1)—— 初始化
  • Java读取Properties文件的六种方法
  • Java多态
  • jdbc就是这么简单
  • orm2 中文文档 3.1 模型属性
  • Spark学习笔记之相关记录
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 从PHP迁移至Golang - 基础篇
  • 对象引论
  • 那些年我们用过的显示性能指标
  • 人脸识别最新开发经验demo
  • 日剧·日综资源集合(建议收藏)
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微服务核心架构梳理
  • puppet连载22:define用法
  • 从如何停掉 Promise 链说起
  • ​卜东波研究员:高观点下的少儿计算思维
  • ###STL(标准模板库)
  • #Linux(帮助手册)
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (九)One-Wire总线-DS18B20
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十三)Maven插件解析运行机制
  • (五)关系数据库标准语言SQL
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原)本想说脏话,奈何已放下
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)负载均衡,回话保持,cookie
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NetCore项目nginx发布
  • .net反编译的九款神器
  • @Conditional注解详解