ansible-collection-hardening 中 os_hardening 角色的演进全解析:从 v1.0.0 到 v6.2.0 的版本变迁与加固技术要点

发布时间:2026/10/2 8:02:35
ansible-collection-hardening 中 os_hardening 角色的演进全解析:从 v1.0.0 到 v6.2.0 的版本变迁与加固技术要点 网络安全运维应用安全【免费下载链接】ansible-collection-hardeningThis Ansible collection provides battle tested hardening for Linux, SSH, nginx, MySQL项目地址https://gitcode.com/GitHub_Trending/an/ansible-collection-hardening点击查看免费下载这篇技术指南以仓库中的 OS_HARDENING_CHANGELOG.md 为骨架系统梳理devsec.hardening.os_hardening这个 Linux 基线加固角色从 2015 年 v1.0.0 到 2020 年 v6.2.0 的完整版本历史每一个功能增强、Bug 修复、平台支持与质量改进背后的技术动机并对照当前仓库roles/os_hardening/的源码实现逐项印证。读完你可以掌握该角色的能力边界、每个加固项的底层落点以及如何用sysctl_overwrite、os_ignore_users等变量在生产环境中安全地自定义加固策略。一、角色定位os_hardening 是什么os_hardening是 ansible-collection-hardening 集合中的核心角色之一定位是提供全方位的基础防护all-round base protection设计目标是兼容 DevSec Linux Baseline它负责配置以下内容移除不再使用的 yum 仓库并启用 GPG 密钥检查移除有已知问题的软件包配置 PAM 进行强密码检查安装并配置 auditd 审计守护进程通过软限制禁用 core dump设置受限的 umask配置系统路径下文件的可执行权限加固 shadow 与 passwd 文件的访问权限禁用不使用的文件系统禁用 rhosts配置安全终端securetty通过 sysctl 配置内核参数在 EL 系系统上启用 SELinux移除 SUID/SGID 位配置系统账户的登录与密码策略。同时它明确不会做两件事不更新系统软件包、不安装安全补丁——这是它与其他系统管理角色的边界。从源码结构看任务被拆分为 20 余个职责单一的文件tasks/hardening.yml 是调度中枢先通过ansible.builtin.setup采集 facts、用include_vars加载发行版专属变量再按开关变量逐个import_tasks导入auditd.yml、cron.yml、ctrlaltdel.yml、limits.yml、login_defs.yml、minimize_access.yml、pam.yml、modprobe.yml、profile.yml、securetty.yml、suid_sgid.yml、sysctl.yml、user_accounts.yml、rhosts.yml、netrc.yml、yum.yml、apt.yml、selinux.yml。每个模块都有独立的启用开关如os_auditd_enabled、os_pam_enabled、os_sysctl_enabled等这让按需加固成为可能。二、版本发布总览五年 21 个版本OS_HARDENING_CHANGELOG.md 记录了从 2015 年 9 月到 2020 年 8 月的 21 个版本该文档对应的上游项目为独立的 ansible-os-hardening 角色仓库后在集合时代合并进 ansible-collection-hardening。按时间线整理如下版本发布日期版本性质与关键事件1.0.02015-09-01首个正式版本确立模块化任务拆分、sysctl 加载、禁用系统账户等基础能力2.0.02015-11-28目录结构重构修复 PAM 更新逻辑与 nologin shell 路径3.0.02016-03-13Ansible 2.0 支持引入 inspec 测试框架sys_uid/sys_gid 可配置3.1 / 3.1.02016-07/08CentOS 7 支持、Docker 支持、--check 模式、ufw 默认策略管理3.2.02016-10-24RHEL7 启用 pam_pwquality修复 SELinux 依赖4.0.02017-03-14Ansible 2.4 语法、Debian 系 shadow 属主调整、RHEL7 支持完善4.1.02017-06-27sysctl 参数扩充且可覆盖修复 JSON 序列化问题4.2.02017-08-08新增 modprobe 模板、netrc 清理、passwd 任务、移除 prelink4.3.0 / 4.3.12017-09 ~ 2018-01内核参数扩充、core dump 配置可移除、系统账户不建 home修复 sysrq 未实现问题5.0.02018-09-02auditd 安装配置、Amazon Linux 支持、os_hardening_enabled 开关、Oracle 75.1.02018-10-17Ubuntu 18.04 支持、auditd 可禁用5.2.0 / 5.2.12019-05/06Fedora 支持、minimize_access 提速、修复 login.defs 模板 ENV_PATH6.0.02020-05-05大版本SELinux 默认 enforcing、CentOS 8/Debian Buster/OpenSUSE 支持、audit1、ansible-lint6.0.1 ~ 6.0.32020-05~06引入 changelog/release 自动化、移除不安全软件包purge insecure packages6.1.02020-07-21proc 文件系统 hidepid 挂载选项6.2.02020-08-17最终版本when 子句统一、用 find 模块替代 shell、hidepid 变量下沉到 defaults 可覆盖三、内核与 sysctl 加固的演进sysctl 内核参数加固是整个角色最早的核心能力之一从 v1.0.0 就存在PR #20 Change sysctl-task并持续进化v1.0.0引入 sysctl 任务与 IP 转发禁用条件PR #16修复 Sysctl 重载问题issue #18。v4.1.0PR #120 add more sysctl settings, allow overwriting 大幅扩充 sysctl 参数并第一次引入可覆盖机制这是sysctl_overwrite的雏形。v6.0.0PR #263 引入来自 Tails 与 CIS Benchmark 的内核加固参数使配置标准从 NSA 指南扩展到社区公认基线同时加入kernel.yama.ptrace_scope、kernel.kptr_restrict、fs.suid_dumpable等防御性参数对应 README 中Add kernel parameter information to READMEPR #259。在当前仓库中这些演进沉淀为 tasks/sysctl.yml 的具体实现- name: Protect sysctl.conf ansible.builtin.file: path: /etc/sysctl.d/90-dev-sec.conf owner: root group: root mode: 0440 state: touch modification_time: preserve access_time: preserve - name: Change various sysctl-settings, look at the sysctl-vars file for documentation ansible.posix.sysctl: name: {{ item.key }} value: {{ item.value }} sysctl_set: true sysctl_file: /etc/sysctl.d/90-dev-sec.conf state: present reload: true ignoreerrors: true with_dict: {{ ((sysctl_config | combine(sysctl_custom_config | default({}))) | combine(sysctl_rhel_config | default({}))) | combine(sysctl_overwrite | default({})) }}注意两个细节一是所有 sysctl 写入独立文件/etc/sysctl.d/90-dev-sec.conf而非直接修改/etc/sysctl.conf这正是 v7.1.0 时期Dont modify /etc/sysctl.confissue #343思路的延续避免污染发行版原生配置二是sysctl_config、sysctl_custom_config、sysctl_rhel_config、sysctl_overwrite四层字典通过combine合并用户自定义优先级最高——这就是 README 中Changing sysctl variables一节描述的能力例如- hosts: all become: true roles: - devsec.hardening.os_hardening vars: sysctl_overwrite: net.ipv4.ip_forward: 1sysctl_config的默认值在 README 中完整列出涵盖三类内核防护kernel.randomize_va_space: 2ASLR 全开、kernel.kptr_restrict: 2、kernel.dmesg_restrict、kernel.yama.ptrace_scope: 2仅特权用户可 ptrace对应 10.6.0 的 Restrict ptrace attach to privileged users、fs.suid_dumpable: 0、vm.mmap_min_addr: 65536、vm.mmap_rnd_bits: 32。网络加固net.ipv4.conf.all.rp_filter: 1反向路径过滤、net.ipv4.conf.all.accept_source_route: 0、net.ipv4.conf.all.accept_redirects: 0、net.ipv4.tcp_syncookies: 1SYN Cookie对应 v7.1.0 PR #372 Syncookie、net.ipv4.conf.all.log_martians: 1、IPv6 的accept_ra/autoconf/router_solicitations全部置 0 等。文件系统保护fs.protected_hardlinks: 1、fs.protected_symlinks: 1、fs.protected_fifos: 1、fs.protected_regular: 2对应 v7.13.0 PR #494 implement sysctl-34 与 issue #536 修复。需要特别提醒的是 README 记录的已知限制vm.mmap_rnd_bits默认 32某些系统内核仅支持更小值会报错issue #757此时必须用sysctl_overwrite覆盖例如设为 16。四、PAM 与密码策略跨发行版的老大难战场PAM 配置是变更记录中篇幅最大的主题之一也是每个发行版都各自为政的领域。角色采取的策略是为每个发行版家族维护独立 PAM 实现源码中体现为 tasks/pam.yml 入口下分流到 pam_debian.yml 与 pam_rhel.yml模板则分usr/share/pam-configs/Debian 系 pam-config 框架与etc/pam.d/rhel_auth.j2RHEL 系两套。关键演进节点v1.0.0pam passwdqc 模板初版PR #51后因权限错误在 v5.0.0 修复PR #176issue #170。v3.2.0修复 CentOS 7 仍错误使用 pam_passwdqc.so 的问题为 RHEL 7 启用 pam_pwqualityPR #94issue #73。v7.3.0PR #392 全面重构 PAM 处理并适配当时所有受支持发行版pam_tally2 在 RHEL 8 已废弃改用 pam_faillockissue #273、#377这正是模板目录中同时存在pam_faillock.j2、pam_faillock_authfail.j2、pam_tally2.j2、pam_passwdqc.j2的原因。v7.4.0密码记忆从 pam_unix 的 remember 迁移到 pam_pwhistory.soPR #431并支持os_auth_pw_remember变量v7.9.0 起可配置PR #467。v8.4.0修复os_auth_retries在 PAM 任务中的类型比较错误PR #594。v10.2.0PR #835 修改 PAM允许密码被锁定的用户仍能通过 SSH 密钥登录。README 详细说明了 PAM 的可配置项os_auth_pam_passwdqc_enable默认 true、os_auth_pam_passwdqc_options默认mindisabled,disabled,16,12,8、os_auth_pam_pwquality_options、os_auth_retries默认 5 次失败锁定、os_auth_lockout_time默认 600 秒、os_auth_timeout默认 60 秒认证超时。同时给出重要提示如果设置密码过期而用户同时使用 SSH 密钥登录默认 PAM 配置会把密钥登录也一并拦截角色通过pam_unix.so no_pass_expiry放在account阶段解决自建 PAM 配置时必须手动加入该参数account required pam_unix.so no_pass_expiry五、审计auditd 从安装到精细化配置auditd 是在 v5.0.0 正式进入角色的PR #144 install and configure auditd - fix inspec package-08随后经历长期参数化演进v5.1.0PR #192 增加os_auditd_enabled开关解决无特权 LXC 容器中 auditd 导致失败的问题issue #191。v6.0.0配置audit1内核启动参数以获取更准确的 auid 审计issue #253。v6.2.0 之后集合时代max_log_file_actionPR #246、max_log_filePR #370、num_logsPR #617、action_mail_acctPR #631、name_formatPR #810等 auditd.conf 选项陆续参数化。当前实现见 tasks/auditd.yml安装 auditd 包、用{{ os_auditd_template }}模板渲染/etc/audit/auditd.confowner root、group root、mode 0640并 notify 两个 handlerservice 与 systemd 两种重启路径后者用于 Arch 等发行版见 v9.0.1 PR #722。此外还禁用systemd-journald-audit.socket以避免双重审计10.5.0 PR #902SUSE 因无此 socket 而跳过。模板位于 templates/etc/audit/auditd.conf.j2README 提供了完整参数表例如os_auditd_space_left: 75、os_auditd_space_left_action: SYSLOGos_auditd_admin_space_left: 50、os_auditd_admin_space_left_action: SUSPENDos_auditd_max_log_file: 6MB、os_auditd_max_log_file_action: keep_logs、os_auditd_num_logs: 5os_auditd_flush: INCREMENTAL、os_auditd_log_format: RAW、os_auditd_log_group: root、os_auditd_name_format: NONE。另外README 专门解释了Improving Kernel Audit logging默认情况下在 auditd 启动前运行的所有进程 AUID 都是4294967295建议在内核启动参数中加入audit1以获得更精确的审计归属这是 v6.0.0 该 PR 的落地建议。六、文件系统与挂载点加固这一主题在 changelog 中同样贯穿始终且踩过不少坑v5.0.0修复 efi 与 vfat 冲突问题PR #190issue #162默认禁用 vfat 前必须确认未使用 UEFIv6.2.0 进一步修复 vfat added to dev-sec.conf, but efi is usedissue #288并通过 PR #289 do not blacklist used filesystems 避免误禁正在使用的文件系统。v6.1.0PR #283 使用 hidepid 选项挂载 proc 文件系统v7.1.0 修复 RHEL/CentOS 7 上 hidepid2 触发 polkit 报错的问题PR #369见 README hidepid on RHEL/CentOS 7 一节EL7 上回退为 hidepid0v7.14.0 将任务状态改为 mountedPR #510hidepid 变量下沉到 defaults 使其可覆盖v6.2.0 PR #285。v7.15.0PR #531 开始硬化挂载点mountpoints并在 v8.0.0 的 PR #555 rework filesystem hardening 中系统化形成当前 README 中庞大的os_mnt_*变量族os_mnt_tmp_*默认rw,nosuid,nodev,noexec、os_mnt_dev_shm_*rw,nosuid,nodev,noexec目录模式 1777、os_mnt_var_log_audit_*、os_mnt_boot_*等覆盖 dump/passno/filesystem/src/options 全套 fstab 字段且多数默认不启用os_mnt_*_enabled: false按需开启。modprobe 禁用文件系统列表当前默认值为[cramfs, freevxfs, jffs2, hfs, hfsplus, squashfs, udf, vfat, dccp, rds, sctp, tipc]v4.2.0 PR #138 引入 modprobe 模板控制 os-10v7.13.0 增补 dccp/rds/sctp/tipc 等不安全协议模块。可用os_filesystem_whitelist放行模板见 templates/etc/modprobe.d/modprobe.j2权限 0644v5.2.0 PR #211 修正。七、SUID/SGID 收权黑名单、白名单与性能优化移除不必要的 SUID/SGID 位是 v1.0.0 就具备的能力PR #12 Add remove suid/sgid function但早期实现问题频出v3.0.0 修复 CentOS 7.1 上删除过多的故障issue #72、#64v5.2.0 针对 RHEL 7.4 Too many setuid bits removedissue #140再次修正。v5.2.0 还通过 PR #209/PR #208 将minimize access on found files任务提速用 find 模块替代 shell 遍历v6.2.0 PR #294 进一步落实。当前机制记录在 vars/main.yml分为系统黑名单NSA 提供的 rcp/rlogin/rsh、ssh-keysign、pppd、arping 等必须收权项与系统白名单mount、ping、su、passwd、sudo、crontab、screen 等必须保留项。用户通过os_security_suid_sgid_blacklist、os_security_suid_sgid_whitelist扩展通过os_security_suid_sgid_remove_from_unknown决定是否扫描并移除黑名单/白名单之外的所有 SUID/SGID 位默认 false避免误伤。v5.1.0 PR #199 将/usr/bin/su加入白名单同时修复仅当os_security_users_allow含change_user时 su 权限不被限制到 root的问题PR #197issue #175。八、账户管理系统账户禁用、密码期限与 UID0 治理账户加固经历了从简单禁用到按 UID 区间精确分类的演进v1.0.0PR #25 禁用系统账户issue #6。v3.0.0PR #62 使sys_uid/sys_gid可配置为后续按 UID 区分账户奠定基础。v4.3.0PR #156 系统账户不再创建 home 目录。v8.3.0 ~ v8.5.0PR #579 增加 root 账户加固PR #582 将密码期限应用到既有普通用户PR #621 重写系统账户检测与加固逻辑PR #628 使密码过期前警告天数可配置v10.3.0 PR #839 对既有用户设置密码过期警告天数。当前实现见 tasks/user_accounts.yml逻辑非常清晰用getent读取 passwd 与 shadow 数据库按 UID 区间抽取系统账户0 uid os_auth_sys_uid_max、普通账户os_auth_uid_min uid os_auth_uid_max与root 账户uid 0并跳过os_always_ignore_usersvars 中硬编码[root, sync, shutdown, halt]与os_ignore_usersdefaults 中默认[vagrant, kitchen]README 明确提示用 inspec 测试时务必把连接用户加进来见 issue #124对普通账户设置password_expire_max/password_expire_warn但跳过 shadow 中密码哈希为*/!的锁定账户v11.0.0 已移除最小密码期限要求PR #975root 账户 home 目录强制 0700可选设置 root 密码期限os_rootuser_pw_ageing默认 false可选删除 UID0 的多余账户os_remove_additional_root_users仅保留 root。login.defs 模板templates/etc/login.defs.j2则控制新建用户默认值UID/GID 范围os_auth_uid_min/max、os_auth_gid_min/max、子 UID/GID 范围os_auth_sub_uid_min/max/countv7.9.0 PR #463 引入、SHA 加密轮数os_sha_crypt_min_rounds/max_rounds默认 640000v7.8.0 PR #452 提升issue #365。九、平台支持矩阵的持续扩张变更记录中最直观的演进是受支持平台版图从最初仅 Debian/RHEL 家族一路扩展到v3.1.0CentOS 7PR #91v5.0.0Amazon LinuxPR #158v5.2.1 增加 Amazon 2PR #624、Oracle Linux 7v5.1.0Ubuntu 18.04PR #196v5.2.0FedoraPR #206v6.0.0 修复 Fedora 构建PR #296v6.0.0Debian BusterPR #234、CentOS 8PR #237、OpenSUSEPR #250issue #249 关闭v7.0.0 之后集合时代Arch LinuxPR #303、Rocky Linux 8PR #454、Debian 11/12、Ubuntu 22.04/24.04、EL 9/10 等持续跟进。平台差异通过 vars 目录下的发行版文件实现vars/Debian.yml、vars/RedHat.yml、vars/Ubuntu.yml、vars/Fedora.yml、vars/Suse.yml、vars/Archlinux.yml、vars/Amazon.yml 等由 hardening.yml 通过with_first_found按distribution_major_version → distribution → os_family_major → os_family的优先级链自动选择且仅当用户未定义同名变量时才用 os_vars 覆盖避免覆盖用户自定义。同时跨发行版的正确性修复也值得注意Debian 系/etc/shadow属主在 v4.0.0 修正PR #117SUSE 的 shadow 权限在 v7.0.0 时期修正PR #311Fedora 上 dnf 使用自动 python 解释器PR #239等。十、测试、CI 与工程质量从 Travis 到 Molecule Inspec变更记录后半段的显著特征是工程化建设测试框架v3.0.0 引入 inspec 作为测试框架PR #58v4.3.0 起使用 Molecule/TestInfraissue #128 关闭v6.0.0 增加 Debian Buster/CentOS 8 测试v6.2.0 PR #287 改进测试。静态检查v6.0.0 引入 ansible-lintPR #262v5.2.1 修复 Ansible 2.8 弃用警告PR #224。check modev3.1.0 支持 --check 模式PR #93v8.7.0 将 check mode 加入 Molecule 测试。代码质量v6.0.0 Standardize the var orderingPR #251、Use ansible facts for varsPR #226、v6.2.0 Optimize and unify when clausePR #295与 use find module instead of shellPR #294。发布流程v6.0.1 增加 changelog 与 release workflowPR #271、#270github_changelog_generator 自动生成文档末尾有说明v6.0.3 统一 changelog 与 release 动作PR #279。当前仓库中对应证据molecule/os_hardening/与molecule/os_hardening_vm/两个测试场景前者容器化、后者虚拟机化内含converge.yml、verify.ymlansible 断言、prepare_tasks/如 ignore_home_folders.yml、netrc.yml、pw_ageing.yml、sys_account_shell.yml 等准备任务直接对应前文提到的账户/密码/家目录加固路径以及 waivers.yaml跳过控制项的豁免清单v7.14.2 PR #529 引入。十一、版本历史的实战启示回看这份变更记录可以提炼出对使用者有直接价值的经验默认值不是圣旨历史上多个 Bug 都源于默认值在特定平台不成立——vm.mmap_rnd_bits默认 32 在部分内核报错、hidepid2 在 EL7 触发 polkit 报错、vfat 默认禁用撞上 UEFI 系统。今天的 README 把这些都写进 Known Limitations并给出sysctl_overwrite的覆盖范式。生产环境务必先在小规模验证再全量应用。可覆盖性是设计主线sysctl_overwrite取代旧版整个覆盖 sysctl_dict的做法README Changing sysctl variables 一节明确说明hidepid 变量从 vars 下沉到 defaults 也是为了可覆盖v6.2.0 PR #285。凡是在 defaults/ 下的变量defaults/main.yml都可以安全覆盖而 vars/ 下的系统变量如 suid 系统黑白名单默认不应改动。逐模块开关是安全网os_auditd_enabled、os_pam_enabled、os_sysctl_enabled、os_selinux_enabled、os_hardening_enabled等开关让角色可以从全量加固退化为单点加固在容器、无特权 LXC 等受限环境auditd 曾导致 v5.0.0 在 LXC 失败下尤其重要。Docker 有专门例外README 明确说明使用 Docker/KubernetesDocker 时必须覆盖net.ipv4.ip_forward: 1sysctl 任务本身也排除了 docker/lxc/openvz 虚拟化类型sysctl.yml 的 when 条件说明角色设计上就区分了容器与虚拟机场景。十二、结语OS_HARDENING_CHANGELOG.md 虽然只是一份变更记录但它忠实记录了os_hardening角色从 2015 年一个移除 suid、禁用系统账户、调 sysctl的小角色进化为覆盖内核参数、PAM、auditd、文件系统、账户、SELinux 六大维度的 Linux 基线加固方案的全过程。这份历史在今天依然有指导意义每一行默认配置背后都对应着一个真实故障或一个安全基线的要求理解为什么这么改比单纯照搬配置更能让你在复杂环境中安全地驾驭这套角色。若需查看最新能力与完整变量表可直接阅读 roles/os_hardening/README.md若关注后续版本集合时代 7.0.0 起的演进可对照仓库根目录的 CHANGELOG.md。赞分享网络安全运维应用安全【免费下载链接】ansible-collection-hardeningThis Ansible collection provides battle tested hardening for Linux, SSH, nginx, MySQL项目地址https://gitcode.com/GitHub_Trending/an/ansible-collection-hardening点击查看免费下载相关推荐svgr 版本演进全解析从 CHANGELOG 与源码看 8 个大版本的技术变迁与迁移要点svgr 版本演进全解析从 CHANGELOG 与源码看 8 个大版本的技术变迁与迁移要点 本文以仓库根目录的 CHANGELOG.md https://li前端开发工具devsec.nginx_hardeningAnsible Collection 中 nginx 加固角色从 1.0.0 到 2.1.0 的演进与完整配置指南devsec.nginx_hardeningAnsible Collection 中 nginx 加固角色从 1.0.0 到 2.1.0 的演进与完整配置指南网络安全运维应用安全开机卡 Logo 不用慌用 MTKClient 给联发科手机做完整备份与救砖的实战路线图开机卡 Logo 不用慌用 MTKClient 给联发科手机做完整备份与救砖的实战路线图 MTKClient 是一款面向联发科MediaTek芯片设备的免网络安全运维应用安全上一篇联想拯救者Y7000系列Insyde BIOS高级设置完整指南解锁隐藏功能优化黑苹果体验下一篇如何解锁iOS终极自定义misakaX工具完整使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询