# 用户和用户组管理

# 用户配置文件

# 用户信息文件 /etc/passwd

  1. 用户管理简介

    • 越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范。
    • 在 linux 中主要通过用户配置文件来查看和修改用户信息。
  2. /etc/passwd

    整体格式: name:password:UID:GID:GECOS:directory:shell

    [root@core-pods-3 ~]# man 5 passwd   # 查看配置文件说明
    # (1)name:用户名称,非特殊字符
    # (2)password:密码标志,x 代表该用户有密码,具体查 shadow 文件;如果 x 不写会默认该用户没密码并可以直接登录(没有密码的登录只允许本机登录,不允许远程 ssh 登录的,所以不用太担心)
    # (3)UID:user id,
    #     - 0:超级用户,可以手动赋予一个普通用户的 uid 为 0,此时该用户行使和 root 同样的权限;
    #     - 1-499 是系统用户,不能删,删除可能会导致系统崩溃
    #     - 500 - 65535:普通用户,内核 2.6 后支持 2 的 32 次方用户数量
    # (4)GID:(用户初始组 ID)
    #     - 初始组:就是指用户一登陆就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。
    #     - 附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个
    # (5)用户说明,备注,可以不加
    # (6)家目录(宿主目录)
    #     - 普通用户:/home/ 用户名 /
    #     - 超级用户:/root/
    #  (7) 登录之后的 shell,shell 就是 linux 的命令解释器,在 /etc/passwd 当中,除了标准 shell 是 /bin/bash 之外,还可以写如 /sbin/nologin,但是不能写错,写错是登录不了的
    [root@core-pods-3 ~]# vim /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    ... ...
    [root@core-pods-3 ~]# 
    # linux 一开始密码就放在 passwd 下面,后来密码放在了 /etc/shadwow 下,ll 可以查看到 shadow 文件没有任何操作权限
    [root@core-pods-3 ~]# ll /etc/passwd
    -rw-r--r-- 1 root root 1785 Aug  4 04:14 /etc/passwd
    [root@core-pods-3 ~]# ll /etc/shadow
    ---------- 1 root root 2161 Aug  4 04:14 /etc/shadow
    [root@core-pods-3 ~]#  vim /etc/shadow   # 可以看到密码以非明文方式记录,只有 root 可以查看
  3. 影子文件:/etc/shadow

    #(1)root:用户名
    #(2)$6$2...:加密后的密码,md5 -> sha512,如果密码位是 "!!" 或 "*",代表没有密码,不能登录
    #(3)19174:密码最后一次修改日期:使用 1970 年 1 月 1 日作为标准时间,每过一天时间戳 + 1,这里指 1970 年 1 月 1 日后的第 19174 天
    #(4)0:指从第 19174 天开始,任何时间都可以修改密码,如果是 10 的话意思就是 10 天内不能修改密码,所以这个字段指两次密码的修改间隔时间
    #(5)99999:密码的有效期,即 19174 + 99999
    #(6)7:密码修改到期前的警告天数(和第五个字段相比)
    #(7)空:密码过期后的宽限天数(和第五个字段相比)
    #    - 0:代表密码过期后立即失效,写 0 和不写是一个意思,所以空意味着到期即失效
    #    - -1:代表密码永远不会失效
    #(8)空:账号失效时间,要用时间戳表示
    #(9)空:保留
    [root@core-pods-3 ~]# vi /etc/shadow
    root:$6$2cP08Sf/$/rH6Zw6my.hemDc8/5TDpVfS2an3Hho.HyVU4qYN3d7CMxn0d1zzAHVxrvfzOJBoxWJaaDR.lKkis4iMjO0:19174:0:99999:7:::
    bin:*:17110:0:99999:7:::
    daemon:*:17110:0:99999:7:::
    adm:*:17110:0:99999:7:::
    ... ...
    user1:!!:19205:0:99999:7:::
    user2:!!:19205:0:99999:7:::
    user3:!!:19205:0:99999:7:::
    # 时间戳换算
    [root@core-pods-3 ~]# date -d "1970-01-01 16066 days"
    Fri Dec 27 00:00:00 EST 2013
    [root@core-pods-3 ~]# echo $(($(date --date="2014/01/06" +%s)/86400+1))
    16077
  4. 组信息文件

    组信息文件:/etc/group

    组密码文件:/etc/gshadow

    # /etc/group
    # 
    # 总共有 4 个字段:组名、组的密码标志、GID、组中附加用户
    # 第一字段 - 组名:默认就是和用户名一样,linux 每添加一个用户会默认添加一个同名的用户组
    # 第二字段 - 组密码:不推荐使用组密码,设了组密码可能会行使 root 部分权限,会降低系统安全性
    # 第三字段 - GID:group id,组 id,可以强制修改组 id,比如改成和 root 一样的 id 行使和 root 一样的权限
    # 第四字段 - 附加用户:只能看到附加用户,看不到初始用户(查看初始用户需要参照 /etc/passwd)
    [root@core-pods-3 ~]# vim /etc/group
    root:x:0:
    bin:x:1:
    daemon:x:2:
    sys:x:3:
    ... ...
    Bella3:x:1011:
    Bella4:x:1012:
    Bella5:x:1013:
    # /etc/gshadow
    # 第一字段:组名。
    # 第二字段:组密码。
    # 第三字段:组管理员用户名。
    # 第四字段:组中附加用户。
    [root@core-pods-3 ~]# vim /etc/gshadow
    root:::
    bin:::
    daemon:::
    sys:::
    ... ...
    Bella3:!::
    Bella4:!::
    Bella5:!::

# 用户管理相关文件

  1. 用户的家目录

    • 普通用户:/home/ 用户名 /,所有者和所属组都是此用户,权限是 700。
    • 超级用户:/root/,所有者和所属组都是 root 用户,权限是 550。
    [root@core-pods-3 ~]# ll -d /root/
    dr-xr-x---. 6 root root 4096 Aug  8 22:22 /root/
    [root@core-pods-3 ~]# ll -d /home/Jalen1
    drwx------ 2 Jalen1 Jalen1 4096 Aug  4 04:09 /home/Jalen1

    怎么把一个普通用户变为超级用户?

    答案:将 /etc/passwd 下的 uid 改为 0,和 root 一样即可,此时它的家目录不会更改,只是登录后不在是 $ 符号而是 #号,也就是权限更改了但是家目录不变。

  2. 用户的邮箱
    这里的邮箱只是客户端,并没有邮件服务器(类似 qq 邮箱),这里只 linux 用户之间发送邮件,利用的是内存管理,虽然每个用户都有邮箱 (每个用户都会默认创建一个邮箱,名字和用户名一样),但是并没有邮件服务器,邮箱路径是 /var/spool/mail/用户名/ 。var 是 linux 系统中可变数据保存位置。

    [root@core-pods-3 ~]# ll /var/spool/mail/
    total 4
    -rw-rw---- 1 Bella1     mail   0 Aug  4 04:14 Bella1
    -rw-rw---- 1 Bella2     mail   0 Aug  4 04:14 Bella2
    -rw-rw---- 1 Bella3     mail   0 Aug  4 04:14 Bella3
    -rw-rw---- 1 Bella4     mail   0 Aug  4 04:14 Bella4
    -rw-rw---- 1 Bella5     mail   0 Aug  4 04:14 Bella5
    -rw-rw---- 1 Jalen1     mail   0 Aug  4 04:09 Jalen1
    -rw-rw---- 1 Jalen2     mail   0 Aug  4 04:09 Jalen2
    -rw-rw---- 1 Jalen3     mail   0 Aug  4 04:09 Jalen3
    -rw-rw---- 1 Jalen4     mail   0 Aug  4 04:09 Jalen4
    -rw-rw---- 1 Jalen5     mail   0 Aug  4 04:09 Jalen5
    -rw-rw---- 1 linzhiling mail   0 Jul 15 22:27 linzhiling
    -rw------- 1 root       mail 628 Jul 17 22:39 root
    -rw-rw---- 1 user1      mail   0 Aug  1 00:21 user1
    -rw-rw---- 1 user2      mail   0 Aug  1 00:21 user2
    -rw-rw---- 1 user3      mail   0 Aug  1 00:21 user3
    [root@core-pods-3 ~]#
  3. 用户模板目录
    目录为 /etc/skel 。在这个目录下可以写一些说明信息,这样在新用户添加后,这些规则性的文件或说明会自动创建在这个新用户的家目录下,也就是家目录下会根据这个模板去生成相应的文件,我们可以使用 ls -a 查看下这个目录,能够发现有很多用户配置文件比如 .bash_profile.bashrc 都在这个目录下。

    [root@core-pods-3 ~]# cd /home/Jalen1
    [root@core-pods-3 Jalen1]# ls
    [root@core-pods-3 Jalen1]# ls -a
    .  ..  .bash_logout  .bash_profile  .bashrc
    [root@core-pods-3 Jalen1]# ll /etc/skel/
    total 0
    [root@core-pods-3 Jalen1]# cd /etc/skel/
    [root@core-pods-3 skel]# vi warning.txt   # 随便写点
    [root@core-pods-3 skel]# ls
    warning.txt
    [root@core-pods-3 skel]# ls -a
    .  ..  .bash_logout  .bash_profile  .bashrc  warning.txt
    [root@core-pods-3 skel]# useradd superman
    [root@core-pods-3 skel]# passwd superman
    Changing password for user superman.
    New password: 
    BAD PASSWORD: The password is shorter than 8 characters
    Retype new password: 
    passwd: all authentication tokens updated successfully.
    [root@core-pods-3 skel]# cd /home/superman/
    [root@core-pods-3 superman]# ls -a
    .  ..  .bash_logout  .bash_profile  .bashrc  warning.txt
    [root@core-pods-3 superman]# cat warning.txt 
    Please follow the rules.

# 用户和用户组管理

  1. 用户添加命令 useradd

    命令 # useradd [选项] 用户名 ,选项:

    • -u UID:手工指定用户的 UID 号。不建议手动指定
    • -d 家目录:手工指定用户的家目录。不推荐
    • -c 用户说明:手工指定用户的说明。
    • -g 组名:手工指定用户的初始组
    • -G 组名:指定用户的附加组
    • -s shell:手工指定用户的登录 shell。默认是 /bin/bash
    [root@core-pods-3 ~]# useradd jalen
    [root@core-pods-3 ~]# passwd jalen
    Changing password for user jalen.
    New password: 
    Retype new password: 
    passwd: all authentication tokens updated successfully.
    [root@core-pods-3 ~]# grep jalen /etc/passwd
    jalen:x:1015:1015::/home/jalen:/bin/bash
    [root@core-pods-3 ~]# grep jalen /etc/shadow
    jalen:$6$YfI2Q0.f$8yPh9s7e7jmAE1ifpvyc3LdEyZqVY/tTKGKZPDlYYRS90lEmINh.FdXssa87c4f/s3NEz9wqkNt..aypD1.:19213:0:99999:7:::
    [root@core-pods-3 ~]# grep jalen /etc/group
    jalen:x:1015:
    [root@core-pods-3 ~]# grep jalen /etc/gshadow
    jalen:!::
    [root@core-pods-3 ~]# ll -d /home/
    drwxr-xr-x. 18 root root 4096 Aug  8 23:15 /home/
    [root@core-pods-3 ~]# ll -d /home/jalen/
    drwx------ 2 jalen jalen 4096 Aug  8 23:15 /home/jalen/
    [root@core-pods-3 ~]# ll /var/spool/mail/jalen 
    -rw-rw---- 1 jalen mail 0 Aug  8 23:15 /var/spool/mail/jalen
    [root@core-pods-3 ~]#
    [root@core-pods-3 ~]# useradd -u 550 -G root,bin -d /home/jjj -c "test user jjj" -s /bin/bash kkk
    [root@core-pods-3 ~]# grep kkk /etc/passwd
    kkk:x:550:1016:test user jjj:/home/jjj:/bin/bash
    [root@core-pods-3 ~]# ll -d /home/jjj
    drwx------ 2 kkk kkk 4096 Aug  9 00:10 /home/jjj
    [root@core-pods-3 ~]#
  2. 用户默认值文件

    /etc/default/useradd

    • GROUP=100:用户默认组
    • HOME=/home:用户家目录
    • INACTIVE=-1:密码过期宽限天数(shadow 文件 7 字段)
    • EXPIRE=:密码失效时间(shadow 文件 8 字段)
    • SHELL=/bin/bash:默认 shell
    • SKEL=/etc/skel:模板目录
    • CREATE_MAIL_SPOOL=yes:是否建立邮箱
    [root@core-pods-3 ~]# vi /etc/default/useradd 
    # useradd defaults file
    GROUP=100
    HOME=/home
    INACTIVE=-1
    EXPIRE=
    SHELL=/bin/bash
    SKEL=/etc/skel
    CREATE_MAIL_SPOOL=yes

    /etc/login.defs

    • PASS_MAX_DAYS 99999:密码有效期(shadow 文件的第五个字段)
    • PASS_MIN_DAYS 0:密码修改间隔(shadow 文件的第四个字段)
    • PASS_MIN_LEN 5:密码最少 5 位(现在 PAM 生效,这个属性不生效了,要求最低 8 位)
    • PASS_WARN_AGE 7:密码到期警告(shadow 文件的第六个字段)
    • UID_MIN 500:最小和最大 UID 范围
    • GID_MAX 60000
    • ENCRYPT_METHOD SHA512:加密模式
    [root@core-pods-3 ~]# vi /etc/login.defs 
    MAIL_DIR        /var/spool/mail
    PASS_MAX_DAYS   99999
    PASS_MIN_DAYS   0
    PASS_MIN_LEN    5
    PASS_WARN_AGE   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
    UMASK           077
    USERGROUPS_ENAB yes
    ENCRYPT_METHOD SHA512
  3. 修改用户密码 passwd

    命令格式 # passwd [选项] 用户名 ,选项:

    • -S:查询用户密码的密码状态。仅 root 用户可用。
    • -l:暂时锁定用户。使该用户暂时不能登入,仅 root 用户可用。(其实是在 /etc/shadow 里密码前加了一个感叹号)
    • -u:解锁用户。仅 root 用户可用。
    • --stdin:可以通过管道符输出的数据作为用户的密码。
    [root@core-pods-3 ~]# passwd kkk
    Changing password for user kkk.
    New password: 
    BAD PASSWORD: The password is shorter than 8 characters
    Retype new password: 
    passwd: all authentication tokens updated successfully.
    [root@core-pods-3 ~]# passwd      # 不加用户名默认修改当前登录用户的密码
    Changing password for user root.
    New password: 
    [root@core-pods-3 ~]# passwd -S kkk   # 查看密码状态 (对比 shadow 看)
    # 用户名,密码设定时间,密码修改时间间隔,密码有效期,警告时间,密码不失效 - 1
    kkk PS 2022-08-08 0 99999 7 -1 (Password set, SHA512 crypt.)
    [root@core-pods-3 ~]# cat /etc/shadow | grep kkk
    kkk:$6$OLQqCgMg$wAAR686.a9PQs0gJDRiswjV5S.1sQ4oWS9Cum.owam9orBcZCfQjx6/UaaZHFnlh96wyfCZwF1RpjjRog60:19213:0:99999:7:::
    [root@core-pods-3 ~]# echo "123" | passwd --stdin kkk
    Changing password for user kkk.
    passwd: all authentication tokens updated successfully.
  4. 修改用户信息 usermod 和修改用户密码状态 chage

    命令 # usermod [选项] 用户名 ,选项:

    • -u UID:修改用户的 UID 号
    • -c 用户说明:修改用户的说明信息
    • -G 组名:修改用户的附加组
    • -L:临时锁定用户 lock
    • -U:解锁用户锁定 unlock

    命令 # chage [选项] 用户名 ,选项:

    • -l:列出用户的详细密码状态
    • -d 日期:修改密码最后一次更改日期(shadow 3 字段)
    • -m 天数:两次密码修改间隔(4 字段)
    • -M 天数:密码有效期(5 字段)
    • -W 天数:密码过期前警告天数(6 字段)
    • -I 天数:密码过期后宽限天数(7 字段)
    • -E 日期:账号失效时间(8 字段)
    [root@core-pods-3 ~]# chage -l kkk
    Last password change                                    : Aug 09, 2022
    Password expires                                        : never
    Password inactive                                       : never
    Account expires                                         : never
    Minimum number of days between password change          : 0
    Maximum number of days between password change          : 99999
    Number of days of warning before password expires       : 7
    [root@core-pods-3 ~]# chage -d 0 kkk
    # 这个命令其实是把密码修改日期归 0 了(shadow 第三字段),这样用户一登陆就要修改密码
    [root@core-pods-3 ~]# grep kkk /etc/shadow
    kkk:$6$9.3inrrJ$wSy.U1PsX6idF4J8KkDo7Uru5Q26hgEX3sY174jLdFphZG2FCi6cfCVON2eOMLSZ3JvgCE2i46vJMTDCcz.:0:0:99999:7:::
    ## 使用 kkk 登录直接让你改密码
    You are required to change your password immediately (root enforced)
    Warning: I am a policeman, will catch you!
    WARNING: Your password has expired.
    You must change your password now and login again!
    Changing password for user kkk.
    Changing password for kkk.
    (current) UNIX password:
  5. 删除用户 userdel 和用户切换命令 su

  • 删除用户 userdel: userdel [-r] 用户名 ,-r 意思是删除用户的同时删除用户家目录
  • 手工删除用户:
    [root@core-pods-3 ~]# vi /etc/passwd
    [root@core-pods-3 ~]# vi /etc/shadow
    [root@core-pods-3 ~]# vi /etc/group
    [root@core-pods-3 ~]# vi /etc/gshadow
    [root@core-pods-3 ~]# rm -rf /home/kkk
    [root@core-pods-3 ~]# rm -rf /var/spool/mail/kkk
  • 查看用户 ID: id 用户名
    [root@core-pods-3 ~]# id root
    uid=0(root) gid=0(root) groups=0(root)
    [root@core-pods-3 ~]# id kkk
    uid=550(kkk) gid=1016(kkk) groups=1016(kkk),0(root),1(bin)
    [root@core-pods-3 ~]#
  • 切换用户身份 su: su [选项] 用户名 ,选项
    • -:选项只使用 “-” 代表连带用户的环境变量一起切换
    • -c 命令:仅执行一次命令,而不切换用户身份
    [root@core-pods-3 ~]$ su - root
    [root@core-pods-3 ~]$ su - root -c "useradd user3"

# 用户组管理

  1. 添加用户组: groupadd [选项] 用户组名

    • g GID:指定组 ID
    [root@core-pods-3 ~]# groupadd tg
    [root@core-pods-3 ~]# vi /etc/group
  2. 修改用户组: groupmod [选项] 用户组名

    • g GID:修改组 ID
    • n 新组名:修改组名
    [root@core-pods-3 ~]# groupmod -n lampg tg
    [root@core-pods-3 ~]# vi /etc/group
  3. 删除用户组: groupdel 用户组名 ,删除时组里不能有初始用户,可以有附加用户

    [root@core-pods-3 ~]# groupadd tg
    [root@core-pods-3 ~]# useradd -g tg lamp
    [root@core-pods-3 ~]# useradd -G tg lamp1
    [root@core-pods-3 ~]# vi /etc/group
    [root@core-pods-3 ~]# groupdel tg
    groupdel: cannot remove the primary group of user 'lamp'
    [root@core-pods-3 ~]# userdel -r lamp
    [root@core-pods-3 ~]# groupdel tg
  4. 把用户添加入组或从组中删除: gpasswd [选项] 组名

    • -a 用户名:把用户加入组
    • -d 用户名:把用户从组中删除
    [root@core-pods-3 ~]# grep "Bella" /etc/passwd
    Bella1:x:1009:1009::/home/Bella1:/bin/bash
    Bella2:x:1010:1010::/home/Bella2:/bin/bash
    Bella3:x:1011:1011::/home/Bella3:/bin/bash
    Bella4:x:1012:1012::/home/Bella4:/bin/bash
    Bella5:x:1013:1013::/home/Bella5:/bin/bash
    [root@core-pods-3 ~]# grep "Bella" /etc/group
    Bella1:x:1009:
    Bella2:x:1010:
    Bella3:x:1011:
    Bella4:x:1012:
    Bella5:x:1013:
    [root@core-pods-3 ~]# gpasswd -a Bella1 root
    Adding user Bella1 to group root
    [root@core-pods-3 ~]# grep "Bella" /etc/group
    root:x:0:kkk,Bella1
    Bella1:x:1009:
    Bella2:x:1010:
    Bella3:x:1011:
    Bella4:x:1012:
    Bella5:x:1013:
    [root@core-pods-3 ~]# gpasswd -a Bella2 root
    Adding user Bella2 to group root
    [root@core-pods-3 ~]# grep "Bella" /etc/group
    root:x:0:kkk,Bella1,Bella2
    Bella1:x:1009:
    Bella2:x:1010:
    Bella3:x:1011:
    Bella4:x:1012:
    Bella5:x:1013:
    [root@core-pods-3 ~]# gpasswd -d Bella2 root
    Removing user Bella2 from group root
    [root@core-pods-3 ~]# grep "Bella" /etc/group
    root:x:0:kkk,Bella1
    Bella1:x:1009:
    Bella2:x:1010:
    Bella3:x:1011:
    Bella4:x:1012:
    Bella5:x:1013:
    [root@core-pods-3 ~]#