目录
一、认识
/etc/passwd
和/etc/shadow
二、用户与用户组的管理
三、用户密码管理
四、用户身份切换
一、认识 /etc/passwd
和 /etc/shadow
1. /etc/passwd
解释
[root@localhost ~]# cat /etc/passwd
root: x: 0: 0: root:/root:/bin/bash
用户名:密码:UID:GID: 描述:家目录: Shell
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
chocolee:x:1000:1000::/home/chocolee:/bin/bash
- 第一列:用户名,可以是大小写、数字、减号、点、下划线的组合,但减号、点不建议使用
- 第二列:用户密码,老版 UNIX 将密码存在此处,但考虑到安全因素,后来将密码放于
/etc/shadow
- 第三列:UID,root 的 UID 为0,普通用户的 UID 从1000开始向后分配
- 第四列:GID
- 第五列:描述信息,如姓名、电话、地址等,可有可无
- 第六列:用户家目录,普通用户的家目录默认建在
/home/
下,但该字段可以自定义,使用户家目录不在/home/
下 - 第七列:用户 shell,默认为
/bin/bash
,也可以设置为/bin/nologin
,这样设置即不允许该用户登录
2. /etc/shadow
解释
[root@localhost ~]# cat /etc/shadow
root:$6$ng8WooyA$ghFCJVR...........adgV0xw6Ay6ya0ViFKIWI
/x9evitI5GoSTdFvg.:17660:0:99999:7:::
bin:*:16231:0:99999:7:::
daemon:*:16231:0:99999:7:::
sshd:!!:17658::::::
ntp:!!:17664::::::
chocolee:!!: 17665: 0: 99999: 7:::
用户名: 密码:上次改密的时间:下次可改密的时间:多少天后到期:密码到期前的警告期限:账号失效期限:账号作废期限:保留字段
第一列:用户名,与/etc/passwd
中对应
第二列:密码的密文(摘要算法为SHA-512)
第三列:上次更改密码的日期,时间是从 UNIX 元年(1970-01-01)开始的天数
第四列:过多少天可以修改密码,默认为0,表示不限制
第五列:密码多少天后到期,默认99999,表示永不过期
第六列:到期前几天开始警告,比如设置为 7,则到期前的第七天开始告警
第七列:容忍期,比如设置为 5,则到期后的5天内仍可登录,超过5天则正式无法使用
第八列:保留字段
- ps. 改密后,系统中会出现
/etc/shadow-
,这是系统自动形成的备份
二、用户与用户组的管理
1. 新建组
命令
groupadd
-
选项
-
-g
:指定 GID
-
例子
[root@localhost ~]# groupadd school && grep school /etc/group
school:x:1004:
[root@localhost ~]# groupadd -g 1111 hospital && grep hospital /etc/group
hospital:x:1111:
2. 删除组
-
命令
groupdel
注意:如果用户组中包含用户,只有从该用户组中移出所包含的全部用户才能删除该用户组
3. 新建用户
命令
useradd
-
选项
-
-u
:指定 UID -
-g
:指定 GID 或组名 -
-d
:指定家目录 -
-s
:指定 Shell -
-M
:不建立家目录(但不影响 /etc/passwd 中记录默认的家目录)
-
- 例子
指定较全的选项
[root@localhost ~]# useradd -u 1212 -g school -d /etc -s /bin/bash James && grep James /etc/passwd
James:x:1212:1004::/etc:/bin/bash
不建立家目录
[root@localhost ~]# useradd -M Kevin.Love && grep Kevin /etc/passwd
Kevin.Love:x:1214:1214::/home/Kevin.Love:/bin/bash
注意:仅仅是不在文件系统中建立家目录,但 /etc/passwd
中仍然根据默认规则设定了家目录
手动建立家目录
- 无家的用户进入系统会发现很怪
[root@localhost skel]# su - Kevin.Love
-bash-4.2$ # 提示符都不对
- 为其手动建立家目录
[root@localhost skel]# mkdir /home/Kevin.Love
[root@localhost skel]# ls /home/
alice Bond choco chocolee darlen Kevin.Love
- 拷贝家目录模板
[root@localhost Kevin.Love]# cp /etc/skel/.bash* . && ls -a
. .. .bash_logout .bash_profile .bashrc
[root@localhost Kevin.Love]# su - Kevin.Love
上一次登录:一 5月 21 23:07:42 CST 2018pts/0 上
[Kevin.Love@localhost ~]$ # 这下就正常了
4. 删除用户
命令
userdel
-
选项
-
-r
:同时删除用户的数据,如 家目录、邮件等
-
例子
仅进行用户删除
[root@localhost ~]# ll /home/alice -d
drwx------. 2 alice alice 94 5月 16 00:21 /home/alice
[root@localhost ~]# userdel alice && !!
userdel alice && ll /home/alice -d
drwx------. 2 1001 1002 94 5月 16 00:21 /home/alice #家目录仍然存在
删除用户的同时,删除其数据
[root@localhost ~]# ll /home/bob/ -d
drwx------. 2 bob bob 94 5月 15 23:47 /home/bob/
[root@localhost ~]# userdel -r bob && ll -d /home/bob/
ls: 无法访问/home/bob/: 没有那个文件或目录
三、用户密码管理
1. 修改密码
命令
passwd
例子
修改自己的密码
[chocolee@localhost ~]$ passwd
更改用户 chocolee 的密码 。
为 chocolee 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
修改其他用户的密码(仅 root 有该权限)
[root@localhost ~]# passwd chocolee
更改用户 chocolee 的密码 。
新的 密码:
重新输入新的 密码:p
passwd:所有的身份验证令牌已经成功更新。
2. 免交互修改密码
- 正常修改密码(需要通过两次交互)
[root@localhost ~]# passwd root
更改用户 root 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
- 通过
--stdin
(仅需一次,但是是明文)
[root@localhost ~]# clear
[root@localhost ~]# passwd --stdin root
更改用户 root 的密码 。
12345678
passwd:所有的身份验证令牌已经成功更新。
- 仅通过管道符(相当于半自动地输了两次)
[root@localhost ~]# echo -e "choco12345\nchoco12345" | passwd root
更改用户 root 的密码 。
新的 密码:重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。
- 管道符+
--stdin
(全自动)
[root@localhost ~]# echo "choco12345" | passwd --stdin root
更改用户 root 的密码 。
passwd:所有的身份验证令牌已经成功更新。
3. 锁定、解锁用户
- 选项
-
-l
:锁定 -
-u
:解锁
-
例子:
锁定用户
[root@localhost ~]# passwd -l chocolee && !!
passwd -l chocolee && tail /etc/passwd
锁定用户 chocolee 的密码 。
passwd: 操作成功
[root@localhost ~]# grep chocolee /etc/shadow
chocolee:!!$6$axUVEyOg$W.xHFI0aTcN4bg1RRFfwoNKGuMVRnvQImljFw.tuLJA7E./BNTk7DNkXI3aFFyShNu
nwAnmSTUu6.zJCqULaz.:17671:0:99999:7::: # 用户密码的前面出现了两个叹号
解锁用户
[root@localhost ~]# passwd -u chocolee
解锁用户 chocolee 的密码。
passwd: 操作成功
4. 产生随机密码
- 命令
mkpasswd
(需要安装 expect)
- 选项
-
-l
:指定密码长度 -
-s
:指定特殊字符的个数 -
-d
:指定数字的个数 -
-c
:指定小写字母的个数 -
-C
:指定大写字母的个数
-
- 例子
生成一个长12位,包含:4个特殊字符、2个大写、4个数字的密码
[root@localhost ~]# mkpasswd -l 12 -s 4 -C 2 -d 4
<$7=[O10blU3
四、用户身份切换
1. su
- 完整切换用户身份(连同目标用户的环境变量一起切过去)
[root@localhost ~]# su - chocolee
上一次登录:一 5月 21 06:21:28 CST 2018pts/0 上
[chocolee@localhost ~]$ pwd
/home/chocolee
- 非完整切换
[root@localhost ~]# su chocolee
[chocolee@localhost root]$ pwd
/root
- 以用户身份执行某个命令(需要输入目标用户的密码)
[chocolee@localhost root]$ su -c "cat /etc/passwd" root
密码:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
2. sudo
Ubuntu中常见,一种比较安全的做法,仅需用户输入自己的密码就能临时以 root 的身份执行某些命令
- 用法
[chocolee@localhost ~]$ cat /etc/shadow # chocolee 无权查看 /etc/shadow
cat: /etc/shadow: 权限不够
[chocolee@localhost ~]$ sudo cat /etc/shadow # 用 sudo 就可以
[sudo] password for chocolee:
root:$6$SuR.........spmAn4TrsRXFjnb3JL674lc
ReBdb2CHhxL9siMAS0:17672:0:99999:7:::
bin:*:16231:0:99999:7:::
daemon:*:16231:0:99999:7:::
adm:*:16231:0:99999:7:::
3. /etc/sudoer
与 visudo
谁能使用
sudo
,在哪使用,允许用sudo
哪些命令,都是 root 在/etc/sudoers
中配置的。
但该文档遵循一定格式,所以不要手动修改该文件,应该用visudo
进行修改,visudo
具有语法校验功能
- 文档内容解释
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
chocolee ALL=(ALL) ALL
第一列:组、用户、用户别名——指定能使用sudo
命令的用户或组
第二列:本机 IP 或主机名——指定在哪台机子能够使用sudo
(常用于多台策略不同的主机,使用同一的 /etc/sudoers
进行限定时,仅需要一个相同的 /etc/sudoers
文件,即可对应不同的主机)
第三列:以哪个用户的身份执行命令
第四列:命令——指定能使用 sudo
执行哪些命令。该字段请用绝对路径。
- 限定可以使用的命令
/etc/sudoers
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
chocolee ALL=(ALL) /usr/bin/ls,/usr/bin/cat
效果:同样的文件,能 cat
,但不能 vim
[chocolee@localhost ~]$ sudo vim /etc/shadow
对不起,用户 chocolee 无权以 root 的身份在 localhost.localdomain 上执行 /bin/vim /etc/shadow。
[chocolee@localhost ~]$ sudo cat /etc/shadow
root:$6$SuR6vKTm$PFqHZ848a5uQUvq......ReBdb2CHhxL9siMAS0:17672:0:99999:7:::
bin:*:16231:0:99999:7:::
- 不需要密码即可执行
/etc/sudoers
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
chocolee ALL=(ALL) NOPASSWD:/usr/bin/ls,/usr/bin/cat
效果:不需要输入密码即可使用
[chocolee@localhost ~]$ sudo cat /etc/shadow
root:$6$SuR6vK..........rsRXFjnb3JL674lcReBdb2CHhxL9siMAS0:17672:0:99999:7:::
bin:*:16231:0:99999:7:::
4. 关于 su 的常用安全做法
首先,禁止 root 远程登录(修改 /etc/ssh/sshd-config
)
#LoginGraceTime 2m
PermitRootLogin no # 禁止 root 远程登录
其次,设置详细的 sudo
规则
(The End)