Linux 权限管理进阶——ACL、SELinux 与 sudoers 深度配置及运维实战
一、基础权限回顾与常见问题
Linux 传统权限模型采用 UGO(User/Group/Other) + rwx 机制:
ls -l-rw-r--r-- 1 user group 1024 Jun 7 file.txt
- 权限位:r(4) w(2) x(1),常用 644、755、700 等。
- 目录权限特殊:x 表示可进入,w 表示可创建/删除文件(受 sticky bit 影响)。
常见运维痛点:
- 多用户共享目录时,传统权限难以精细控制(例如 A 用户可读写、B 用户仅可读特定子目录)。
这些问题正是 ACL 和 SELinux 要解决的。
二、ACL(Access Control Lists)—— 灵活的扩展权限机制
ACL 是 POSIX 标准扩展,允许为具体用户或组在文件/目录上设置独立权限,而不影响传统 UGO 权限。
2.1 ACL 基础命令
# 安装(多数系统已默认)yum install acl -y # RHEL/CentOSapt install acl -y # Debian/Ubuntu# 查看 ACLgetfacl /data/project# 设置 ACL(针对用户)setfacl -m u:devops:rwx /data/projectsetfacl -m u:tester:rx /data/project/logs# 针对组setfacl -m g:developers:rw /data/shared# 递归设置目录及子文件setfacl -R -m u:devops:rwx /data/project
默认 ACL(新文件自动继承):
setfacl -m d:u:devops:rwx /data/project # d: 表示 default
移除 ACL:
setfacl -x u:devops /data/projectsetfacl -R -b /data/project # 移除所有 ACL
2.2 生产场景实战
场景1:开发测试共享代码仓库
mkdir -p /data/codechown -R root:developers /data/codechmod 2770 /data/code # 设置 SGIDsetfacl -R -m g:testers:rx /data/codesetfacl -R -m d:g:testers:rx /data/code
场景2:日志目录多用户访问 运维、开发、安全团队都需要查看日志,但只有运维可删除:
setfacl -m u:dev1:r /var/log/appsetfacl -m u:sec-team:r /var/log/appsetfacl -m u:ops:rwx /var/log/app
运维技巧:
- 使用
mount -o acl 确保文件系统支持 ACL(ext4、xfs 默认支持)。 - 备份时注意
rsync -aAX 保留 ACL(-A 参数)。
2.3 ACL 与 umask、权限掩码的关系
ACL 不受 umask 直接影响,但 default ACL 会与创建时的权限结合计算。运维中建议在关键共享目录统一设置 default ACL。
三、SELinux —— 强制访问控制(MAC),企业生产必备
SELinux 是 NSA 开发的强制访问控制系统,能有效防止即使拿到 root 权限也无法越界操作的“沙箱”机制。很多运维人员“谈 SELinux 色变”,其实掌握后它是安全利器。
3.1 SELinux 基本概念
- 模式:Enforcing(强制)、Permissive(记录不阻挡)、Disabled。
- 上下文(Context):user:role:type:level,每个文件/进程都有。
# 查看状态sestatusgetenforce# 查看文件上下文ls -Z /etc/passwdls -Z /var/www/html# 查看进程上下文ps -eZ | grep httpd
3.2 常用管理命令
# 临时切换模式setenforce 0 # Permissive(调试用)setenforce 1 # Enforcing# 永久修改(推荐)vi /etc/selinux/configSELINUX=enforcing# 修复上下文restorecon -Rv /var/www/htmlchcon -Rt httpd_sys_content_t /custom/webdir# 布尔值开关(最常用)getsebool -a | grep httpdsetsebool -P httpd_can_network_connect on
3.3 生产环境 SELinux 配置实战
场景1:Nginx/Apache 自定义日志和配置目录
semanage fcontext -a -t httpd_log_t "/data/logs(/.*)?"restorecon -Rv /data/logssemanage fcontext -a -t httpd_config_t "/etc/nginx/custom(/.*)?"restorecon -Rv /etc/nginx/custom
场景2:数据库数据目录迁移
semanage fcontext -a -t mysqld_db_t "/newdata/mysql(/.*)?"restorecon -Rv /newdata/mysql
场景3:容器化环境(Docker/Podman) Docker 默认使用 svirt 标签,SELinux 需开启:
setsebool -P container_manage_cgroup on
3.4 SELinux 故障排查流程(运维必备)
检查日志:ausearch -m avc -ts recent 或 journalctl -xe
使用 audit2allow 生成策略模块:
ausearch -c 'nginx' --raw | audit2allow -M mynginxsemodule -i mynginx.pp
最佳实践:
- 新服务器上线先 Permissive 模式运行一段时间,收集 AVC 拒绝日志,再生成策略。
- 生产环境强烈推荐 Enforcing + 自定义策略。
- 结合 AppArmor(Ubuntu)使用,形成双保险。
四、sudoers 深度配置——最小权限与审计核心
sudo 是运维日常操作的“安全门卫”。直接用 root 是运维大忌。
4.1 visudo 使用规范
永远使用 visudo 编辑 /etc/sudoers,它会进行语法检查。
4.2 高级配置模板(生产推荐)
# Cmnd_Alias 定义命令别名Cmnd_Alias SERVICES = /usr/bin/systemctlCmnd_Alias DOCKER = /usr/bin/dockerCmnd_Alias LOGS = /usr/bin/journalctl, /bin/tail -f /var/log/*# 角色化权限%ops ALL=(ALL) NOPASSWD: SERVICES, LOGS%devops ALL=(ALL) NOPASSWD: DOCKER, /usr/bin/git# 特定用户精细控制dev1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, !/usr/bin/rm -rf /*
安全选项:
Defaults logfile=/var/log/sudo.logDefaults timestamp_timeout=5 # 密码缓存时间(分钟)Defaults !requiretty # 允许脚本执行 sudoDefaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
4.3 sudo 审计与监控
# 查看 sudo 日志tail -f /var/log/securetail -f /var/log/sudo.log# 实时监控tail -f /var/log/secure | grep sudo
结合 rsyslog 或 ELK 集中日志(后续文章详解)。
4.4 sudoers 最佳实践清单
- 结合 LDAP 集中管理 sudo 规则(后续篇)。
- 使用
sudo -u 指定运行用户,避免不必要 root。 - 禁用 root SSH 登录 + 强制所有管理通过 sudo。
五、综合权限管理运维案例与自动化
案例1:新项目权限初始化脚本
#!/bin/bashPROJECT_DIR=/data/projects/$1GROUP=dev-$1groupadd -f $GROUPmkdir -p $PROJECT_DIRchown root:$GROUP$PROJECT_DIRchmod 2770 $PROJECT_DIRsetfacl -R -m d:g:$GROUP:rwx $PROJECT_DIRsetfacl -R -m g:$GROUP:rwx $PROJECT_DIRrestorecon -Rv $PROJECT_DIR# 如果启用 SELinuxecho"项目 $1 权限初始化完成"
案例2:权限漂移检测脚本 定期巡检 ACL 和上下文是否符合基线。
案例3:故障模拟与恢复
- SELinux 阻挡服务:用
audit2allow 快速修复。
六、安全加固与合规考虑
- 定期权限审计:
find / -perm -4000 -o -perm -2000 查找 SUID/SGID。 - 文件系统挂载选项:
noexec,nosuid,nodev 用于临时目录。
合规要求(等保、ISO27001)通常要求:
七、常见问题排查与性能影响
- SELinux 初次启用可能导致服务启动失败,按日志逐步放开。