实现linux服务器“一键合规”的核心是封装人工检查为自动化流程,需覆盖等保2.0/cis基线、具备幂等性与回退能力,并通过ansible分角色管理ssh、密码策略、防火墙等五类加固,辅以预检、验证和报告机制。

实现Linux服务器安全基线的“一键合规”配置,核心是把人工逐项检查、修改、验证的过程,封装成可重复执行、结果可预期的自动化流程。关键不在于脚本语言本身,而在于是否覆盖真实合规要求(如等保2.0、CIS Benchmark)、是否具备幂等性与回退能力、是否适配不同发行版和环境差异。
覆盖真实基线项,拒绝“假加固”
很多脚本只改几个参数就号称“已加固”,但实际漏掉关键项。一个可用的一键脚本必须包含以下五类基础加固:
-
账户认证:强制密码最小长度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更可靠
Shell脚本容易因路径、权限、命令返回值处理不当导致半途失败或误操作。Ansible原生模块天然支持幂等、备份、条件跳过和错误中断,更适合生产环境:
- 用
lineinfile修改/etc/ssh/sshd_config,自动备份原文件(backup: true) - 用
sysctl模块设置内核参数,避免手动echo+sysctl -p出错 - 用
user模块创建管理账号,同时设密码策略和shell限制 - 用
community.general.expect验证加固后效果(例如确认sshd -t无报错、grep PermitRootLogin /etc/ssh/sshd_config输出no)
分角色+变量驱动,一套脚本适配多环境
开发、测试、生产环境的安全策略常有差异(比如是否改SSH端口、是否启用SELinux),硬编码会导致维护困难。推荐按Role组织:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
roles/ssh-hardening:含SSH配置任务、密钥分发逻辑 -
roles/password-policy:统一管理PAM模块和login.defs -
roles/firewall-config:根据env_type: prod自动开闭特定端口
主playbook中通过vars_files: group_vars/{{ env_type }}.yml注入变量,例如:enable_ssh_port_change: falsemax_password_age: 90allow_ssh_users: ["admin", "deploy"]
预检+验证+报告,才算真正“一键合规”
合规不是“跑完就完”,而是“改得对、验得准、留得下”。建议在playbook中加入:
-
预检阶段:检查
/etc/.baseline-applied标记是否存在,或用command模块读取当前PermitRootLogin值,failed_when跳过已符合项 -
验证阶段:加固后执行
auditctl -s确认auditd运行;用stat模块校验/etc/shadow权限;调用自定义check脚本输出PASS/FAIL清单 -
报告阶段:将验证结果写入
/var/log/security-baseline-report-$(date +%F).log,包含时间戳、主机名、变更项、验证状态
不复杂但容易忽略。










