在基础设施即代码(IaC)时代,安全加固不再是手动配置的繁琐任务,而是需要可重复、可验证、可审计的自动化过程。Ansible 作为广泛使用的配置管理工具,其安全自动化能力直接关系到整个基础设施的安全态势。正如 Spacelift 在 2025 年的分析中指出的:"Ansible often holds the keys to your entire infrastructure",一个小的配置失误可能通过自动化放大到数百甚至数千台服务器。
本文将基于 dev-sec hardening collection(GitHub 4.8k stars),深入探讨如何构建一个可复用的 Ansible 安全加固流水线,覆盖 Linux 操作系统、SSH 服务、Nginx 配置和 MySQL 数据库四个关键层面,实现从基础系统到应用服务的全方位防御。
1. dev-sec hardening collection:经过实战检验的安全基线
dev-sec hardening collection 是一个经过实战检验的 Ansible 集合,提供了符合 DevSec Inspec 基线标准的安全加固方案。该集合支持广泛的 Linux 发行版,包括:
- 主流企业发行版:CentOS Stream 9、AlmaLinux 8/9/10、Rocky Linux 8/9/10
- 社区发行版:Debian 11/12/13、Ubuntu 20.04/22.04/24.04
- 其他平台:Amazon Linux、Arch Linux、Fedora 39/40、Suse Tumbleweed(部分支持)
对于数据库和 Web 服务器,支持 MySQL >= 5.7.31、>= 8.0.3,MariaDB >= 5.5.65、>= 10.1.45、>= 10.3.17,以及 Nginx 1.0.16 或更高版本。
1.1 核心架构与角色设计
该集合包含四个核心角色,每个角色都针对特定层面的安全加固:
os_hardening:操作系统级加固
- 内核参数调优(sysctl 配置)
- 文件系统权限与挂载选项
- 用户认证与 PAM 配置
- 审计与日志配置
- 网络栈安全加固
ssh_hardening:SSH 服务加固
- 加密算法配置(禁用弱算法)
- 认证机制控制(禁用密码认证)
- 访问控制列表(AllowUsers/DenyUsers)
- 网络转发限制
- 会话超时配置
nginx_hardening:Nginx 配置加固
- HTTP 头安全配置
- SSL/TLS 最佳实践
- 请求限制与速率控制
- 目录遍历防护
- 信息泄露防护
mysql_hardening:MySQL 数据库加固
- 默认账户安全
- 密码策略强化
- 网络访问控制
- 审计日志配置
- 安全插件启用
2. 可复用的 Playbook 模块设计模式
2.1 模块化角色调用模式
为了实现可复用性,我们采用模块化的 Playbook 设计。以下是一个基础的主 Playbook 结构:
# site.yml - 主加固流水线
- name: 执行全方位安全加固
hosts: all
become: yes
vars:
# 可配置的安全参数
security_level: "high"
compliance_standard: "cis"
pre_tasks:
- name: 验证系统兼容性
ansible.builtin.assert:
that:
- ansible_distribution in supported_distributions
- ansible_distribution_major_version | int >= min_version[ansible_distribution]
roles:
- role: devsec.hardening.os_hardening
vars:
os_hardening_auditd: true
os_hardening_sysctl_enable: true
os_hardening_pam_enable: true
- role: devsec.hardening.ssh_hardening
vars:
ssh_hardening_allow_tcp_forwarding: false
ssh_hardening_permit_root_login: "no"
ssh_hardening_password_authentication: false
- role: devsec.hardening.nginx_hardening
when: "'nginx' in group_names"
vars:
nginx_hardening_ssl_protocols: "TLSv1.2 TLSv1.3"
nginx_hardening_hsts_max_age: 31536000
- role: devsec.hardening.mysql_hardening
when: "'mysql' in group_names"
vars:
mysql_hardening_remove_anonymous_users: true
mysql_hardening_remove_test_database: true
post_tasks:
- name: 执行合规性检查
ansible.builtin.include_role:
name: compliance_checker
2.2 环境特定的变量分层
为了适应不同环境(开发、测试、生产),我们采用变量分层策略:
# group_vars/production/security.yml
security_level: "high"
audit_enabled: true
backup_before_changes: true
# group_vars/development/security.yml
security_level: "medium"
audit_enabled: false
backup_before_changes: false
# host_vars/db-server/security.yml
mysql_hardening_max_connections: 500
mysql_hardening_slow_query_log: true
2.3 条件执行与回滚机制
安全加固可能影响服务可用性,因此需要完善的回滚机制:
- name: 创建配置备份
ansible.builtin.copy:
src: "{{ item.src }}"
dest: "/backup/security/{{ inventory_hostname }}/{{ ansible_date_time.date }}/"
remote_src: true
loop:
- { src: "/etc/ssh/sshd_config" }
- { src: "/etc/nginx/nginx.conf" }
- { src: "/etc/my.cnf" }
register: backup_result
changed_when: false
- name: 执行安全加固
block:
- include_role:
name: devsec.hardening.os_hardening
- include_role:
name: devsec.hardening.ssh_hardening
rescue:
- name: 回滚到备份配置
ansible.builtin.copy:
src: "/backup/security/{{ inventory_hostname }}/{{ ansible_date_time.date }}/{{ item }}"
dest: "/etc/{{ item | dirname }}"
remote_src: true
loop:
- "ssh/sshd_config"
- "nginx/nginx.conf"
- "my.cnf"
- name: 重启受影响的服务
ansible.builtin.service:
name: "{{ item }}"
state: restarted
loop:
- sshd
- nginx
- mysqld
always:
- name: 记录加固操作
ansible.builtin.lineinfile:
path: "/var/log/security/hardening.log"
line: "{{ ansible_date_time.iso8601 }} - {{ inventory_hostname }} - 加固{{ '成功' if not backup_result.failed else '失败回滚' }}"
3. 合规检查流水线设计
3.1 自动化合规验证
dev-sec hardening collection 与 Inspec 基线标准兼容,我们可以构建自动化的合规检查流水线:
# compliance_pipeline.yml
- name: 安全基线合规检查
hosts: all
tasks:
- name: 安装Inspec
ansible.builtin.package:
name: inspec
state: present
- name: 下载DevSec基线配置文件
ansible.builtin.get_url:
url: "https://github.com/dev-sec/{{ item }}-baseline/archive/master.tar.gz"
dest: "/tmp/{{ item }}-baseline.tar.gz"
loop:
- linux
- ssh
- nginx
- mysql
- name: 执行合规检查
ansible.builtin.shell: |
inspec exec /tmp/{{ item }}-baseline.tar.gz \
--reporter json:/tmp/{{ item }}-compliance-{{ inventory_hostname }}.json \
--reporter cli
loop:
- linux
- ssh
- nginx
- mysql
register: compliance_results
- name: 聚合合规报告
ansible.builtin.template:
src: compliance_report.j2
dest: "/var/www/html/compliance/{{ inventory_hostname }}-{{ ansible_date_time.date }}.html"
- name: 发送合规警报
ansible.builtin.mail:
to: "security-team@example.com"
subject: "合规检查结果 - {{ inventory_hostname }}"
body: "{{ compliance_results.results | to_nice_json }}"
when: compliance_results.failed
3.2 持续监控与告警
安全加固不是一次性任务,需要持续监控:
# monitoring_config.yml
- name: 配置安全监控
hosts: all
tasks:
- name: 配置auditd规则
ansible.builtin.template:
src: audit_rules.j2
dest: /etc/audit/rules.d/security-hardening.rules
- name: 配置日志聚合
ansible.builtin.lineinfile:
path: /etc/rsyslog.conf
line: "*.* @log-aggregator.example.com:514"
- name: 配置Prometheus exporter
ansible.builtin.copy:
src: node_exporter.service
dest: /etc/systemd/system/
- name: 配置安全指标
ansible.builtin.template:
src: security_metrics.j2
dest: /etc/prometheus/node_exporter/security_metrics.prom
4. 关键安全参数与最佳实践
4.1 SSH 服务关键参数
ssh_hardening_ciphers:
- "chacha20-poly1305@openssh.com"
- "aes256-gcm@openssh.com"
- "aes128-gcm@openssh.com"
- "aes256-ctr"
- "aes192-ctr"
- "aes128-ctr"
ssh_hardening_macs:
- "hmac-sha2-512-etm@openssh.com"
- "hmac-sha2-256-etm@openssh.com"
- "umac-128-etm@openssh.com"
ssh_hardening_kex_algorithms:
- "curve25519-sha256"
- "curve25519-sha256@libssh.org"
- "ecdh-sha2-nistp521"
- "ecdh-sha2-nistp384"
- "ecdh-sha2-nistp256"
4.2 Nginx 安全头配置
nginx_hardening_headers:
X-Frame-Options: "SAMEORIGIN"
X-Content-Type-Options: "nosniff"
X-XSS-Protection: "1; mode=block"
Referrer-Policy: "strict-origin-when-cross-origin"
Content-Security-Policy: "default-src 'self'"
nginx_hardening_ssl_config:
ssl_protocols: "TLSv1.2 TLSv1.3"
ssl_ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"
ssl_prefer_server_ciphers: "on"
ssl_session_cache: "shared:SSL:10m"
ssl_session_timeout: "10m"
4.3 MySQL 安全配置
mysql_hardening_config:
validate_password.policy: "MEDIUM"
validate_password.length: "12"
validate_password.mixed_case_count: "1"
validate_password.number_count: "1"
validate_password.special_char_count: "1"
max_connect_errors: "100"
skip_name_resolve: "ON"
local_infile: "OFF"
log_error: "/var/log/mysql/error.log"
slow_query_log: "ON"
slow_query_log_file: "/var/log/mysql/slow.log"
long_query_time: "2"
5. 实施策略与风险控制
5.1 分阶段实施策略
-
评估阶段(1-2 周)
- 资产发现与分类
- 当前安全基线评估
- 影响分析
-
试点阶段(2-4 周)
- 选择非关键系统进行试点
- 监控性能与稳定性影响
- 调整配置参数
-
推广阶段(4-8 周)
- 按业务重要性分批实施
- 建立回滚机制
- 培训运维团队
-
运维阶段(持续)
- 定期合规检查
- 配置变更管理
- 安全事件响应
5.2 风险缓解措施
-
配置漂移防护
- 使用 Git 进行配置版本控制
- 定期执行配置一致性检查
- 实施变更审批流程
-
服务中断预防
- 在维护窗口执行加固
- 实施蓝绿部署策略
- 建立快速回滚机制
-
性能影响监控
- 基线性能指标收集
- 实时性能监控
- 性能回归测试
6. 自动化流水线集成
6.1 CI/CD 流水线集成
将安全加固集成到 CI/CD 流水线中,实现安全左移:
# .gitlab-ci.yml 示例
stages:
- test
- security-scan
- deploy
- post-deploy-hardening
security-hardening:
stage: post-deploy-hardening
script:
- ansible-playbook -i production site.yml --tags security
only:
- production
when: manual
allow_failure: false
6.2 基础设施即代码集成
在 Terraform 或 CloudFormation 中集成安全加固:
# Terraform配置示例
resource "null_resource" "security_hardening" {
triggers = {
instance_id = aws_instance.web.id
}
provisioner "local-exec" {
command = <<EOT
ansible-playbook \
-i ${aws_instance.web.public_ip}, \
-u ubuntu \
--private-key ${var.private_key_path} \
security-hardening.yml
EOT
}
}
7. 监控与度量指标
建立关键安全指标(KSI)体系:
-
合规性指标
- 基线合规率(%)
- 关键控制覆盖率
- 不合规项平均修复时间
-
安全态势指标
- 漏洞暴露时间
- 配置漂移检测率
- 安全事件响应时间
-
运营效率指标
- 自动化加固成功率
- 平均加固时间
- 回滚频率与原因
结论
基于 dev-sec hardening collection 构建的 Ansible 安全加固流水线,不仅提供了经过实战检验的安全配置,更重要的是建立了一个可重复、可验证、可审计的自动化安全流程。通过模块化的 Playbook 设计、分层的变量管理、完善的回滚机制和持续的合规监控,我们能够在保证服务可用性的同时,系统性地提升基础设施的安全水平。
安全加固不是一次性的项目,而是一个持续的过程。随着威胁态势的变化和技术栈的演进,安全配置也需要不断更新和优化。通过将安全加固深度集成到基础设施生命周期管理中,我们能够实现安全左移,在问题发生前预防,在风险暴露前修复,真正构建起纵深防御的安全体系。
资料来源
- dev-sec/ansible-collection-hardening - GitHub - 提供经过实战测试的 Linux、SSH、Nginx、MySQL 加固
- Ansible Security Automation: Risks & 7 Best Practices - Medium - Ansible 安全自动化最佳实践分析