自动化脚本加固关键目录权限的核心是“先精准识别基线、再批量比对、最后安全修正”,重点管控/etc、/bin、/sbin、/root、/var/log、/tmp等路径,通过基线数组定义期望权限与归属,用stat比对并条件修复,避免递归误改、忽略ACL及容器只读限制,集成版本控制与定时任务确保可审计、可回溯。

直接用自动化脚本检查并加固关键目录权限,核心是“先精准识别基线、再批量比对、最后安全修正”,避免一刀切误操作。
明确哪些目录属于“关键目录”
不是所有目录都需要严控,重点锁定系统运行和安全敏感路径:
- /etc:配置文件集中地,应禁止普通用户写入
- /bin、/sbin、/usr/bin、/usr/sbin:可执行程序目录,需防篡改
- /root:超级用户家目录,必须严格限制访问(通常700)
- /var/log:日志目录,需保证日志服务可写,但普通用户不可写不可删
- /tmp 和 /var/tmp:注意 sticky bit(1777 / 1777)是否启用,防跨用户删文件
用 shell 脚本实现自动检查与修复
以下是一个轻量、可审计的 bash 脚本逻辑(无需额外依赖):
先定义基线数组,每项含路径、期望权限、期望属主属组:
BASELINE=( "/etc 755 root root" "/bin 755 root root" "/sbin 755 root root" "/root 700 root root" "/var/log 755 root syslog" "/tmp 1777 root root" )
遍历检查,仅对不合规项输出告警或执行 chmod/chown:
- 用 stat -c "%a %U %G" $path 获取当前权限与归属
- 用 [[ $(stat -c "%a" $path) != "755" ]] && chmod 755 $path 修复权限(加 -v 参数可看变更)
- 修复属主前加判断:[[ $(stat -c "%U" $path) != "root" ]] && chown root:root $path
- 生产环境建议先加 --dry-run 模式(用 echo 替代实际命令)验证效果
加固时必须避开的坑
权限修复不是越严越好,错误操作可能导致系统无法启动或服务异常:
- 不要盲目递归修改 /etc 下所有子目录:如 /etc/sudoers.d/ 需要 750,而 /etc/ssl/certs/ 通常需 755 且可被普通用户读取
- /var/log 下部分子目录由特定服务管理(如 nginx、mysql),应保持其属组为对应服务组(如 www-data、mysql),而非统一设为 root:syslog
- 容器化环境慎用全局 chmod:镜像中 /usr 层常为只读,脚本需适配 mount 状态或跳过只读路径
- 修复前建议用 getfacl 检查是否存在 ACL 扩展权限,单纯 chmod 可能覆盖它
集成进日常运维流程
让脚本真正起效,需嵌入可信、可追溯的执行链:
- 将脚本放入版本控制(如 Git),每次修改留记录,权限基线变更需走评审
- 通过 cron 每日凌晨执行检查(仅输出差异),每周六凌晨执行带 --fix 的加固(并自动邮件通知结果)
- 在 Ansible 或 SaltStack 中封装为模块,便于跨主机批量应用,同时保留回滚清单(如备份原权限到 /var/log/perm-baseline-$(date +%F).log)
- 首次运行后生成快照:find /etc /bin /sbin /root /var/log -printf "%p %m %u:%g\n" > /etc/sec-baseline-$(uname -r).snap,供后续比对

















