自动化脚本需分检查与修复两阶段,覆盖CIS/等保2.0等基线,支持--check/--fix参数、风险提示、备份及人工确认,聚焦SSH、账户、权限、日志等高危项,并校验权限、发行版、命令依赖,输出结构化报告。

编写自动化脚本实现 Linux 安全合规性检查与修复,核心在于:用可复现的逻辑覆盖常见基线要求(如 CIS、等保2.0、NIST SP 800-53),区分“检查”与“修复”两个阶段,确保操作安全可控、结果可审计。
明确检查范围与合规依据
不要泛泛而论“加固系统”。先锁定目标标准和适用场景:
- 确认采用哪套规范(例如:CIS CentOS 7 Benchmark v3.0.1,或《GB/T 22239-2019 信息安全技术 网络安全等级保护基本要求》二级Linux主机条款)
- 筛选出适用于当前环境的条目(如禁用 root 远程 SSH 登录、密码策略、日志保留周期、SUID 文件管控等)
- 排除不适用项(如容器环境无需检查 GRUB 密码;云主机可能无物理控制台访问需求)
用 Shell 脚本结构化实现“检查+修复”双模式
一个健壮的脚本应支持 --check 和 --fix 参数,且修复前默认执行检查并提示风险:
- 检查函数返回 0(合规)或 1(不合规),输出清晰项编号与当前状态(如:[FAIL] 5.4.1.2 - Ensure logging is configured (rsyslog))
- 修复函数只在确认不合规时触发,并附带备份动作(如修改
/etc/ssh/sshd_config前先cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%s)) - 关键修复操作增加人工确认开关(如
--auto-fix跳过确认,否则执行read -p "Apply fix for 1.5.1? [y/N] " -n 1 -r)
聚焦高频高危项,避免过度工程
优先覆盖影响面大、易被利用的配置点,不必追求 100% 条款覆盖:
- SSH 安全:检查 Protocol 2、PermitRootLogin no、MaxAuthTries ≤ 3、LoginGraceTime ≤ 60
-
账户与认证:检查空密码用户(
awk -F: '$2=="" {print $1}' /etc/shadow)、密码最大天数(chage -l $user | grep "Maximum number")、sudo 权限最小化(grep -v '^#' /etc/sudoers | grep -E '(ALL|NOPASSWD)' | grep -v 'root') -
文件权限与 SUID/SGID:扫描异常 setuid 文件(
find / -perm -4000 -type f 2>/dev/null | grep -E "(bin|sbin|usr)"),对比白名单 - 日志与审计:确认 rsyslog 或 journald 启用、/var/log 权限为 755、auditd 服务运行、关键目录(/etc,/bin,/sbin)启用 inotify 监控(可选)
增强可靠性与可维护性
让脚本能真正落地使用,不是一次性的玩具:
- 开头校验执行权限(
[[ $EUID -ne 0 ]] && echo "Run as root" && exit 1)和发行版(source /etc/os-release,区分 RHEL/CentOS/Ubuntu 的包管理与路径差异) - 所有外部命令加绝对路径或做存在性检查(
command -v awk >/dev/null 2>&1 || { echo "awk missing"; exit 1; }) - 生成结构化报告:JSON 或 CSV 格式输出检查结果(含项ID、描述、当前值、期望值、状态、修复命令),便于导入 SIEM 或 CMDB
- 支持 --dry-run 模式,仅打印将要执行的操作,不实际更改系统

















