目录访问控制

教学目标

  • 掌握 Linux 目录权限的基本概念和作用
  • 学会使用命令修改目录权限和所有者
  • 熟悉目录特殊权限(SGID、Sticky Bit)的应用场景
  • 了解目录权限对文件操作的影响
  • 掌握目录权限审计和管理的最佳实践
  • 能够根据实际需求制定合理的目录访问控制策略

主要知识点

1. 目录权限基础

  • 目录权限的概念:控制不同用户对目录的访问权限的安全机制
  • 目录权限的作用
    • 读取权限 (r):允许列出目录中的文件和子目录
    • 写入权限 (w):允许在目录中创建、删除、重命名文件和子目录
    • 执行权限 (x):允许进入目录,访问其中的文件和子目录
  • 目录权限的特殊性
    • 目录的执行权限对于访问其内容至关重要
    • 目录的写入权限控制文件的创建和删除
    • 目录的读取权限控制文件列表的查看
  • 目录类型的表示:在 ls -l 输出中,目录以 d 开头

2. 目录权限表示方法

  • 符号表示法

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

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

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

3. 修改目录权限的命令

  • chmod 命令

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

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

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

4. 目录特殊权限

  • **SGID (Set Group ID)**:

    • 作用:在目录中创建的新文件和子目录继承目录的组
    • 表示方法:目录权限位的组执行位显示为 s
    • 设置命令:chmod g+s directorychmod 2755 directory
    • 常见应用:共享目录,确保组内成员创建的文件都属于同一组
    • 安全注意事项:SGID 目录应谨慎设置,确保组权限合理
  • Sticky Bit

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

    • 作用:对于可执行文件:以文件所有者的身份运行
    • 注意:SUID 对目录没有特殊意义,仅对可执行文件有效
    • 表示方法:文件权限位的所有者执行位显示为 s
    • 设置命令:chmod u+s filechmod 4755 file

5. 目录权限对文件操作的影响

  • **目录读取权限 (r)**:

    • 允许使用 ls 命令列出目录中的文件和子目录
    • 允许使用 find 命令在目录中查找文件
    • 不允许进入目录(需要执行权限)
    • 示例:ls -la directory
  • **目录写入权限 (w)**:

    • 允许在目录中创建新文件和子目录
    • 允许删除目录中的文件和子目录(即使没有文件的写权限)
    • 允许重命名目录中的文件和子目录
    • 允许移动目录中的文件和子目录
    • 注意:如果目录设置了 Sticky Bit,则只能删除自己的文件
  • **目录执行权限 (x)**:

    • 允许进入目录,使用 cd 命令
    • 允许访问目录中文件的内容(需要文件的相应权限)
    • 允许在路径中使用目录(如 cat directory/file
    • 不允许列出目录中的文件(需要读取权限)
  • 权限组合的影响

    • r-x:可以进入目录,查看文件内容,但不能列出文件
    • rx-:可以列出文件,但不能进入目录
    • rwx:完全控制目录及其内容
    • --x:可以进入目录,访问已知文件,但不能列出文件
    • w-x:可以进入目录,创建/删除文件,但不能列出文件

6. 目录访问控制列表(ACL)

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

  • ACL 的组成

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

    • getfacl:查看目录的 ACL 权限
    • setfacl:设置目录的 ACL 权限
  • 设置目录 ACL 权限

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

    # 查看目录的 ACL 权限
    getfacl directory

7. 目录权限继承

  • 默认权限

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

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

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

8. 目录权限审计

  • 权限检查

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

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

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

9. 目录权限管理最佳实践

  • 基本原则

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

    • 系统目录:通常设置为 755
    • 用户主目录:设置为 700 或 750
    • 共享目录:设置为 775 并结合 SGID
    • 临时目录:设置为 1777(添加 Sticky Bit)
    • 应用程序目录:根据需要设置,一般为 755
  • 特殊权限使用

    • 对共享目录使用 SGID,确保组继承
    • 对公共目录使用 Sticky Bit,防止文件被他人删除
    • 谨慎使用 SUID,只在必要时设置
    • 定期审查特殊权限的使用情况
  • ACL 使用

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

    • 使用 find 命令查找权限问题
    • 使用 getfaclsetfacl 管理 ACL
    • 使用 ls -la 查看目录权限
    • 使用 chmodchownchgrp 修改权限

实用案例分析

案例 1:基本目录权限管理

场景:管理用户主目录和共享目录的权限。

分析步骤

# 1. 创建测试目录
mkdir -p /tmp/test目录权限管理/user1
mkdir -p /tmp/test目录权限管理/shared

# 2. 设置用户主目录权限
# 设置为只有所有者可访问
chmod 700 /tmp/test目录权限管理/user1

# 3. 验证主目录权限
ls -la /tmp/test目录权限管理/

# 4. 设置共享目录权限
# 设置为组成员可读写执行,其他用户无权限
chmod 770 /tmp/test目录权限管理/shared

# 5. 修改共享目录所属组
chgrp developers /tmp/test目录权限管理/shared

# 6. 设置 SGID 权限,确保新文件继承组
chmod g+s /tmp/test目录权限管理/shared

# 7. 验证共享目录权限
ls -la /tmp/test目录权限管理/

# 8. 在共享目录中创建测试文件
touch /tmp/test目录权限管理/shared/test.txt

# 9. 验证新文件的组继承
ls -la /tmp/test目录权限管理/shared/

# 10. 测试不同用户的访问权限
# 测试所有者访问
ls -la /tmp/test目录权限管理/user1/

# 测试组成员访问
su - user1 -c "ls -la /tmp/test目录权限管理/shared/"  # 假设 user1 属于 developers 组

# 测试其他用户访问
su - otheruser -c "ls -la /tmp/test目录权限管理/shared/"  # 应该被拒绝

# 11. 清理测试目录
rm -rf /tmp/test目录权限管理

基本目录权限管理总结

  • 主目录权限:设置为 700,确保用户隐私
  • 共享目录权限:设置为 770 并结合 SGID,确保组内协作
  • 权限继承:使用 SGID 确保新文件继承目录的组
  • 访问控制:根据用户角色设置不同的目录权限

案例 2:公共临时目录设置

场景:创建一个公共临时目录,允许所有用户使用但防止文件被他人删除。

分析步骤

# 1. 创建公共临时目录
mkdir -p /tmp/public_temp

# 2. 设置权限,添加 Sticky Bit
chmod 1777 /tmp/public_temp

# 3. 验证权限设置
ls -la /tmp/public_temp/

# 4. 测试不同用户创建文件
# 用户1 创建文件
su - user1 -c "echo 'user1 file' > /tmp/public_temp/user1.txt"

# 用户2 创建文件
su - user2 -c "echo 'user2 file' > /tmp/public_temp/user2.txt"

# 5. 验证文件创建
ls -la /tmp/public_temp/

# 6. 测试文件删除权限
# 用户1 尝试删除自己的文件(应该成功)
su - user1 -c "rm /tmp/public_temp/user1.txt"

# 用户1 尝试删除用户2的文件(应该失败,因为有 Sticky Bit)
su - user1 -c "rm /tmp/public_temp/user2.txt"

# 7. 验证文件状态
ls -la /tmp/public_temp/

# 8. 清理测试目录
rm -rf /tmp/public_temp

公共临时目录设置总结

  • 权限设置:使用 1777 权限,允许所有用户读写执行
  • Sticky Bit:防止用户删除他人的文件
  • 安全保障:即使权限宽松,也能保护用户文件不被删除
  • 适用场景:适合多用户共享的临时文件存储

案例 3:使用 ACL 进行细粒度目录权限控制

场景:在项目目录中为不同角色设置不同的访问权限。

分析步骤

# 1. 创建项目目录
mkdir -p /tmp/project

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

# 3. 设置基本权限
chmod 755 /tmp/project

# 4. 使用 ACL 为不同用户设置权限
# 为项目管理员设置完全权限
setfacl -m u:admin:rwx /tmp/project

# 为开发人员设置读写执行权限
setfacl -m u:developer:rwx /tmp/project

# 为测试人员设置只读权限
setfacl -m u:tester:r-x /tmp/project

# 为实习生设置只执行权限
setfacl -m u:intern:--x /tmp/project

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

# 6. 设置默认 ACL,确保新文件继承权限
setfacl -d -m u:admin:rwx /tmp/project
setfacl -d -m u:developer:rwx /tmp/project
setfacl -d -m u:tester:r-x /tmp/project
setfacl -d -m u:intern:--x /tmp/project
setfacl -d -m o::--- /tmp/project

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

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

# 9. 验证新文件的 ACL 权限
ls -la /tmp/project/test.txt
getfacl /tmp/project/test.txt

# 10. 测试不同用户的访问权限
# 管理员应该可以读写
su - admin -c "echo 'admin edit' > /tmp/project/test.txt"
su - admin -c "cat /tmp/project/test.txt"

# 开发人员应该可以读写
su - developer -c "echo 'developer edit' >> /tmp/project/test.txt"
su - developer -c "cat /tmp/project/test.txt"

# 测试人员应该只能读
su - tester -c "cat /tmp/project/test.txt"
su - tester -c "echo 'tester edit' >> /tmp/project/test.txt"  # 应该失败

# 实习生应该只能执行(访问已知文件)
su - intern -c "cat /tmp/project/test.txt"  # 应该成功,因为知道文件名

# 11. 清理测试目录
rm -rf /tmp/project

ACL 细粒度目录权限控制总结

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

案例 4:目录权限审计

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

分析步骤

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

# 查找权限为 777 的目录
find / -type d -perm 777 -ls 2>/dev/null

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

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

# 3. 检查系统关键目录的权限
# 检查 /etc 目录权限
ls -la /etc/

# 检查 /var 目录权限
ls -la /var/

# 检查 /tmp 目录权限
ls -la /tmp/

# 检查 /home 目录权限
ls -la /home/

# 4. 查找没有所有者的目录
find / -nouser -o -nogroup -type d -ls 2>/dev/null

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

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

# 生成 SGID 目录报告
find / -type d -perm -2000 -ls 2>/dev/null > /tmp/目录权限审计报告/sgid_dirs.txt

# 生成 Sticky Bit 目录报告
find / -type d -perm -1000 -ls 2>/dev/null > /tmp/目录权限审计报告/sticky_dirs.txt

# 生成其他用户可写目录报告
find /home -type d -perm -o+w -ls > /tmp/目录权限审计报告/world_writable_dirs.txt

# 生成无主目录报告
find / -nouser -o -nogroup -type d -ls 2>/dev/null > /tmp/目录权限审计报告/unowned_dirs.txt

# 查看报告
ls -la /tmp/目录权限审计报告/

# 7. 清理审计报告
rm -rf /tmp/目录权限审计报告

目录权限审计总结

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

课后练习

  1. 基本目录权限练习

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

    • 创建一个共享目录,设置 SGID 权限
    • 在目录中创建文件和子目录,验证组继承
    • 创建一个公共临时目录,设置 Sticky Bit
    • 测试不同用户对目录中文件的删除权限
  3. ACL 权限练习

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

    • 创建目录并设置不同的权限组合(如 r-x, -wx, --x 等)
    • 测试每种权限组合对目录操作的影响
    • 分析权限组合的实际作用
  5. 目录权限审计练习

    • 查找系统中权限过于宽松的目录
    • 查找设置了特殊权限的目录
    • 检查系统关键目录的权限设置
    • 生成目录权限审计报告并分析
  6. 综合目录权限管理练习

    • 设计一个多用户协作环境的目录结构和权限方案
    • 实现目录权限、特殊权限和 ACL 的组合使用
    • 测试权限设置的有效性
    • 进行权限审计并优化权限设置

总结

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

  • 目录权限的基本概念和作用
  • 目录权限的表示方法和修改命令
  • 目录特殊权限(SGID、Sticky Bit)的应用场景
  • 目录权限对文件操作的影响
  • 目录访问控制列表(ACL)的配置和使用
  • 目录权限继承机制
  • 目录权限审计和管理的最佳实践
  • 实际目录权限管理案例的分析和解决

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

扩展阅读

« 上一篇 文件访问控制 下一篇 » 进程访问控制