在Linux系统中,用户和用户组管理是系统管理员必须掌握的核心技能。理解这些概念对于服务器运维、权限控制和系统安全都至关重要。让我们先理清几个基本概念。
Linux系统中的用户主要分为三类:
root用户:这是系统的超级管理员账户,UID(用户ID)固定为0。root拥有对系统的完全控制权,可以执行任何操作,包括修改系统文件、安装软件、管理所有用户等。由于权限过大,日常操作中应尽量避免直接使用root账户。
系统用户:这类用户的UID范围通常是1-999,是专门为系统服务和进程创建的账户。比如nginx、mysql等服务运行时都会使用特定的系统用户。这些用户通常没有交互式登录权限,也不会有家目录。
普通用户:UID从1000开始分配,是我们日常使用的账户。这类用户的权限受到限制,只能访问自己的文件和被授权的系统资源。普通用户可以通过sudo命令临时获取更高权限。
用户组是Linux权限管理的重要机制,它允许我们将多个用户组织在一起,统一分配权限。用户组主要分为两类:
主组(Primary Group):
附加组(Supplementary Group):
Linux系统中与用户和组相关的核心配置文件有四个:
/etc/passwd:存储用户基本信息
用户名:密码占位符:UID:主组GID:注释:家目录:登录Shelltom:x:1000:1000::/home/tom:/bin/bash/etc/group:存储组信息
组名:密码占位符:GID:附加组成员列表dev:x:1001:tom,jerry/etc/shadow:存储用户加密密码
/etc/gshadow:存储组加密密码
bash复制# 创建用户tom,系统会自动创建同名主组
useradd tom
# 验证用户信息
id tom
输出示例:
code复制uid=1000(tom) gid=1000(tom) groups=1000(tom)
这里系统自动创建了tom用户和tom组,并将tom组设置为tom用户的主组。
bash复制# 先创建dev组
groupadd dev
# 创建用户jerry并指定dev为主组
useradd -g dev jerry
# 验证信息
id jerry
输出示例:
code复制uid=1001(jerry) gid=1001(dev) groups=1001(dev)
注意:指定的主组必须已存在,否则会报错。
bash复制# 创建系统组
groupadd -r sysgroup
# 创建系统用户
useradd -r -g sysgroup -s /sbin/nologin -M sysuser
# 验证信息
id sysuser
输出示例:
code复制uid=999(sysuser) gid=999(sysgroup) groups=999(sysgroup)
系统用户的特点:
bash复制# 创建test组
groupadd test
# 将tom用户添加到test附加组
usermod -aG test tom
# 验证
id tom
输出示例:
code复制uid=1000(tom) gid=1000(tom) groups=1000(tom),1002(test)
关键点:
bash复制# 将tom从test组移除
gpasswd -d tom test
# 验证
id tom
输出示例:
code复制uid=1000(tom) gid=1000(tom) groups=1000(tom)
推荐使用gpasswd命令而不是usermod,因为gpasswd只会移除指定的附加组,而不会影响其他附加组。
bash复制# 修改组名
groupmod -n newgroup oldgroup
# 修改GID
groupmod -g 1005 groupname
注意:修改GID时要确保新GID未被其他组使用。
查看用户组信息的常用命令:
id命令:最全面的用户信息查看工具
bash复制id username
输出示例:
code复制uid=1000(tom) gid=1000(tom) groups=1000(tom),1002(test)
groups命令:仅显示组名
bash复制groups tom
输出示例:
code复制tom : tom test
查看/etc/group文件
bash复制cat /etc/group | grep groupname
查看用户主组
bash复制id -gn username
查看所有组(主组+附加组)
bash复制id -Gn username
主组和附加组在权限管理上的核心区别:
文件创建:用户创建新文件时,默认的所属组是其主组,而不是附加组。
权限继承:用户对文件/目录的访问权限取决于:
特殊权限:
让我们通过一个实际案例来理解组权限的应用:
bash复制# 创建测试目录
mkdir /opt/project
# 设置所有者和所属组
chown tom:dev /opt/project
# 设置权限:所有者rwx,组rx,其他无权限
chmod 750 /opt/project
# 将jerry加入dev组
usermod -aG dev jerry
# 测试jerry的访问权限
su - jerry -c "ls /opt/project" # 应该成功
su - jerry -c "touch /opt/project/testfile" # 应该失败,因为组权限没有w
# 修改目录权限为770
chmod 770 /opt/project
# 再次测试
su - jerry -c "touch /opt/project/testfile" # 现在应该成功
# 查看新建文件的属性
ls -l /opt/project/testfile
输出示例:
code复制-rw-r--r-- 1 jerry dev 0 Jan 22 10:00 /opt/project/testfile
关键观察点:
bash复制# 设置SGID位
chmod g+s /opt/project
# 现在在此目录下创建的文件将继承目录的所属组
su - jerry -c "touch /opt/project/sgidfile"
ls -l /opt/project/sgidfile
输出示例:
code复制-rw-r--r-- 1 jerry dev 0 Jan 22 10:05 /opt/project/sgidfile
可以看到,虽然jerry的主组不是dev,但因为目录设置了SGID位,新建文件的所属组变成了dev。
bash复制# 设置Sticky位(常用于/tmp目录)
chmod +t /opt/project
# 查看权限
ls -ld /opt/project
输出示例:
code复制drwxrwsr-t 2 tom dev 4096 Jan 22 10:05 /opt/project
Sticky位的作用是:即使目录对所有用户可写,用户也只能删除自己创建的文件,不能删除其他用户的文件。
问题1:使用usermod -G时不小心清除了用户的所有附加组
原因:没有使用-a参数,导致-G参数覆盖了原有附加组
解决方案:
问题2:用户无法访问应该有权访问的文件
排查步骤:
问题3:新建文件的所属组不符合预期
可能原因:
解决方案:
权限最小化原则:只给用户必要的权限,避免过度授权
组命名规范:建立统一的组命名规范,如:
定期审计:定期检查用户和组配置,清理不再使用的账户和组
使用sudo代替root:避免直接使用root账户,通过sudo授权特定命令
家目录权限:设置严格的默认家目录权限(通常为750)
批量添加用户到组:
bash复制for user in user1 user2 user3; do
usermod -aG groupname $user
done
批量修改用户属性:
bash复制# 批量禁用用户
for user in user1 user2; do
usermod -L $user
done
# 批量设置密码过期
for user in user1 user2; do
chage -d 0 $user
done
批量创建用户:
bash复制# 从文件读取用户名列表
while read username; do
useradd -m $username
echo "$username:初始密码" | chpasswd
chage -d 0 $username # 强制首次登录修改密码
done < userlist.txt
| 特性 | 主组 | 附加组 |
|---|---|---|
| 数量 | 每个用户1个 | 每个用户多个 |
| 创建方式 | useradd自动创建或-g指定 | 手动添加 |
| 记录位置 | /etc/passwd | /etc/group |
| 文件默认组 | 决定新建文件的默认组 | 不影响 |
| 权限作用 | 提供基础组权限 | 扩展权限范围 |
| 操作 | 命令 | 备注 |
|---|---|---|
| 创建用户 | useradd [选项] 用户名 | |
| 创建组 | groupadd [选项] 组名 | |
| 添加附加组 | usermod -aG 组名 用户名 | 推荐 |
| 移除附加组 | gpasswd -d 用户名 组名 | 推荐 |
| 修改主组 | usermod -g 组名 用户名 | |
| 查看用户信息 | id 用户名 | |
| 查看组信息 | getent group 组名 | |
| 设置目录SGID | chmod g+s 目录 | |
| 设置Sticky位 | chmod +t 目录 |
权限继承原则:用户对文件的访问权限由所有者权限、组权限和其他权限共同决定
最小权限原则:只授予必要的最小权限
组权限范围:只要用户在文件所属组中(无论是主组还是附加组),就能获得该组的权限
目录访问前提:目录必须有x权限才能访问其中的内容
文件创建规则:新建文件的所属组默认是用户的主组,除非目录设置了SGID位
在实际运维工作中,我发现很多权限问题都源于对主组和附加组理解不够深入。特别是当需要精细控制多用户对共享目录的访问时,合理设置组权限和SGID位可以大大简化管理工作。另外,定期审计用户和组配置也是保持系统安全的重要措施。