保姆级教程:Linux 用户与权限管理,看这一篇就够了!

  • 时间:2025-11-10 17:28 作者: 来源: 阅读:0
  • 扫一扫,手机访问
摘要:1. Linux 用户管理基础概念 1.1 用户类型说明 在 Linux 系统中,用户分为三种主要类型: root 用户:系统超级管理员,拥有最高权限,UID 为 0系统用户:用于运行系统服务,UID 范围 1-999普通用户:日常使用的用户账户,UID 从 1000 开始 1.2 用户配置文件解析 Linux 用户信息存储在以下几个关键配置文件中: # 查看用户配置文件 cat /etc/p

1. Linux 用户管理基础概念

1.1 用户类型说明

在 Linux 系统中,用户分为三种主要类型:

root 用户:系统超级管理员,拥有最高权限,UID 为 0系统用户:用于运行系统服务,UID 范围 1-999普通用户:日常使用的用户账户,UID 从 1000 开始

1.2 用户配置文件解析

Linux 用户信息存储在以下几个关键配置文件中:


# 查看用户配置文件
cat /etc/passwd
cat /etc/shadow
cat /etc/group
cat /etc/gshadow
/etc/passwd 文件结构详解

# 查看 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
/etc/shadow 文件结构详解

# 查看 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. 保留字段

2. 用户管理实战操作

2.1 创建新用户


# 创建基本用户
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/

2.2 修改用户属性


# 修改用户注释信息
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

2.3 删除用户


# 删除用户但保留家目录
sudo userdel johndoe

# 删除用户同时删除家目录
sudo userdel -r johndoe

# 强制删除正在登录的用户
sudo userdel -f -r johndoe

# 验证删除
id johndoe
# 应该显示:id: 'johndoe': no such user

3. 用户组管理

3.1 用户组概念解析

3.2 用户组操作命令


# 创建新用户组
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

4. 文件权限深度解析

4.1 权限基础概念


# 查看文件详细权限
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)

4.2 权限管理流程图

4.3 权限设置实战


# 使用数字模式设置权限
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

4.4 权限验证测试


# 创建测试环境
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

5. 高级权限管理

5.1 特殊权限详解


# 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/

5.2 默认权限与 umask


# 查看当前 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

6. ACL(访问控制列表)高级权限

6.1 ACL 基础概念

6.2 ACL 实战操作


# 检查系统是否支持 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

7. 实战综合案例

7.1 项目团队权限管理案例


# 案例背景:开发团队需要共享项目目录
# 团队成员: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

7.2 权限故障排除技巧


# 权限问题诊断流程

# 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

8. 安全最佳实践

8.1 用户管理安全


# 检查系统用户安全
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

8.2 权限管理安全


# 定期检查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

9. 总结

通过本教程,应该已经掌握了:

用户管理:创建、修改、删除用户,理解用户配置文件用户组管理:组的创建管理,用户与组的关系基础权限:文件权限的数字和符号表示法,权限设置与验证高级权限:SUID、SGID、粘滞位的原理和应用ACL权限:精细化的访问控制列表管理实战案例:完整的团队项目管理权限设置安全实践:系统权限安全检查和最佳实践

这些技能将帮助您在 Linux 系统中有效地管理用户和权限,确保系统安全性和工作效率。建议在实际环境中多加练习,熟练掌握各种权限管理技巧。

  • 全部评论(0)
手机二维码手机访问领取大礼包
返回顶部