适用场景
Ansible 安全自动化适用于以下场景:企业拥有几十台甚至上百台 Linux 服务器,需要统一执行安全基线加固(SSH 配置、防火墙、密码策略);新购服务器需要快速完成合规配置后再交付业务;或者安全团队希望把加固过程固化为代码,实现可审计、可回滚、可重复执行的配置管理。
前置条件
- 一台控制机(可为任意 Linux/macOS 主机),安装 Ansible 2.9 以上版本
- 目标服务器开启 SSH 服务,控制机拥有免密登录权限
- 目标服务器为 CentOS/RHEL 或 Ubuntu/Debian 等主流发行版
原理说明
Ansible 采用无代理架构,控制机通过 SSH 协议连接目标主机执行模块化任务,不需要在目标机上安装任何客户端。安全加固的核心是编写 Playbook,用声明式语法描述期望的最终状态,例如 SSH 禁止密码登录、防火墙仅放行必要端口、密码过期策略等。Ansible 的幂等特性保证重复执行结果一致,配合 --check 模式可先预览变更,大幅降低批量变更的风险。
操作步骤
第一步:安装 Ansible 并准备主机清单
pip install ansible
# 编辑主机清单 /etc/ansible/hosts
[webservers]
web01 ansible_host=192.168.1.11
web02 ansible_host=192.168.1.12
# 测试连通性
ansible webservers -m ping
第二步:编写安全加固 Playbook
# secure.yml
- hosts: webservers
become: yes
tasks:
- name: SSH 禁止 root 远程登录
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^PermitRootLogin'
line: 'PermitRootLogin no'
notify: restart sshd
- name: 防火墙仅放行 22/80/443
firewalld:
port: "{{ item }}"
permanent: yes
state: enabled
immediate: yes
loop:
- 22/tcp
- 80/tcp
- 443/tcp
- name: 设置密码最长有效期 90 天
lineinfile:
path: /etc/login.defs
regexp: '^PASS_MAX_DAYS'
line: 'PASS_MAX_DAYS 90'
handlers:
- name: restart sshd
service:
name: sshd
state: restarted
第三步:先检查后执行
# 演练模式,仅输出将要发生的变更
ansible-playbook secure.yml --check
# 正式执行
ansible-playbook secure.yml
配置验证
验证要点:再次执行 ansible-playbook secure.yml 时所有任务显示 ok 且无 changed,说明配置已达到目标状态(幂等验证);SSH 使用密码登录应被拒绝,root 远程登录失败;防火墙仅放行指定端口,其余端口连接超时。
常见问题
Q1:执行加固后自己 SSH 连不上了怎么办?
这是最典型的翻车场景。建议执行前先开启一个保持连接的终端,确认当前会话不受影响;修改 SSH 配置前可在控制机另开窗口测试 ssh 连通性,并在 Playbook 中对 sshd 配置使用 validate 参数先做语法检查,配置错误时自动回滚。
Q2:如何区分不同环境的加固策略?
使用 Ansible 的 group_vars 与 host_vars 目录,按环境(开发/测试/生产)维护独立的变量文件,例如生产环境强制 PermitRootLogin no 与更严格的密码策略,开发环境可适度放宽,Playbook 中通过变量引用实现差异化。
总结
Ansible 安全自动化把重复的人工加固流程转化为可复用的代码,一次编写即可批量应用到全部服务器,配合 –check 演练与幂等机制,兼顾效率与安全。对多服务器环境而言,这是从人工运维走向安全基线标准化管理的关键一步。