目录访问控制
教学目标
- 掌握 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 directory或chmod 2755 directory - 常见应用:共享目录,确保组内成员创建的文件都属于同一组
- 安全注意事项:SGID 目录应谨慎设置,确保组权限合理
Sticky Bit:
- 作用:只有文件所有者、目录所有者或 root 可以删除或重命名目录中的文件
- 表示方法:目录权限位的其他用户执行位显示为 t
- 设置命令:
chmod +t directory或chmod 1755 directory - 常见应用:
/tmp目录,防止用户删除其他用户的文件 - 安全注意事项:Sticky Bit 只对目录有效,对文件无效
**SUID (Set User ID)**:
- 作用:对于可执行文件:以文件所有者的身份运行
- 注意:SUID 对目录没有特殊意义,仅对可执行文件有效
- 表示方法:文件权限位的所有者执行位显示为 s
- 设置命令:
chmod u+s file或chmod 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命令查找权限问题 - 使用
getfacl和setfacl管理 ACL - 使用
ls -la查看目录权限 - 使用
chmod、chown和chgrp修改权限
- 使用
实用案例分析
案例 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/projectACL 细粒度目录权限控制总结:
- 灵活配置:使用 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 的使用情况
- 无主目录处理:及时处理没有所有者的目录,避免安全风险
- 报告生成:生成目录权限审计报告,便于分析和整改
课后练习
基本目录权限练习:
- 创建一个测试目录,设置不同的权限组合
- 使用不同用户尝试访问该目录,观察权限控制效果
- 修改目录的所有者和组,测试权限变化
特殊权限练习:
- 创建一个共享目录,设置 SGID 权限
- 在目录中创建文件和子目录,验证组继承
- 创建一个公共临时目录,设置 Sticky Bit
- 测试不同用户对目录中文件的删除权限
ACL 权限练习:
- 创建一个项目目录,设置基本权限
- 为多个用户设置不同的 ACL 权限
- 设置默认 ACL,测试权限继承
- 验证不同用户对目录中文件的访问权限
权限组合练习:
- 创建目录并设置不同的权限组合(如 r-x, -wx, --x 等)
- 测试每种权限组合对目录操作的影响
- 分析权限组合的实际作用
目录权限审计练习:
- 查找系统中权限过于宽松的目录
- 查找设置了特殊权限的目录
- 检查系统关键目录的权限设置
- 生成目录权限审计报告并分析
综合目录权限管理练习:
- 设计一个多用户协作环境的目录结构和权限方案
- 实现目录权限、特殊权限和 ACL 的组合使用
- 测试权限设置的有效性
- 进行权限审计并优化权限设置
总结
本章节详细介绍了 Linux 系统中目录访问控制的原理和方法,包括:
- 目录权限的基本概念和作用
- 目录权限的表示方法和修改命令
- 目录特殊权限(SGID、Sticky Bit)的应用场景
- 目录权限对文件操作的影响
- 目录访问控制列表(ACL)的配置和使用
- 目录权限继承机制
- 目录权限审计和管理的最佳实践
- 实际目录权限管理案例的分析和解决
通过学习本章节,您应该能够全面了解 Linux 目录访问控制的原理和方法,掌握目录权限管理的各种技术和工具,制定合理的目录访问控制策略,确保系统和数据的安全。在实际应用中,建议根据目录的用途和敏感程度,结合传统权限、特殊权限和 ACL,制定多层次、细粒度的访问控制方案,同时定期进行权限审计和管理,及时发现和修复权限问题,提高系统的安全性和可靠性。