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