不同发行版安全默认差异需分三步识别:统一采集/etc/shadow、SSH策略、服务状态、内核参数、PAM配置五类项;用YAML基线模板+发行版补丁文件标准化比对;借Ansible Facts自动适配上下文,报告须含触发条件、影响范围、修复成本及兼容性提示。

直接对比不同发行版的安全默认差异,不能靠“一键扫描就出结论”,而要分三步走:先统一采集项、再标准化比对逻辑、最后按发行版打标签。重点不是看谁更“安全”,而是识别哪些默认配置会直接影响你选型和加固路径。
统一采集核心配置项
不同发行版的配置散落在不同位置,必须用同一套命令集抓取,避免因路径差异误判。重点关注以下五类:
-
/etc/shadow:执行
sudo awk -F: '$2 != "*" && $2 != "!" {print $1, $2}' /etc/shadow,看哪些账户有可解密密码哈希(如$6$开头)而非锁定标记 -
SSH默认策略:查
grep -E "^(PermitRootLogin|PasswordAuthentication|PubkeyAuthentication)" /etc/ssh/sshd_config 2>/dev/null,注意Ubuntu默认开PasswordAuthentication,RHEL/CentOS 8+默认关 -
服务开机状态:用
systemctl list-unit-files --state=enabled --no-pager | grep -E "(vsftpd|snmpd|telnet|xinetd|cockpit)",AlmaLinux 9默认不装vsftpd,但Ubuntu Server 22.04可能预装snap版 -
内核参数默认值:运行
sysctl net.ipv4.ip_forward net.ipv4.conf.all.send_redirects net.ipv4.icmp_echo_ignore_all,Debian系常默认关闭转发,RHEL系部分版本默认开启转发 -
PAM密码策略源头:检查
/etc/pam.d/common-password(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL系),看是否已加载pam_pwquality.so或pam_pwcheck.so
用YAML定义基线模板,按发行版打补丁
别写一堆if-else判断发行版,而是把通用规则和发行版特例分开管理。例如建一个 baseline-core.yaml 定义所有系统都该满足的底线:
password_min_len: 8 password_reuse_limit: 5 ssh_permit_root: prohibit-password firewall_default_policy: DROP
再为每个发行版建补丁文件,如 patch-rhel9.yaml:
ssh_password_auth: "no" # RHEL 9默认禁用 pam_module: "system-auth" sysctl_file: "/etc/sysctl.d/99-rhel9-secure.conf"
脚本运行时先载入core,再merge对应patch——这样新增一个发行版只需加一个补丁文件,不用改主逻辑。
用Ansible Facts自动识别发行版上下文
硬编码 if [ "$DISTRO" = "ubuntu" ] 很脆弱。Ansible的setup模块能准确返回:
-
ansible_distribution(如 "Ubuntu", "CentOS", "AlmaLinux") -
ansible_distribution_version(如 "22.04", "9.3") -
ansible_facts['os_family'](如 "RedHat", "Debian") -
ansible_facts['pkg_mgr'](如 "apt", "dnf")
把这些变量传给Jinja2模板,生成适配当前系统的检查命令。例如:
{% if ansible_facts.pkg_mgr == "dnf" %}
ss -tlnp | grep :22 | grep -q sshd && echo "sshd running"
{% else %}
ss -tlnp | grep :22 | grep -q "sshd\|dropbear"
{% endif %}这样同一份playbook在Ubuntu和Rocky Linux上,能自动适配包管理器和服务名差异。
输出差异报告要带“为什么”和“影响面”
单纯列出“Ubuntu默认开PasswordAuthentication,RHEL默认关”没意义。报告里每项差异应附带:
- 触发条件:仅当未配置SSH密钥时才构成风险
- 影响范围:只影响首次登录,后续可用sudo切换
- 修复成本:修改sshd_config + reload,无重启需求
- 兼容性提示:若使用Ansible Tower,需确认其控制节点支持该发行版的Python解释器路径
比如发现Ubuntu 24.04默认启用systemd-resolved且监听53端口,报告不应只写“端口暴露”,而要注明:“该服务绑定127.0.0.53,不对外网开放;若业务用dnsmasq,需mask resolved避免端口冲突”。


















