第 04 课 用户管理

目录

一、认识 /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 中仍然根据默认规则设定了家目录

手动建立家目录

  1. 无家的用户进入系统会发现很怪
[root@localhost skel]# su - Kevin.Love
-bash-4.2$                 # 提示符都不对
  1. 为其手动建立家目录
[root@localhost skel]# mkdir /home/Kevin.Love
[root@localhost skel]# ls /home/
alice  Bond  choco  chocolee  darlen  Kevin.Love
  1. 拷贝家目录模板
[root@localhost Kevin.Love]# cp /etc/skel/.bash* . && ls -a
.  ..  .bash_logout  .bash_profile  .bashrc
[root@localhost Kevin.Love]# su - Kevin.Love
上一次登录:一 521 23:07:42 CST 2018pts/0 上
[Kevin.Love@localhost ~]$                            # 这下就正常了

4. 删除用户

  • 命令
    userdel

  • 选项

    • -r:同时删除用户的数据,如 家目录、邮件等
  • 例子

仅进行用户删除

[root@localhost ~]# ll /home/alice -d
drwx------. 2 alice alice 94 516 00:21 /home/alice
[root@localhost ~]# userdel alice && !!
userdel alice && ll /home/alice -d
drwx------. 2 1001 1002 94 516 00:21 /home/alice         #家目录仍然存在

删除用户的同时,删除其数据

[root@localhost ~]# ll /home/bob/ -d
drwx------. 2 bob bob 94 515 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./BNTk7DNkXI3aFFyShNunwAnmSTUu6.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
上一次登录:一 521 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/sudoervisudo

谁能使用 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)

猜你喜欢

转载自blog.csdn.net/chocolee911/article/details/81352161