文件访问控制

教学目标

  • 掌握 Linux 文件权限的基本概念和表示方法
  • 学会使用命令修改文件权限和所有者
  • 熟悉文件访问控制列表(ACL)的配置和使用
  • 了解特殊权限(SUID、SGID、Sticky Bit)的作用和设置方法
  • 掌握文件权限审计和管理的最佳实践
  • 能够根据实际需求制定合理的文件访问控制策略

主要知识点

1. 文件权限基础

  • 文件权限的概念:控制不同用户对文件的访问权限的安全机制
  • 文件权限的作用:保护文件内容不被未授权访问、修改或执行
  • 文件权限的组成:所有者权限、组权限、其他用户权限
  • 文件权限的类型:读取 (r)、写入 (w)、执行 (x)
  • 文件类型的表示:普通文件 (-)、目录 (d)、链接 (l)、设备文件 (c/b)、管道 (p)、套接字 (s)

2. 文件权限表示方法

  • 符号表示法

    • 使用字母表示权限:r(读取)、w(写入)、x(执行)
    • 使用符号表示用户类别:u(所有者)、g(组)、o(其他)、a(所有)
    • 使用操作符:+(添加权限)、-(移除权限)、=(设置权限)
    • 示例:chmod u+rwx,g+rx,o-rwx file
  • 数字表示法

    • 每个权限对应一个数字:r=4, w=2, x=1
    • 权限组合为数字之和:rwx=7, rw-=6, r-x=5, r--=4, -wx=3, -w-=2, --x=1, ---=0
    • 三位数字分别表示:所有者、组、其他用户的权限
    • 示例:chmod 750 file
  • 八进制表示法

    • 四位数字表示,第一位为特殊权限
    • 特殊权限值:SUID=4, SGID=2, Sticky Bit=1
    • 示例:chmod 4755 file 表示设置 SUID 权限

3. 修改文件权限的命令

  • chmod 命令

    • 功能:修改文件或目录的权限
    • 语法:chmod [选项] 权限模式 文件/目录
    • 常用选项:
      • -R:递归修改目录及其内容的权限
      • -v:显示修改过程
      • -c:仅显示发生变化的文件
    • 示例:
      # 使用符号表示法
      chmod u+x file
      
      # 使用数字表示法
      chmod 644 file
      
      # 递归修改目录权限
      chmod -R 755 directory
  • chown 命令

    • 功能:修改文件或目录的所有者和组
    • 语法:chown [选项] 所有者[:组] 文件/目录
    • 常用选项:
      • -R:递归修改目录及其内容的所有者
      • -v:显示修改过程
      • -c:仅显示发生变化的文件
    • 示例:
      # 修改所有者
      chown user file
      
      # 修改所有者和组
      chown user:group file
      
      # 递归修改目录所有者
      chown -R user:group directory
  • chgrp 命令

    • 功能:修改文件或目录的组
    • 语法:chgrp [选项] 组 文件/目录
    • 常用选项:
      • -R:递归修改目录及其内容的组
      • -v:显示修改过程
      • -c:仅显示发生变化的文件
    • 示例:
      # 修改文件组
      chgrp group file
      
      # 递归修改目录组
      chgrp -R group directory

4. 文件访问控制列表(ACL)

  • ACL 的概念:扩展的文件权限系统,支持为特定用户或组设置细粒度的权限

  • ACL 的作用:解决传统文件权限无法满足的复杂权限需求

  • ACL 的组成

    • 访问 ACL:控制对文件或目录的访问权限
    • 默认 ACL:控制在目录中创建的新文件或子目录的默认权限
  • ACL 相关命令

    • getfacl:查看文件或目录的 ACL 权限
    • setfacl:设置文件或目录的 ACL 权限
    • facl:管理 ACL 权限的工具集
  • 设置 ACL 权限

    # 为特定用户设置权限
    setfacl -m u:user:rwx file
    
    # 为特定组设置权限
    setfacl -m g:group:rx file
    
    # 为其他用户设置权限
    setfacl -m o::r file
    
    # 设置默认 ACL(仅对目录有效)
    setfacl -d -m u:user:rwx directory
    
    # 移除 ACL 权限
    setfacl -x u:user file
    
    # 清除所有 ACL 权限
    setfacl -b file
  • 查看 ACL 权限

    # 查看文件的 ACL 权限
    getfacl file
    
    # 查看目录的 ACL 权限
    getfacl directory

5. 特殊权限

  • **SUID (Set User ID)**:

    • 作用:执行文件时,以文件所有者的身份运行
    • 表示方法:文件权限位的所有者执行位显示为 s
    • 设置命令:chmod u+s filechmod 4755 file
    • 常见应用:passwd 命令,需要以 root 身份修改密码文件
    • 安全注意事项:SUID 程序可能被滥用,应谨慎设置
  • **SGID (Set Group ID)**:

    • 作用:
      • 对于可执行文件:以文件所属组的身份运行
      • 对于目录:在目录中创建的新文件继承目录的组
    • 表示方法:文件权限位的组执行位显示为 s
    • 设置命令:chmod g+s filechmod 2755 file
    • 常见应用:共享目录,确保新文件属于特定组
    • 安全注意事项:SGID 程序也可能被滥用,应谨慎设置
  • Sticky Bit

    • 作用:对于目录,只有文件所有者、目录所有者或 root 可以删除或重命名文件
    • 表示方法:文件权限位的其他用户执行位显示为 t
    • 设置命令:chmod +t directorychmod 1755 directory
    • 常见应用:/tmp 目录,防止用户删除其他用户的文件
    • 安全注意事项:Sticky Bit 只对目录有效,对文件无效

6. 文件权限的继承

  • 默认权限

    • 概念:新创建文件或目录时的默认权限
    • 控制机制:umask 命令
    • 计算方法:默认权限 = 最大权限 - umask 值
    • 常见 umask 值:
      • 0022:默认,新文件权限 644,新目录权限 755
      • 0002:适合共享环境,新文件权限 664,新目录权限 775
      • 0777:最严格,新文件权限 000,新目录权限 000
  • ACL 继承

    • 概念:通过默认 ACL 控制目录中创建的新文件或子目录的权限
    • 设置方法:setfacl -d -m u:user:rwx directory
    • 作用:确保在目录中创建的新文件自动继承指定的 ACL 权限
  • SGID 继承

    • 概念:在设置了 SGID 权限的目录中创建的新文件继承目录的组
    • 作用:确保共享目录中的文件都属于同一组,便于组内协作

7. 文件权限审计

  • 权限检查

    • 查找权限过于宽松的文件:find / -type f -perm -007 -ls
    • 查找设置了 SUID 位的文件:find / -type f -perm -4000 -ls
    • 查找设置了 SGID 位的文件:find / -type f -perm -2000 -ls
    • 查找设置了 Sticky Bit 的目录:find / -type d -perm -1000 -ls
    • 查找所有者为 root 的文件:find / -user root -type f -ls
    • 查找没有所有者的文件:find / -nouser -o -nogroup -ls
  • 权限分析

    • 分析文件权限是否符合最小权限原则
    • 检查特殊权限的使用是否合理
    • 验证 ACL 权限是否正确设置
    • 确认权限继承机制是否正常工作
  • 权限报告

    • 生成文件权限审计报告
    • 识别权限问题并提出整改建议
    • 跟踪权限变更历史

8. 文件权限管理最佳实践

  • 基本原则

    • 遵循最小权限原则:只授予必要的权限
    • 定期审查文件权限:确保权限设置合理
    • 统一权限管理:建立标准的权限设置规范
    • 记录权限变更:便于审计和问题追溯
  • 文件权限设置

    • 系统文件:通常设置为 644(配置文件)或 755(可执行文件)
    • 用户数据文件:根据需要设置,一般为 600 或 640
    • 可执行文件:设置为 755 或 700
    • 共享文件:设置为 664 或 775,结合 SGID 使用
  • 目录权限设置

    • 系统目录:通常设置为 755
    • 用户主目录:设置为 700 或 750
    • 共享目录:设置为 775 并结合 SGID
    • 临时目录:设置为 1777(添加 Sticky Bit)
  • 特殊权限使用

    • 谨慎使用 SUID 和 SGID,只在必要时设置
    • 对 SUID/SGID 文件进行定期审查
    • 确保 SUID/SGID 文件的所有者为 root 或可信用户
    • 对共享目录使用 SGID 和适当的权限设置
    • 对公共目录使用 Sticky Bit 保护
  • ACL 使用

    • 在需要细粒度权限控制时使用 ACL
    • 合理设置默认 ACL 确保权限继承
    • 定期审查 ACL 设置,避免权限扩散
    • 结合传统权限和 ACL 使用,提高安全性

实用案例分析

案例 1:基本文件权限管理

场景:管理用户数据文件的权限,确保敏感数据的安全。

分析步骤

# 1. 创建测试文件
mkdir -p /tmp/test权限管理
touch /tmp/test权限管理/sensitive.txt

# 2. 设置文件权限
# 设置为只有所有者可读写,其他人无权限
chmod 600 /tmp/test权限管理/sensitive.txt

# 3. 验证权限设置
ls -l /tmp/test权限管理/sensitive.txt

# 4. 测试不同用户的访问权限
# 切换到其他用户尝试访问
su - otheruser -c "cat /tmp/test权限管理/sensitive.txt"

# 5. 修改文件所有者
chown user1:group1 /tmp/test权限管理/sensitive.txt

# 6. 验证所有者变更
ls -l /tmp/test权限管理/sensitive.txt

# 7. 为组添加读取权限
chmod g+r /tmp/test权限管理/sensitive.txt

# 8. 验证权限变更
ls -l /tmp/test权限管理/sensitive.txt

# 9. 测试组成员的访问权限
su - user2 -c "cat /tmp/test权限管理/sensitive.txt"  # 假设 user2 属于 group1

# 10. 清理测试文件
rm -rf /tmp/test权限管理

基本文件权限管理总结

  • 权限设置:根据文件的敏感程度设置适当的权限
  • 所有者管理:确保文件由正确的用户和组拥有
  • 权限测试:验证不同用户对文件的访问权限
  • 最小权限:只授予必要的权限,避免过度授权

案例 2:使用 ACL 进行细粒度权限控制

场景:在共享目录中为不同用户设置不同的访问权限。

分析步骤

# 1. 创建共享目录
mkdir -p /tmp/shared

# 2. 安装 ACL 工具(如果未安装)
apt install acl

# 3. 设置目录的基本权限
chmod 755 /tmp/shared

# 4. 为特定用户设置权限
# 为 user1 设置读写执行权限
setfacl -m u:user1:rwx /tmp/shared

# 为 user2 设置只读权限
setfacl -m u:user2:r-x /tmp/shared

# 为 group1 设置读写权限
setfacl -m g:group1:rw- /tmp/shared

# 5. 查看 ACL 权限
getfacl /tmp/shared

# 6. 设置默认 ACL,确保新文件继承权限
setfacl -d -m u:user1:rwx /tmp/shared
setfacl -d -m u:user2:r-x /tmp/shared
setfacl -d -m g:group1:rw- /tmp/shared
setfacl -d -m o::r-x /tmp/shared

# 7. 验证默认 ACL
getfacl /tmp/shared

# 8. 在目录中创建测试文件
touch /tmp/shared/test.txt

# 9. 验证新文件的权限
ls -l /tmp/shared/test.txt

# 10. 查看新文件的 ACL 权限
getfacl /tmp/shared/test.txt

# 11. 测试不同用户的访问权限
# user1 应该可以读写
su - user1 -c "echo 'test' > /tmp/shared/test.txt"
su - user1 -c "cat /tmp/shared/test.txt"

# user2 应该只能读,不能写
su - user2 -c "cat /tmp/shared/test.txt"
su - user2 -c "echo 'test2' > /tmp/shared/test.txt"  # 应该失败

# 12. 修改 ACL 权限
# 为 user2 添加写入权限
setfacl -m u:user2:rw- /tmp/shared

# 13. 验证权限变更
getfacl /tmp/shared

# 14. 测试权限变更后的访问
su - user2 -c "echo 'test2' > /tmp/shared/test.txt"  # 现在应该成功
su - user2 -c "cat /tmp/shared/test.txt"

# 15. 移除 ACL 权限
# 移除 user2 的权限
setfacl -x u:user2 /tmp/shared

# 16. 验证权限移除
getfacl /tmp/shared

# 17. 清除所有 ACL 权限
setfacl -b /tmp/shared

# 18. 验证 ACL 清除
getfacl /tmp/shared

# 19. 清理测试目录
rm -rf /tmp/shared

ACL 细粒度权限控制总结

  • 灵活配置:使用 ACL 为不同用户和组设置不同的权限
  • 权限继承:通过默认 ACL 确保新文件继承正确的权限
  • 细粒度控制:可以精确控制每个用户对文件的访问权限
  • 权限管理:可以随时添加、修改或移除特定用户的权限
  • 兼容性:ACL 是对传统权限的扩展,不影响传统权限的使用

案例 3:特殊权限的应用

场景:设置共享目录和特殊执行文件的权限。

分析步骤

# 1. 创建共享目录
mkdir -p /tmp/shared_project

# 2. 设置 SGID 权限,确保新文件继承目录的组
chmod g+s /tmp/shared_project

# 3. 设置目录权限,允许组成员读写执行
chmod 775 /tmp/shared_project

# 4. 验证权限设置
ls -l /tmp/shared_project

# 5. 修改目录所属组
chgrp developers /tmp/shared_project

# 6. 验证组设置
ls -l /tmp/shared_project

# 7. 在目录中创建测试文件
touch /tmp/shared_project/test_file.txt

# 8. 验证新文件的组继承
ls -l /tmp/shared_project/test_file.txt

# 9. 创建临时共享目录,添加 Sticky Bit 保护
mkdir -p /tmp/public_tmp
chmod 1777 /tmp/public_tmp

# 10. 验证 Sticky Bit 设置
ls -l /tmp/public_tmp

# 11. 创建测试可执行文件
cat > /tmp/test_suid.sh << 'EOF'
#!/bin/bash
echo "当前用户: $(whoami)"
echo "文件所有者: $(stat -c '%U' "$0")"
EOF

# 12. 设置执行权限
chmod 755 /tmp/test_suid.sh

# 13. 测试普通执行
/bin/bash /tmp/test_suid.sh

# 14. 设置 SUID 权限
chown root /tmp/test_suid.sh
chmod u+s /tmp/test_suid.sh

# 15. 验证 SUID 设置
ls -l /tmp/test_suid.sh

# 16. 测试 SUID 执行
/bin/bash /tmp/test_suid.sh

# 17. 清理测试文件和目录
rm -rf /tmp/shared_project /tmp/public_tmp /tmp/test_suid.sh

特殊权限应用总结

  • SGID 应用:适合共享目录,确保新文件继承目录的组,便于团队协作
  • Sticky Bit 应用:适合公共临时目录,防止用户删除其他用户的文件
  • SUID 应用:适合需要以特定用户身份执行的程序,如 passwd 命令
  • 安全注意事项:特殊权限应谨慎使用,特别是 SUID 和 SGID,以避免安全风险

案例 4:文件权限审计

场景:审计系统中的文件权限,识别潜在的安全问题。

分析步骤

# 1. 查找权限过于宽松的文件
# 查找其他用户可写的文件
find /home -type f -perm -o+w -ls

# 查找其他用户可执行的文件
find /home -type f -perm -o+x -ls

# 2. 查找设置了特殊权限的文件
# 查找 SUID 文件
find / -type f -perm -4000 -ls 2>/dev/null

# 查找 SGID 文件
find / -type f -perm -2000 -ls 2>/dev/null

# 查找设置了 Sticky Bit 的文件
find / -type f -perm -1000 -ls 2>/dev/null

# 3. 查找没有所有者的文件
find / -nouser -o -nogroup -ls 2>/dev/null

# 4. 查找敏感系统文件的权限
# 检查 /etc/passwd 权限
ls -l /etc/passwd

# 检查 /etc/shadow 权限
ls -l /etc/shadow

# 检查 /etc/sudoers 权限
ls -l /etc/sudoers

# 5. 检查目录权限
# 查找权限过于宽松的目录
find /home -type d -perm -007 -ls

# 查找设置了 SGID 的目录
find / -type d -perm -2000 -ls 2>/dev/null

# 查找设置了 Sticky Bit 的目录
find / -type d -perm -1000 -ls 2>/dev/null

# 6. 检查 umask 设置
# 查看当前 umask
umask

# 查看系统默认 umask
cat /etc/profile | grep umask
cat /etc/login.defs | grep UMASK

# 7. 检查 ACL 设置
# 查找设置了 ACL 的文件
find /home -type f -exec getfacl {} \; 2>/dev/null | grep -E '^(file:|user:|group:)' | head -20

# 8. 生成权限审计报告
# 创建报告目录
mkdir -p /tmp/权限审计报告

# 生成 SUID 文件报告
find / -type f -perm -4000 -ls 2>/dev/null > /tmp/权限审计报告/suid_files.txt

# 生成 SGID 文件报告
find / -type f -perm -2000 -ls 2>/dev/null > /tmp/权限审计报告/sgid_files.txt

# 生成其他用户可写文件报告
find /home -type f -perm -o+w -ls > /tmp/权限审计报告/world_writable_files.txt

# 生成无主文件报告
find / -nouser -o -nogroup -ls 2>/dev/null > /tmp/权限审计报告/unowned_files.txt

# 查看报告
ls -l /tmp/权限审计报告/

# 9. 清理审计报告
rm -rf /tmp/权限审计报告

文件权限审计总结

  • 安全检查:定期审计文件权限,识别潜在的安全问题
  • 权限管理:及时修复过于宽松的权限设置
  • 特殊权限审查:定期审查 SUID/SGID 文件,确保安全使用
  • 无主文件处理:及时处理没有所有者的文件,避免安全风险
  • 报告生成:生成权限审计报告,便于分析和整改

课后练习

  1. 基本文件权限练习

    • 创建一个测试文件,设置不同的权限组合
    • 使用不同用户尝试访问该文件,观察权限控制效果
    • 修改文件的所有者和组,测试权限变化
  2. ACL 权限练习

    • 创建一个共享目录,设置基本权限
    • 为多个用户设置不同的 ACL 权限
    • 设置默认 ACL,测试权限继承
    • 验证不同用户对目录中文件的访问权限
  3. 特殊权限练习

    • 创建一个共享目录,设置 SGID 权限
    • 在目录中创建文件,验证组继承
    • 创建一个公共临时目录,设置 Sticky Bit
    • 测试不同用户对目录中文件的删除权限
    • 创建一个测试脚本,设置 SUID 权限并测试执行效果
  4. 权限审计练习

    • 查找系统中权限过于宽松的文件
    • 查找设置了特殊权限的文件
    • 检查敏感系统文件的权限设置
    • 生成权限审计报告并分析
  5. 综合权限管理练习

    • 设计一个多用户协作环境的权限方案
    • 实现文件权限、ACL 和特殊权限的组合使用
    • 测试权限设置的有效性
    • 进行权限审计并优化权限设置
  6. 权限问题排查练习

    • 模拟权限错误场景,如文件无法访问、无法修改等
    • 分析权限问题的原因
    • 提出并实施权限修复方案
    • 验证修复效果

总结

本章节详细介绍了 Linux 系统中文件访问控制的原理和方法,包括:

  • 文件权限的基本概念和表示方法
  • 修改文件权限和所有者的命令
  • 文件访问控制列表(ACL)的配置和使用
  • 特殊权限(SUID、SGID、Sticky Bit)的作用和设置方法
  • 文件权限的继承机制和默认权限设置
  • 文件权限审计和管理的最佳实践
  • 实际文件权限管理案例的分析和解决

通过学习本章节,您应该能够全面了解 Linux 文件访问控制的原理和方法,掌握文件权限管理的各种技术和工具,制定合理的文件访问控制策略,确保系统和数据的安全。在实际应用中,建议根据文件的敏感程度和使用场景,结合传统权限、ACL 和特殊权限,制定多层次、细粒度的访问控制方案,同时定期进行权限审计和管理,及时发现和修复权限问题,提高系统的安全性和可靠性。

扩展阅读

« 上一篇 访问控制概述 下一篇 » 目录访问控制