Linux 用户与组管理

1. Linux 的用户与群组

在 Linux 中,用户和群组是用于管理系统访问权限和资源分配的重要概念。

1.1. 用户(User)

  • 定义:用户是指能够访问系统资源的实体,每个用户在系统中都有一个唯一的用户名和用户标识符(UID)。
    • UID(User Identifier,用户标识符)是用于唯一标识用户的数字。通常,系统中的 root 用户(超级用户)的 UID 为 0,普通用户的 UID 从 1000 或其他指定的数字开始依次递增。1~999 通常为系统用户,用来运行系统自带的进程或安装的应用程序。
  • 作用:用户定义了谁可以访问系统资源、执行哪些操作以及如何管理系统。这是Linux系统安全性和多用户环境的基础。
    • 用户拥有自己的主目录,用于存储个人文件和配置。
    • 用户被赋予特定的权限,以执行各种操作,如读取、写入和执行文件和目录。
  • 在Linux系统中用户分为管理员用户和其他用户,管理员用户拥有最高权限。
    • 管理员用户通常指的是 root 用户。其UID和GID均为0,root用户在每台unix/linux操作系统中都是唯一且真实存在的,通过它可以登录系统,可以操作系统中任何文件和命令,拥有最高的管理权限。
    • 由于 root 用户的权限极大,因此在日常使用中,为了避免误操作导致系统故障或安全问题,一般不建议直接以 root 用户身份进行常规操作,而是在必要时通过 sudo 命令临时获取超级用户权限来执行特定的高权限任务。

1.2. 群组(Group)

  • 定义:群组是用户的集合,每个群组都有一个唯一的群组名和与之相关联的群组标识符(GID)。
    • GID(Group Identifier,群组标识符)是用于唯一标识群组的数字。
  • 作用:可以将文件和目录的访问权限分配给群组,以便属于该群组的用户能够共享对特定资源的访问。

用户可以属于一个或多个群组。通过将用户分配到不同的群组,并为群组设置适当的权限,可以方便地管理对系统资源的访问和控制。

例如,一个项目团队的成员可以属于同一个群组,以便他们能够共同访问和修改与项目相关的文件和目录。

2. Linux 用户与组相关文件

2.1. 用户与密码相关文件

  • /etc/passwd:用于存储系统用户的基本信息。
sudo cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
# 各字段以":"为分隔符
# 第一字段:用户名(也被称为登录名)。
# 第二字段:密码,在例子中我们看到的是一个x,其实密码已被映射到/etc/shadow文件中。
# 第三字段:UID(用户ID)。
# 第四字段:GID(组ID)。
# 第五字段:用户的描述性信息,如用户全名、办公室号码、工作电话等。
# 第六字段:用户登录后的主目录路径。
# 第七字段:用户登录系统时使用的默认shell。
Bash
  • /etc/shadow:用于存储用户密码及相关的密码属性信息。
sudo cat /etc/shadow
root:$6$VMKqnxRPUbwoXVpB$nKJ4o0H8jy.rlJv8p5kauoymt/j/HTC17K1U3TV0Ya770/.HK2pxGE2ikdW1khlOlme.zWWc01OB/.OIz5pyd0::0:99999:7:::
bin:*:19469:0:99999:7:::
...
# 各字段以":"为分隔符
# 第一字段:与 /etc/passwd 中的用户名对应,用来标识用户。
# 第二字段:用户密码的加密(哈希)后的字符串,或者指示符,! 或 *:表示用户账户被锁定,没有有效的密码。
# 第三字段:自1970年1月1日以来到上次修改密码为止的天数。
# 第四字段:限制两次密码更改之间的最小天数。如果比这个时间短,用户则不能更改密码。
# 第五字段:密码的最大有效天数。超过这个天数,用户需要更改密码。
# 第六字段:密码到期前的警告天数。用户在这些天内,每次登录时会收到需要更改密码的提醒。
# 第七字段:密码到期后账户在锁定前的非活动天数。过了这个时间,账户将被锁定。
# 第八字段:自1970年1月1日以来到账户过期为止的天数。超过这个日期,账户将被彻底禁用。
# 第九字段:目前未使用,可留作将来用途或定制需求。
Bash

2.2. 组与组密码相关文件

  • /etc/group:用于存储系统中组的相关信息。
sudo cat /etc/group
root:x:0:
...
# 各字段以":"为分隔符
# 第一字段:组的名称。
# 第二字段:组密码字段,通常为空或被设置为x。
# 第三字段:GID(组ID)。
# 第四字段:属于该组的用户列表,以逗号分隔。
Bash
  • /etc/gshadow:用于存储有关系统中组的密码及管理信息。
sudo cat /etc/gshadow
root:::
...
# 各字段以":"为分隔符
# 第一字段:组的名称。
# 第二字段:该组的加密密码如果为空,表示该组没有密码。如果为 !,表示该组被禁用。
# 第三字段:可以对该组进行管理的用户,以逗号分隔。
# 第四字段:组成员列表,以逗号分隔。
Bash

3. 用户管理命令

3.1. 查看用户

# 查看当前用户
[root@anonymous ~]# id 
uid=0(root) gid=0(root) groups=0(root)
# 查看root用户
[root@anonymous ~]# id root  
uid=0(root) gid=0(root) groups=0(root)
# 查看当前用户是谁
[root@anonymous ~]# whoami  
root
# 查看所有登录的用户
[root@anonymous ~]# who  
root    pts/0        2024-06-25 09:34 (182.134.69.138)
...
Bash

3.2. 创建用户

# 创建用户
# 当创建一个用户时,如果没有指定用户属组将会自动创建一个用户同名的组作为用户的组
sudo useradd user1 

# useradd命令的常用选项
# –u:指定用户的UID
sudo useradd user02 -u 503  
# –g:指定用户所属的组
sudo useradd user03 -g root
# –G:指定用户所属的附加组,组名用逗号隔开
sudo useradd user04 -G bin,daemon
# –d:指定用户的主目录
sudo useradd user05 -d /aaa
# -M:创建用户,不创建主目录
sudo useradd user06 -M 
# –c:指定用户的备注信息
sudo useradd user07 -c "John Doe" 
# –s:指定用户所用的shell
sudo useradd user08 -s /bin/bash
# -e:设置账户过期日期,格式为YYYY-MM-DD
sudo useradd user09 -e 2025-04-01
# -r: 创建系统账户,uid处于系统用户范围内
sudo useradd -r sysuser


# 补充:useradd创建用户时,对于未指定的选项(-u、-g等等),会以/etc/login.defs、/etc/default/useradd两个配置文件中的配置作为参照物
 
# 配置文件/etc/login.defs详解
[root@anonymous ~]# grep -Ev "^#|^$" /etc/login.defs
MAIL_DIR /var/spool/mail   # 存放用户邮件文件的目录
UMASK 022                  # 新建文件的默认权限值是 755(即 0777 - 022 = 0755),表示所有者可以读写执行,而组和其他人只能读和执行
HOME_MODE 0700             # 新用户的主目录的权限设置为 0700,表示只有用户自己可以读写执行,其他人无法访问
PASS_MAX_DAYS 99999        # 密码最大有效期
PASS_MIN_DAYS 0            # 两次修改密码的最小间隔时间
PASS_MIN_LEN 5             # 密码最小长度,对于root无效
PASS_WARN_AGE 7            # 密码过期前多少天开始提示
UID_MIN 1000               # 用户ID的最小值
UID_MAX 60000              # 用户ID的最大值
SYS_UID_MIN 201            # 系统用户ID的最小值
SYS_UID_MAX 999            # 系统用户ID的最大值
GID_MIN 1000               # 组ID的最小值
GID_MAX 60000              # 组ID的最大值
SYS_GID_MIN 201            # 系统用户组ID的最小值
SYS_GID_MAX 999            # 系统用户组ID的最大值
CREATE_HOME yes            # 是否为新用户创建主目录
USERGROUPS_ENAB yes        # 如果设置为 yes,每个新用户将拥有一个与用户名相同的默认组,且GID与用户的UID相同
ENCRYPT_METHOD SHA512      # 密码加密规则

# 配置文件/etc/default/useradd详解
[root@anonymous ~]# cat /etc/default/useradd
GROUP=100              # 依赖于/etc/login.defs的USERGRUUPS_ENAB参数,如果为no,则在此处控制
HOME=/home             # 把用户的家目录建在/home中
INACTIVE=-1            # 用户密码过期后不会自动禁用账户
EXPIRE=                # 用户账户过期日期,不设置表示不启用
SHELL=/bin/bash        # 新用户的默认登录 shell类型
SKEL=/etc/skel         # 初始化新用户主目录时,会复制 /etc/skel 目录的内容
CREATE_MAIL_SPOOL=yes  # 创建mail文件
 
 
# 补充:当使用useradd创建用户时,创建的用户家目录下会存在.bash_* 环境变量相关的文件,这些环境变量文件默认从/etc/skel目录中拷贝。这个默认拷贝环境变量位置是由/etc/default/useradd配置文件中SKEL=/etc/skel定义的。
 
# 故障案例,在当前用户家目录下执行了rm -rf .*命令,下次登录系统时出现-bash-4.1$,如何解决!
-bash-4.1$ cp -a /etc/skel/.bash* ./
-bash-4.1$ exit  # 退出后重新登录即可
Bash

3.3. 修改用户

# 修改用户信息
# usermod参数同useradd参数基本一致,useradd是创建而usermod是修改
# –u:修改指定用户的UID
sudo usermod user1 -u 1111
# –g:修改指定用户所属的组
sudo usermod user1 -g root
# –G:指定用户所属的附加组,组名用逗号隔开,此选项会覆盖原有的附加组
sudo usermod user1 -G bin,daemon
sudo usermod user1 -a -G bin,daemon  # 添加-a表示不覆盖,在原有附加组基础上新添加附加组
# –d:修改指定用户的主目录但不移动文件
sudo usermod user1 -d /aaa
sudo usermod user1 -m -d /aaa  # 添加-m表示移动文件
# –c:修改指定用户的备注信息
sudo usermod user1 -c "John Doe"
# –s:修改指定用户所用的shell
sudo usermod user1 -s /sbin/nologin
# -e:修改账户过期日期,格式为YYYY-MM-DD
sudo usermod user1 -e 2025-02-11 user1000 
# -l:修改用户的登陆名
sudo usermod user1 -l user2
# -L:锁定用户
sudo usermod -L user2
# -U:解锁用户
sudo usermod -U user2
Bash

3.4. 删除用户

# 删除用户user2,但不删除用户家目录和mail、
sudo userdel user2
# 彻底删除用户
sudo userdel -r user2  
Bash

3.5. 设定和修改密码

passwd  # 默认给当前用户设定密码
passwd 用户名  # root用户可以给自己以及所有其他用户设定密码,普通用户只能设定自己的密码
echo "密码" | passwd --stdin 用户名  # 非交互式
 
# 补充:可以利用系统内置变量生成随机字符串来充当密码
echo $RANDOM|md5sum|cut -c 1-10
70ba11a74b
Bash

4. 组管理命令

4.1. 创建组

sudo groupadd gg1  # 创建基本组, 不指定gid
tail -1 /etc/group
gg1:x:2005:

sudo groupadd -g 5555 gg2  # 创建基本组, 指定gid为5555
tail -1 /etc/group
gg2:x:5555:

groupadd -r gg3  # 创建系统组,gid从201-999
tail -1 /etc/group
gg3:x:991:
Bash

4.2. 修改组

sudo groupmod gg3 -g 1111   # 修改组ID(gid)
tail -1 /etc/group
gg3:x:1111:

# -n:修改组名称
sudo groupmod gg3 -n new_gg3 
tail -1 /etc/group
new_gg3:x:1111:
Bash

4.3. 删除组

# 如果一个组是一个用户的主组,那么该组不能被删除,删掉用户会默认一起删掉他的主组
# 示例:
[root@anonymous ~]# useradd user11
[root@anonymous ~]# groupadd devops
[root@anonymous ~]# usermod -G devops user11
[root@anonymous ~]# id user11
uid=1112(user11) gid=1112(user11) groups=1112(user11),1113(devops)
[root@anonymous ~]# groupdel devops  # 附加组可以删除
[root@anonymous ~]# id user11
uid=1112(user11) gid=1112(user11) groups=1112(user11)
[root@anonymous ~]# groupdel user11  # 无法删除组 user11,因为组 user11 属于 user11 用户的主组
groupdel: cannot remove the primary group of user 'user11'
Bash

4.4. 为组设置密码

为组设置密码可以然非组成员用户通过 newgrp 命令临时切换到该组内,获取该组权限

# 示例:
[root@anonymous ~]# groupadd group1
[root@anonymous ~]# gpasswd group1
Changing the password for group group1
New Password: 
Re-enter new password: 
[root@anonymous ~]# touch /tmp/a.txt
[root@anonymous ~]# ll /tmp/a.txt 
-rw-r--r--. 1 root root 0 Jun 27 12:28 /tmp/a.txt
[root@anonymous ~]# chown :group1 /tmp/a.txt 
[root@anonymous ~]# ll /tmp/a.txt 
-rw-r--r--. 1 root group1 0 Jun 27 12:28 /tmp/a.txt
[root@anonymous ~]# chmod g+w /tmp/a.txt 
[root@anonymous ~]# ll /tmp/a.txt 
-rw-rw-r--. 1 root group1 0 Jun 27 12:28 /tmp/a.txt
[root@anonymous ~]# su - user2
Last login: Thu Jun 27 12:37:23 CST 2024 on pts/1
[user2@anonymous ~]$ echo 123 >> /tmp/a.txt 
-bash: /tmp/a.txt: Permission denied
[user2@anonymous ~]$ newgrp group1
Password: 
[user2@anonymous ~]$ echo 123 >> /tmp/a.txt 
[user2@anonymous ~]$ cat /tmp/a.txt 
123
Bash