在 Linux 系统中,用户分为三种主要类型:
root 用户:系统超级管理员,拥有最高权限,UID 为 0系统用户:用于运行系统服务,UID 范围 1-999普通用户:日常使用的用户账户,UID 从 1000 开始Linux 用户信息存储在以下几个关键配置文件中:
# 查看用户配置文件
cat /etc/passwd
cat /etc/shadow
cat /etc/group
cat /etc/gshadow
# 查看 passwd 文件内容
cat /etc/passwd
# 示例输出的一行解析:
# username:x:1000:1000:User Name:/home/username:/bin/bash
# 字段说明:
# 1. username: 用户名
# 2. x: 密码占位符(实际密码在 /etc/shadow)
# 3. 1000: 用户ID (UID)
# 4. 1000: 主要组ID (GID)
# 5. User Name: 用户全名或描述
# 6. /home/username: 用户家目录
# 7. /bin/bash: 默认shell
# 查看 shadow 文件(需要root权限)
sudo cat /etc/shadow
# 示例输出的一行解析:
# username:$6$rounds=5000$salt$hashed_password:18000:0:99999:7:::
# 字段说明:
# 1. username: 用户名
# 2. 加密的密码
# 3. 最后一次密码修改时间(从1970-1-1开始的天数)
# 4. 密码最小使用天数
# 5. 密码最大使用天数
# 6. 密码过期前警告天数
# 7. 密码过期后账户宽限天数
# 8. 账户失效日期
# 9. 保留字段
# 创建基本用户
sudo useradd -m -c "John Doe" johndoe
# 参数详解:
# -m: 创建用户家目录
# -c: 用户全名或描述信息
# 创建用户时指定详细信息
sudo useradd -m -d /home/john -s /bin/bash -c "John Smith" -u 1500 -g users johnsmith
# 设置用户密码
sudo passwd johndoe
# 系统会提示输入两次密码进行确认
# 验证用户创建
id johndoe
# 输出示例:uid=1001(johndoe) gid=1001(johndoe) groups=1001(johndoe)
# 查看用户家目录
ls -la /home/johndoe/
# 修改用户注释信息
sudo usermod -c "John Doe - Developer" johndoe
# 修改用户家目录
sudo usermod -d /home/new_john -m johndoe
# 修改用户默认shell
sudo usermod -s /bin/zsh johndoe
# 修改用户UID
sudo usermod -u 1501 johndoe
# 锁定用户账户
sudo usermod -L johndoe
# 解锁用户账户
sudo usermod -U johndoe
# 验证修改
grep johndoe /etc/passwd
# 删除用户但保留家目录
sudo userdel johndoe
# 删除用户同时删除家目录
sudo userdel -r johndoe
# 强制删除正在登录的用户
sudo userdel -f -r johndoe
# 验证删除
id johndoe
# 应该显示:id: 'johndoe': no such user
# 创建新用户组
sudo groupadd developers
sudo groupadd -g 2000 admins # 指定GID
# 修改用户组
sudo groupmod -n devs developers # 重命名组
sudo groupmod -g 2001 devs # 修改GID
# 删除用户组
sudo groupdel devs
# 将用户添加到附加组
sudo usermod -aG sudo johndoe # 添加到sudo组
sudo usermod -aG developers johndoe
# 查看用户所属组
groups johndoe
id johndoe
# 从组中移除用户
sudo gpasswd -d johndoe developers
# 设置组管理员
sudo gpasswd -A johndoe developers
# 查看所有组
cat /etc/group
# 查看文件详细权限
ls -l filename
# 输出示例:-rwxr-xr-- 1 owner group 1234 Dec 5 10:30 filename
# 权限字段分解:
# 第1位:文件类型 (- 普通文件, d 目录, l 链接等)
# 第2-4位:所有者权限 (rwx)
# 第5-7位:所属组权限 (r-x)
# 第8-10位:其他用户权限 (r--)
# 权限字符含义:
# r = 读权限 (4)
# w = 写权限 (2)
# x = 执行权限 (1)
# - = 无权限 (0)
# 使用数字模式设置权限
sudo chmod 755 filename # rwxr-xr-x
sudo chmod 644 filename # rw-r--r--
sudo chmod 750 directory/ # rwxr-x---
# 使用符号模式设置权限
sudo chmod u+x script.sh # 给所有者添加执行权限
sudo chmod g-w filename # 移除组的写权限
sudo chmod o=r filename # 设置其他用户只有读权限
sudo chmod a+x script.sh # 给所有用户添加执行权限
# 递归修改目录权限
sudo chmod -R 755 /path/to/directory/
# 修改文件所有者
sudo chown johndoe filename
sudo chown johndoe:developers filename # 同时修改所有者和组
# 递归修改目录所有者
sudo chown -R johndoe:developers /path/to/directory/
# 仅修改文件所属组
sudo chgrp developers filename
sudo chgrp -R developers /path/to/directory/
# 设置特殊权限
sudo chmod +t /shared/directory/ # 设置粘滞位
sudo chmod u+s /usr/bin/program # 设置SUID
sudo chmod g+s /shared/group/dir/ # 设置SGID
# 创建测试环境
mkdir -p /tmp/permission_test
cd /tmp/permission_test
# 创建测试文件
echo "This is a test file" > test_file.txt
# 测试不同权限设置
echo "=== 当前权限 ==="
ls -l test_file.txt
echo "=== 移除所有权限 ==="
chmod 000 test_file.txt
ls -l test_file.txt
cat test_file.txt # 应该显示权限被拒绝
echo "=== 仅设置读权限 ==="
chmod 444 test_file.txt
ls -l test_file.txt
cat test_file.txt # 应该可以读取
echo "test" >> test_file.txt # 应该显示权限被拒绝
echo "=== 设置读写权限 ==="
chmod 644 test_file.txt
ls -l test_file.txt
echo "new content" >> test_file.txt # 应该可以写入
cat test_file.txt
# 清理测试文件
cd ..
rm -rf permission_test
# SUID (Set User ID) 示例
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root ... /usr/bin/passwd
# 这里的 's' 就是 SUID 位
# 设置 SUID
sudo chmod u+s /path/to/program
# 或使用数字模式:chmod 4755 /path/to/program
# SGID (Set Group ID) 示例
# 设置 SGID
sudo chmod g+s /path/to/directory/
# 或使用数字模式:chmod 2755 /path/to/directory/
# 粘滞位 (Sticky Bit) 示例
ls -ld /tmp
# 输出:drwxrwxrwt ... /tmp
# 这里的 't' 就是粘滞位
# 设置粘滞位
sudo chmod +t /shared/directory/
# 或使用数字模式:chmod 1755 /shared/directory/
# 查看当前 umask 设置
umask
# 输出示例:0022
# 设置 umask
umask 0027 # 更严格的权限
# 计算文件默认权限
# 目录最大权限:777
# 文件最大权限:666
# 实际权限 = 最大权限 - umask
# 示例计算:
# umask 0022
# 目录权限:777 - 022 = 755 (rwxr-xr-x)
# 文件权限:666 - 022 = 644 (rw-r--r--)
# 永久设置 umask
echo "umask 0027" >> ~/.bashrc
source ~/.bashrc

# 检查系统是否支持 ACL
mount | grep acl
# 如果支持,应该看到相关文件系统有 acl 选项
# 安装 ACL 工具(如未安装)
sudo apt-get install acl # Ubuntu/Debian
sudo yum install acl # CentOS/RHEL
# 查看文件的 ACL
getfacl filename
getfacl directory/
# 设置用户 ACL
setfacl -m u:johndoe:rwx filename # 给 johndoe 用户 rwx 权限
setfacl -m u:1001:r-- filename # 通过 UID 设置权限
# 设置组 ACL
setfacl -m g:developers:rwx filename # 给 developers 组 rwx 权限
setfacl -m g:2001:r-x directory/ # 通过 GID 设置权限
# 设置掩码 (mask)
setfacl -m m::r-x filename # 设置最大有效权限为 r-x
# 递归设置 ACL
setfacl -R -m u:johndoe:rwx /path/to/directory/
# 设置默认 ACL(对新创建的文件生效)
setfacl -d -m u:johndoe:rwx directory/ # 设置默认用户 ACL
setfacl -d -m g:developers:rw directory/ # 设置默认组 ACL
# 删除特定 ACL
setfacl -x u:johndoe filename # 删除 johndoe 用户的 ACL
setfacl -x g:developers directory/ # 删除 developers 组的 ACL
# 删除所有 ACL
setfacl -b filename # 删除所有扩展 ACL
# ACL 权限验证示例
echo "=== 创建测试环境 ==="
mkdir -p /tmp/acl_test
cd /tmp/acl_test
echo "创建测试文件"
echo "ACL test content" > acl_file.txt
echo "=== 设置前 ACL ==="
getfacl acl_file.txt
echo "=== 设置用户 ACL ==="
setfacl -m u:johndoe:rw acl_file.txt
getfacl acl_file.txt
echo "=== 设置组 ACL ==="
setfacl -m g:developers:r acl_file.txt
getfacl acl_file.txt
echo "=== 设置默认 ACL ==="
setfacl -d -m u:johndoe:rw .
getfacl .
echo "=== 创建新文件验证默认 ACL ==="
touch new_file.txt
getfacl new_file.txt
# 清理
cd /tmp
rm -rf acl_test
# 案例背景:开发团队需要共享项目目录
# 团队成员:alice (开发), bob (开发), charlie (测试)
# 步骤1:创建用户和组
echo "=== 创建用户和组 ==="
sudo groupadd dev_team
sudo groupadd test_team
sudo useradd -m -c "Alice Developer" -G dev_team alice
sudo useradd -m -c "Bob Developer" -G dev_team bob
sudo useradd -m -c "Charlie Tester" -G test_team charlie
# 设置密码
echo "设置用户密码:"
sudo passwd alice
sudo passwd bob
sudo passwd charlie
# 步骤2:创建项目目录结构
echo "=== 创建项目目录 ==="
sudo mkdir -p /projects/webapp
sudo mkdir -p /projects/webapp/src
sudo mkdir -p /projects/webapp/docs
sudo mkdir -p /projects/webapp/tests
sudo mkdir -p /projects/webapp/logs
# 步骤3:设置目录所有者和组
echo "=== 设置目录权限 ==="
sudo chown -R root:dev_team /projects/webapp
sudo chmod -R 775 /projects/webapp
# 步骤4:设置特殊权限
echo "=== 设置SGID确保文件继承组权限 ==="
sudo chmod g+s /projects/webapp
find /projects/webapp -type d -exec chmod g+s {} ;
# 步骤5:设置ACL精细控制
echo "=== 设置ACL权限 ==="
# 测试团队对 tests 目录有读写权限
sudo setfacl -R -m g:test_team:rwx /projects/webapp/tests
# 测试团队对 logs 目录有读写权限
sudo setfacl -R -m g:test_team:rwx /projects/webapp/logs
# 测试团队对其他目录只有读权限
sudo setfacl -R -m g:test_team:r-x /projects/webapp/src
sudo setfacl -R -m g:test_team:r-x /projects/webapp/docs
# 步骤6:设置默认ACL
echo "=== 设置默认ACL ==="
sudo setfacl -d -m g:dev_team:rwx /projects/webapp/
sudo setfacl -d -m g:test_team:r-x /projects/webapp/
# 步骤7:验证权限设置
echo "=== 验证权限设置 ==="
echo "项目根目录权限:"
ls -ld /projects/webapp/
getfacl /projects/webapp/
echo "src目录权限:"
ls -ld /projects/webapp/src
getfacl /projects/webapp/src
echo "tests目录权限:"
ls -ld /projects/webapp/tests
getfacl /projects/webapp/tests
# 步骤8:测试权限
echo "=== 测试权限 ==="
# 切换到 alice 用户测试
sudo -u alice bash -c "
cd /projects/webapp/src
echo '代码由 Alice 创建' > alice_code.txt
ls -l alice_code.txt
"
# 切换到 charlie 用户测试
sudo -u charlie bash -c "
cd /projects/webapp/tests
echo '测试用例由 Charlie 创建' > test_case.txt
ls -l test_case.txt
"
# 验证文件组权限
echo "=== 验证文件组继承 ==="
ls -l /projects/webapp/src/alice_code.txt
# 应该显示文件属于 dev_team 组
# 清理(在实际环境中不要执行)
# sudo userdel -r alice
# sudo userdel -r bob
# sudo userdel -r charlie
# sudo groupdel dev_team
# sudo groupdel test_team
# sudo rm -rf /projects
# 权限问题诊断流程
# 1. 检查当前用户和组
whoami
id
# 2. 检查文件权限
ls -l filename
ls -ld directory/
# 3. 检查ACL权限
getfacl filename
# 4. 检查父目录权限
ls -ld $(dirname /path/to/file)
# 5. 使用 strace 跟踪系统调用
strace -e trace=file cat /protected/file 2>&1 | grep -i denied
# 6. 检查 SELinux 或 AppArmor 状态
# 对于 SELinux:
getenforce
sestatus
ls -Z filename # 查看SELinux上下文
# 对于 AppArmor:
aa-status
# 7. 检查文件系统挂载选项
mount | grep /path/to/filesystem
# 常见权限问题解决命令
# 修复家目录权限
sudo chmod 755 /home/username
sudo chown -R username:username /home/username
# 修复脚本执行权限
chmod +x script.sh
# 修复整个目录权限
sudo chown -R user:group /path/to/directory
sudo chmod -R 755 /path/to/directory
# 重置ACL权限
setfacl -b filename
# 检查系统用户安全
echo "=== 检查空密码用户 ==="
sudo awk -F: '($2 == "") {print $1}' /etc/shadow
echo "=== 检查UID为0的用户 ==="
awk -F: '($3 == 0) {print $1}' /etc/passwd
echo "=== 检查密码过期策略 ==="
chage -l username
# 设置密码策略
echo "=== 修改密码策略 ==="
# 编辑 /etc/login.defs
sudo nano /etc/login.defs
# 重要参数:
# PASS_MAX_DAYS 90
# PASS_MIN_DAYS 1
# PASS_WARN_AGE 7
# 使用 pam_pwquality 设置密码复杂度
sudo apt-get install libpam-pwquality # Ubuntu/Debian
sudo yum install pam_pwquality # CentOS/RHEL
# 编辑 /etc/security/pwquality.conf
sudo nano /etc/security/pwquality.conf
# 定期检查SUID/SGID文件
echo "=== 查找所有SUID文件 ==="
find / -type f -perm /4000 -ls 2>/dev/null
echo "=== 查找所有SGID文件 ==="
find / -type f -perm /2000 -ls 2>/dev/null
echo "=== 查找世界可写文件 ==="
find / -type f -perm /0002 ! -path "/proc/*" -ls 2>/dev/null
echo "=== 查找无主文件 ==="
find / -nouser -o -nogroup 2>/dev/null
# 安全备份权限设置
echo "=== 备份重要目录权限 ==="
# 备份 /etc 权限
getfacl -R /etc > /root/etc_permissions_backup.acl
# 备份关键目录
important_dirs=("/etc" "/var" "/usr" "/boot")
for dir in "${important_dirs[@]}"; do
getfacl -R "$dir" > "/root/${dir////_}_permissions.acl"
done
# 恢复权限
setfacl --restore=/root/etc_permissions_backup.acl
通过本教程,应该已经掌握了:
用户管理:创建、修改、删除用户,理解用户配置文件用户组管理:组的创建管理,用户与组的关系基础权限:文件权限的数字和符号表示法,权限设置与验证高级权限:SUID、SGID、粘滞位的原理和应用ACL权限:精细化的访问控制列表管理实战案例:完整的团队项目管理权限设置安全实践:系统权限安全检查和最佳实践这些技能将帮助您在 Linux 系统中有效地管理用户和权限,确保系统安全性和工作效率。建议在实际环境中多加练习,熟练掌握各种权限管理技巧。