CentOS 7与CentOS 8在服务器安全配置上的差异,根本原因不是某个工具换了名字,而是系统底层架构、软件管理方式、服务管理框架以及默认安全策略都发生了实质性变化。很多运维人员把CentOS 7的安全脚本直接搬到CentOS 8上跑,结果要么服务起不来,要么防火墙规则不生效,要么审计日志根本没记录。真正要把安全配置做对,必须先把这些差异拆开看。
软件包与更新机制的安全影响CentOS 7使用yum和rpm作为包管理核心,依赖关系处理相对宽松,很多第三方源可以随意混用。CentOS 8改用dnf,虽然dnf兼容大部分yum命令,但模块化仓库和AppStream的引入改变了软件包的来源和版本控制方式。安全更新的分发逻辑也变了,CentOS 8的模块流允许同一软件存在多个版本,如果错误启用了旧模块流,系统可能停留在有已知漏洞的版本上。配置安全基线时,CentOS 8必须检查dnf module list的输出,确认默认模块流是否指向受支持的稳定版本。CentOS 7则更关注yum-plugin-security插件是否安装,以及yum update --security是否能正确拉取安全公告对应的补丁。
防火墙后端与规则管理差异CentOS 7默认防火墙管理工具是firewalld,底层调用iptables。CentOS 8仍然使用firewalld,但底层已经切换到nftables。这个变化意味着所有直接操作iptables命令的脚本在CentOS 8上不会生效,即使安装了iptables-compat包,规则也不会真正进入内核过滤链。CentOS 8必须通过firewall-cmd或直接使用nft命令来管理规则。另外,firewalld在CentOS 8中对rich rules和direct rules的处理更严格,CentOS 7上很多direct规则可以直接穿透区域策略,CentOS 8会强制校验规则与区域的匹配关系,配置错误会导致规则静默失败。建议在CentOS 8上彻底放弃direct rules,改用firewalld的policy对象或nftables原生表。
SELinux策略与布尔值变化CentOS 7和CentOS 8都默认启用SELinux,但策略版本和默认布尔值有显著差异。CentOS 7基于SELinux policy 28左右,CentOS 8升级到policy 31以上,很多服务的域转换规则被重写。例如httpd在CentOS 7上连接数据库需要开启httpd_can_network_connect_db布尔值,CentOS 8中该布尔值默认仍然关闭,但新增了httpd_can_network_connect等更细粒度的控制项。如果从CentOS 7迁移配置文件到CentOS 8,必须重新审计SELinux拒绝日志,不能直接沿用旧的布尔值设置。另外CentOS 8对systemd服务单元的SELinux标签检查更严格,自定义服务如果缺少正确的file_contexts定义,启动时会直接报权限错误。
系统服务与最小化攻击面CentOS 7的最小化安装仍然会带进来一些不必要的服务,比如postfix、chrony、auditd等,虽然可以手动禁用,但默认启动列表比CentOS 8更长。CentOS 8在最小化安装时砍掉了更多非核心组件,但引入了systemd-resolved和systemd-timesyncd作为新的默认网络服务。安全加固时,CentOS 7需要重点检查xinetd、telnet、rsh等遗留服务是否被意外安装,CentOS 8则要关注cockpit、udisks2、packagekit等新组件是否暴露了不必要的本地或远程接口。CentOS 8中systemd单元之间的依赖关系更复杂,单纯用systemctl disable关闭服务可能因为被其他单元依赖而自动重新启动,必须配合mask操作。
审计日志与内核参数差异auditd在CentOS 7和CentOS 8中的默认规则集不同。CentOS 8默认启用了更严格的系统调用审计,尤其是对mount、umount、reboot等关键操作的记录。但CentOS 8的auditd日志格式有微调,部分字段的解析方式与CentOS 7不同,如果使用集中日志平台,需要调整解析规则。内核参数方面,CentOS 8默认启用了kernel.yama.ptrace_scope=1,限制非特权进程的ptrace能力,CentOS 7默认是0。另外CentOS 8对kernel.kptr_restrict和kernel.dmesg_restrict的默认值更严格,信息泄露面更小。安全基线中如果包含/etc/sysctl.conf的自定义参数,迁移到CentOS 8时要检查是否与systemd-sysctl的默认配置冲突,CentOS 8会优先读取/usr/lib/sysctl.d/下的系统默认值。
加密协议与TLS配置差异CentOS 7自带的OpenSSL版本是1.0.2,CentOS 8升级到1.1.1。这个升级直接导致很多旧的TLS配置指令失效。例如CentOS 7上可以在Apache或Nginx中指定SSLCipherSuite使用RC4或3DES,CentOS 8的OpenSSL 1.1.1默认禁用了这些弱算法,即使配置文件中写了也不会生效。CentOS 8强制要求TLS 1.2以上版本,部分老客户端可能无法连接。如果业务系统需要兼容旧协议,必须在CentOS 8上显式降低安全级别,但这会引入风险。另外CentOS 8默认启用了系统级的crypto-policies,通过update-crypto-policies命令可以统一调整全系统的加密策略,这是CentOS 7没有的机制。安全加固时,CentOS 8应优先使用crypto-policies来管理加密套件,而不是逐个修改应用配置。
用户认证与PAM模块变化CentOS 7和CentOS 8的PAM配置结构基本一致,但CentOS 8引入了pam_faillock替代旧的pam_tally2,账户锁定策略的配置方式完全不同。CentOS 7上常见的pam_tally2.so deny=5 unlock_time=600配置在CentOS 8上不再生效,必须改用pam_faillock.so preauth和authfail两段式配置。密码质量方面,CentOS 8默认使用pam_pwquality替代pam_cracklib,参数名称有变化,比如minlen改为minlen,但difok改为difok,实际上大部分参数兼容,但模块名称必须改。CentOS 8还默认启用了pam_usertype.so来区分普通用户和系统用户,如果自定义PAM规则时忽略了这一层,可能导致系统账户被错误锁定或放行。
日志系统与时间同步安全CentOS 7使用rsyslog作为主要日志收集器,CentOS 8虽然也保留rsyslog,但systemd-journald承担了更多内核和早期启动日志的记录。安全审计时,CentOS 8必须同时检查journalctl和/var/log/messages,因为部分安全事件只存在于journald的二进制日志中。时间同步方面,CentOS 7默认用chrony或ntpd,CentOS 8统一为chrony,并且默认配置中启用了pool指令指向公共时间服务器。安全加固时,CentOS 8应修改/etc/chrony.conf,将时间源指向内部可信服务器,并启用key认证,防止时间同步被劫持。
容器与虚拟化安全差异CentOS 7对Docker的支持比较成熟,但内核版本较老,很多容器逃逸漏洞的缓解措施不完整。CentOS 8内核更新,默认启用了更多的namespace隔离和cgroup v2支持,但podman替代docker成为默认容器工具。安全配置上,CentOS 8的podman默认以非root用户运行容器,这比CentOS 7上docker默认以root运行要安全得多。如果业务必须使用docker,CentOS 8上需要额外配置daemon.json中的userns-remap和seccomp profile,否则容器内的root权限与宿主机root权限的隔离不如podman。另外CentOS 8对容器镜像的签名验证支持更好,建议启用containers-policy.json中的签名强制策略。
实际迁移中的安全配置对照建议从CentOS 7迁移到CentOS 8时,不要直接复制/etc/sysconfig/iptables、/etc/selinux/config、/etc/pam.d/system-auth等文件。正确做法是重新生成安全基线,按以下顺序检查:先确认系统加密策略,再配置防火墙规则,然后调整SELinux布尔值,接着修改PAM认证策略,最后处理审计和日志。CentOS 8的很多安全功能默认值已经比CentOS 7严格,过度自定义反而可能破坏系统完整性校验。对于生产环境,建议在CentOS 8上使用oscap工具结合SCAP安全指南生成定制化的加固脚本,而不是沿用CentOS 7时代的经验脚本。
CentOS 7与CentOS 8的安全配置差异本质上是两代操作系统设计理念的差异。CentOS 7更依赖人工脚本和外部工具来补足安全短板,CentOS 8则把更多安全机制内建到系统默认行为中。理解这些底层变化,比记住具体命令的替换更重要。
