Ansible比Shell更可靠,因其天然支持幂等、备份和条件执行;需覆盖账户认证、SSH加固、服务网络、日志审计、文件系统五类核心项,并通过角色拆分、变量驱动、预检验证与结构化报告实现真正“一键合规”。

实现Linux服务器“一键合规”,关键不是写一个能跑通的脚本,而是把等保2.0或CIS这类真实基线要求,变成可重复、可验证、出错能回退的自动化流程。纯Shell脚本能做,但容易因权限、路径或命令返回值异常导致半途失败;Ansible更适配生产环境,它天然支持幂等、备份和条件执行。
覆盖五类核心加固项,拒绝“假合规”
很多所谓“一键加固”只改几个配置就收工,实际漏掉关键项。真正可用的脚本必须包含以下基础内容:
-
账户认证:强制密码最小长度8位、含大小写字母+数字、90天过期(
PASS_MAX_DAYS 90)、5次失败锁定(pam_faillock)、禁用空密码(awk -F: '($2 == "") {print $1}' /etc/shadow) -
SSH加固:禁用SSH v1、关闭
PermitRootLogin yes、启用PubkeyAuthentication yes、限制允许登录用户(AllowUsers) -
服务与网络:停用telnet/rsh/ftp等明文协议;firewalld默认拒绝入站,仅开放业务端口;关闭ICMP响应(
sysctl -w net.ipv4.icmp_echo_ignore_all=1) -
日志审计:启用
auditd并加载CIS规则;/var/log/secure等日志权限设为600;配置rsyslog转发至中心日志服务器(支持TLS) -
文件系统:
/tmp和/var/tmp挂载选项加noexec,nosuid,nodev;/etc/shadow权限强制为000;umask设为027
用Ansible代替Shell,提升可靠性
Ansible原生模块能规避Shell脚本常见风险,比如手动echo写配置易出错、权限处理不统一、无法自动备份等:
- 用
lineinfile修改/etc/ssh/sshd_config,开启backup: true自动保存原文件 - 用
sysctl模块设置内核参数,避免echo xxx > /proc/sys/xxx后忘记sysctl -p - 用
user模块创建管理账号,同时设定密码策略、shell类型和sudo权限 - 用
community.general.expect验证加固效果,例如确认sshd -t无语法错误、grep PermitRootLogin /etc/ssh/sshd_config输出no
按角色拆分+变量驱动,适配多环境
开发、测试、生产环境的安全策略常有差异(如是否改SSH端口、是否启用SELinux),硬编码会导致维护困难。推荐做法是:
- 将不同模块拆成独立role,例如
role/ssh-secure、role/auditd-config、role/password-policy - 在主playbook中通过
roles:列表声明启用哪些加固项 - 用
group_vars或vars_files控制差异化参数,例如max_password_age: 90、enable_ssh_port_change: false - 按发行版区分变量,如
roles/hardening/vars/CentOS-8.yml和roles/hardening/vars/Ubuntu-22.04.yml
加入预检、验证与报告机制
部署完成不等于合规完成。可靠的一键流程必须包含闭环控制:
- 开头加预检task:检查是否已打过基线(如通过标记文件
/etc/.security-baseline-applied),或校验当前值是否已符合(如用command模块+failed_when跳过已生效项) - 每个加固任务后紧跟验证task:确认配置已写入、服务已重载、权限已生效
- 支持
--check --diff模式预览变更,生产环境先单台--limit测试 - 用callback插件(如
community.general.yaml)生成结构化报告,记录每台主机的变更项、失败项、跳过原因


















