Linux权限管理详解:用户、组与文件权限

1. 用户和组的基本概念

1.1 用户

在Linux系统中,每个用户都有一个唯一的用户ID(UID):

  • root用户:UID为0,拥有最高权限
  • 系统用户:UID 1-999,用于系统服务
  • 普通用户:UID从1000开始

1.2 组

组是用户的集合,用于简化权限管理:

  • 主要组:用户创建文件时的默认所属组
  • 附加组:用户属于的额外组

2. 用户管理命令

2.1 useradd - 创建用户

# 基本用法
sudo useradd username

# 常用选项
sudo useradd -m -d /home/username -s /bin/bash -c "User Description" username
sudo useradd -u 1001 -g users -G wheel,developers username

# 选项说明:
# -m: 创建用户主目录
# -d: 指定主目录路径
# -s: 指定默认shell
# -u: 指定UID
# -g: 指定主要组
# -G: 指定附加组
# -c: 用户描述信息

2.2 usermod - 修改用户属性

# 修改用户组
sudo usermod -g newprimarygroup username
sudo usermod -aG additionalgroup username # -a追加,不覆盖原有组

# 修改用户shell
sudo usermod -s /bin/zsh username

# 修改用户主目录
sudo usermod -d /new/home/dir -m username

# 锁定和解锁用户
sudo usermod -L username # 锁定
sudo usermod -U username # 解锁

2.3 添加用户到指定用户组

# 将现有用户添加到附加组
sudo usermod -aG groupname username

# 创建新用户并直接添加到指定组
sudo useradd -G group1,group2,group3 username

# 验证用户所属组
groups username
id username

2.4 userdel - 删除用户

sudo userdel username        # 删除用户,保留主目录
sudo userdel -r username # 删除用户及主目录

2.5 passwd - 管理密码

sudo passwd username        # 设置用户密码
sudo passwd -l username # 锁定用户密码
sudo passwd -u username # 解锁用户密码

3. 组管理命令

3.1 查看所有用户组

# 查看系统所有组
cat /etc/group

# 使用getent查看组信息(包括LDAP等)
getent group

# 查看特定组信息
getent group groupname

# 查看当前用户所属组
groups
id -Gn

# 查看其他用户所属组
groups username
id -Gn username

# 统计系统组数量
getent group | wc -l

3.2 groupadd - 创建组

# 基本用法
sudo groupadd groupname

# 指定GID
sudo groupadd -g 1005 groupname

# 创建系统组
sudo groupadd -r systemgroup

# 选项说明:
# -g: 指定GID
# -r: 创建系统组(GID小于1000)
# -f: 如果组已存在则强制成功退出

3.3 groupmod - 修改组属性

sudo groupmod -n newgroupname oldgroupname  # 修改组名
sudo groupmod -g 1006 groupname # 修改GID

3.4 groupdel - 删除组

sudo groupdel groupname

3.5 组信息文件解析

# /etc/group 文件格式
# 组名:密码占位符:GID:组成员列表

# 示例:
wheel:x:10:user1,user2
developers:x:1001:alice,bob,charlie

# 组成员管理示例
sudo usermod -aG wheel user3 # 添加user3到wheel组
sudo gpasswd -d user3 wheel # 从wheel组移除user3

4. 文件权限管理

4.1 理解文件权限

Linux文件权限分为三组:

  • 所有者权限:文件所有者的权限
  • 组权限:文件所属组成员的权限
  • 其他用户权限:其他用户的权限

每种权限又分为:

  • r (read):读取权限(数字4)
  • w (write):写入权限(数字2)
  • x (execute):执行权限(数字1)

4.2 chmod - 修改文件权限

数字模式

# 语法:chmod [数字权限] 文件/目录
chmod 755 filename # rwxr-xr-x
chmod 644 filename # rw-r--r--
chmod 600 filename # rw-------

# 常用权限:
# 755: 所有者rwx,组和其他r-x
# 644: 所有者rw-,组和其他r--
# 700: 所有者rwx,组和其他---
# 777: 所有用户都有rwx权限(不推荐)

符号模式

# 语法:chmod [who][operator][permissions] 文件/目录

# 添加权限
chmod u+x script.sh # 给所有者添加执行权限
chmod g+w file.txt # 给组添加写权限
chmod o-r file.txt # 移除其他用户的读权限
chmod a+x script.sh # 给所有用户添加执行权限

# 设置具体权限
chmod u=rwx,g=rx,o= file.txt

4.3 chown - 修改文件所有者和组

# 修改所有者
sudo chown username filename

# 修改所有者和组
sudo chown username:groupname filename

# 递归修改目录及其内容
sudo chown -R username:groupname directory/

# 只修改组
sudo chown :groupname filename

4.4 chgrp - 修改文件所属组

chgrp groupname filename
chgrp -R groupname directory/ # 递归修改

5. 特殊权限

5.1 SetUID (Set User ID)

# 设置SetUID权限
chmod u+s filename
chmod 4755 filename # 数字表示法

# 移除SetUID权限
chmod u-s filename

5.2 SetGID (Set Group ID)

# 设置SetGID权限
chmod g+s filename
chmod 2755 filename # 数字表示法

# 对目录设置SetGID,新创建的文件将继承目录的组
chmod g+s directory/

5.3 Sticky Bit

# 设置Sticky Bit(常用于/tmp目录)
chmod +t directory
chmod 1777 directory # 数字表示法

6. 权限查看和验证

6.1 ls -l 输出详解

$ ls -l
-rwxr-xr-x 1 user group 1234 Jan 1 10:00 script.sh
drwxr-xr-x 2 user group 4096 Jan 1 10:00 directory/

权限字段解释:

  • 第1位:文件类型(-普通文件,d目录,l链接)
  • 2-4位:所有者权限
  • 5-7位:组权限
  • 8-10位:其他用户权限

6.2 查看用户和组信息

id username          # 查看用户UID、GID和所属组
whoami # 查看当前用户
groups username # 查看用户所属组
getent group # 查看所有组
getent group groupname # 查看特定组信息

7. 实践案例

案例1:完整的用户和组管理流程

# 1. 查看现有组
getent group | tail -10

# 2. 创建新的用户组
sudo groupadd developers
sudo groupadd -g 2001 managers

# 3. 验证组创建
getent group developers
getent group managers

# 4. 创建用户并添加到组
sudo useradd -m -G developers,managers alice
sudo useradd -m -G developers bob

# 5. 为现有用户添加附加组
sudo usermod -aG managers charlie

# 6. 验证用户组关系
groups alice
groups bob
groups charlie

# 7. 创建项目目录并设置权限
sudo mkdir -p /opt/project{1,2}
sudo chown root:developers /opt/project1
sudo chown root:managers /opt/project2
sudo chmod 2775 /opt/project1 /opt/project2 # SetGID确保继承组权限

# 8. 验证设置
ls -ld /opt/project*

案例2:团队协作目录设置

# 创建团队组和目录
sudo groupadd teamalpha
sudo mkdir /shared/teamalpha

# 设置目录权限
sudo chown root:teamalpha /shared/teamalpha
sudo chmod 2770 /shared/teamalpha # SetGID + 组读写权限

# 添加团队成员
sudo usermod -aG teamalpha user1
sudo usermod -aG teamalpha user2
sudo usermod -aG teamalpha user3

# 验证权限
sudo -u user1 touch /shared/teamalpha/test.txt
ls -l /shared/teamalpha/test.txt # 文件应继承teamalpha组

案例3:安全的脚本管理

# 创建管理脚本
echo '#!/bin/bash\necho "System maintenance"' > /usr/local/bin/maintenance.sh

# 设置安全权限
sudo chown root:root /usr/local/bin/maintenance.sh
sudo chmod 755 /usr/local/bin/maintenance.sh

# 如果需要普通用户执行特权操作,可设置SetUID(谨慎使用)
sudo chmod 4755 /usr/local/bin/maintenance.sh

8. 组管理高级技巧

8.1 使用gpasswd管理组

# 设置组管理员
sudo gpasswd -A username groupname

# 添加用户到组
sudo gpasswd -a username groupname

# 从组中移除用户
sudo gpasswd -d username groupname

# 设置组密码
sudo gpasswd groupname

8.2 批量用户组管理

# 批量添加用户到组
for user in user1 user2 user3; do
sudo usermod -aG developers $user
done

# 从文件中读取用户名添加到组
while IFS= read -r username; do
sudo usermod -aG projectteam "$username"
done < userlist.txt

9. 最佳实践

  1. 最小权限原则:只授予必要的权限
  2. 定期审计:定期检查用户和权限设置
  3. 使用组管理:通过组来管理权限,而不是直接对用户授权
  4. 谨慎使用特殊权限:SetUID和SetGID可能带来安全风险
  5. 保护敏感文件:关键配置文件应设置为600或640权限
  6. 合理规划组结构:根据组织结构设计用户组
  7. 文档记录:记录用户组关系和权限分配

10. 故障排查

10.1 常见问题解决

# 用户无法访问文件
# 检查用户所属组
groups username

# 检查文件权限
ls -l filename

# 检查目录权限
ls -ld directoryname

# 用户不在正确的组中
sudo usermod -aG requiredgroup username

# 重新登录使组变更生效
newgrp groupname

10.2 权限检查清单

# 完整的权限检查流程
1. whoami # 当前用户
2. groups # 当前用户所属组
3. ls -l filename # 文件权限
4. ls -ld directory # 目录权限
5. getent group groupname # 组信息验证

11. 总结

Linux权限管理系统提供了灵活而强大的访问控制机制。通过合理使用用户、组和文件权限,可以有效保护系统安全。掌握用户组管理、权限设置和相关命令的使用,是每个Linux系统管理员和开发者的必备技能。

记住,良好的权限管理习惯是系统安全的第一道防线。在实际操作中,始终遵循最小权限原则,定期审查权限设置,确保系统的安全性和稳定性。