Ansible 安全自动化实战:批量服务器安全加固配置指南

适用场景

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 演练与幂等机制,兼顾效率与安全。对多服务器环境而言,这是从人工运维走向安全基线标准化管理的关键一步。