1.2.5 访问控制列表与安全建议
访问控制列表(ACL)用于在传统“属主/属组/其他”权限模型之外,为单个用户或组设置更细粒度的权限,适合共享目录、应用数据目录与协作运维场景。使用前需确认文件系统支持 ACL 并已启用挂载参数。
原理简图
路径与通配符基础(ACL 命令常用)
- 绝对路径:从根目录 / 开始的完整路径,如 /shared/projectA。
- 相对路径:相对于当前工作目录的路径,如当前在 /shared 下,projectA 等价于 /shared/projectA。
- 通配符(globbing):由 shell 展开,ACL 命令接收展开后的文件列表。
- * 匹配任意长度字符串(不含 /)
- ? 匹配单个字符
- [] 匹配字符集合,如 [ab]
- **(需开启 globstar)可跨目录匹配
通配符与路径示例
# 进入共享目录(绝对路径)
cd /shared
# 相对路径示例:为当前目录下所有 .conf 文件添加只读 ACL
setfacl -m u:alice:r-- *.conf
# 绝对路径示例:为指定目录授予组权限
setfacl -m g:dev:rwx /shared/projectA
# 匹配单个字符与字符集
setfacl -m g:qa:r-- /shared/logs/log?.txt
setfacl -m g:qa:r-- /shared/logs/log[0-9].txt
# 开启 ** 递归匹配(bash)
shopt -s globstar
setfacl -m g:dev:r-x /shared/**/bin/*.sh
环境准备与安装检查
# 1) 检查文件系统类型与挂载参数(需包含 acl)
df -Th /shared
mount | grep /shared
# 2) 若需显式启用 acl,编辑 /etc/fstab(示例)
# /dev/vdb1 /shared ext4 defaults,acl 0 0
sudo vim /etc/fstab
# 3) 重新挂载生效
sudo mount -o remount /shared
# 4) 安装工具(部分发行版默认已装)
# Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y acl
# RHEL/CentOS/Rocky
sudo yum install -y acl
核心命令与解释
- getfacl:查看 ACL 详情
- setfacl -m:新增/修改 ACL
- setfacl -x:删除某条 ACL
- setfacl -b:清空 ACL
- setfacl -d -m:设置默认 ACL(目录继承)
完整示例:为共享目录配置协作权限
# 场景:/shared 由 root 管理,开发组 dev 需写入,临时用户 alice 仅需读写
sudo mkdir -p /shared
sudo chown root:root /shared
sudo chmod 750 /shared
# 1) 给组 dev 添加读写执行
sudo setfacl -m g:dev:rwx /shared
# 2) 给用户 alice 添加读写执行
sudo setfacl -m u:alice:rwx /shared
# 3) 设置默认 ACL,保证新建文件/目录自动继承
sudo setfacl -d -m g:dev:rwx /shared
sudo setfacl -d -m u:alice:rwx /shared
# 4) 查看 ACL
getfacl /shared
预期输出说明(关键字段)
# file: shared
# owner: root
# group: root
user::rwx
user:alice:rwx
group::r-x
group:dev:rwx
mask::rwx
other::---
default:user::rwx
default:user:alice:rwx
default:group::r-x
default:group:dev:rwx
default:mask::rwx
default:other::---
mask::rwx是用户/组 ACL 的上限,若 mask 为r-x,则rwx实际会被限制为r-x。
mask 影响与调整示例
# 模拟 mask 限制
sudo setfacl -m m:r-x /shared
getfacl /shared | grep mask
# 还原为可写
sudo setfacl -m m:rwx /shared
常见排错
# 1) ACL 不生效:检查是否启用 acl
mount | grep /shared | grep acl
# 2) 权限被 mask 限制
getfacl /shared | grep mask
# 3) 继承失效:确认设置了默认 ACL
getfacl /shared | grep default
# 4) 某些应用仍拒绝访问:检查上层目录权限
namei -l /shared
安全建议
1. 最小权限原则:只给必要用户/组授权,避免对 other 开放写权限。
2. 控制默认 ACL:仅在共享目录使用默认 ACL,定期审计继承权限。
3. 合并权限设计:优先通过属主/属组规划解决,ACL 仅用于例外。
4. 变更记录:权限调整前记录 getfacl 输出以便回滚。
5. 定期巡检:对关键目录执行 getfacl 巡检并对比基线。
练习与实战
1. 在 /shared 下创建 projectA,要求 dev 可写,qa 只读,other 无权限。
2. 设置默认 ACL,使新建文件继承 dev:rwx、qa:r-x。
3. 将 mask 设置为 r-x,观察 dev 实际权限变化并恢复。
4. 输出 getfacl 结果保存为基线文件:getfacl -R /shared > /tmp/acl.baseline。