接手CentOS 7迁移到Rocky Linux 8/9的项目时,最容易被忽视的坑不是系统安装或软件兼容性,而是安全策略的平滑迁移。很多人以为把数据同步过去、服务跑起来就算完事,结果上线后SELinux疯狂报警、审计日志把磁盘写满、防火墙规则失效,甚至SSH都连不上。这些问题的根源在于,CentOS 7时代积累的安全配置并不能直接照搬到Rocky Linux上,两个系统在安全子系统层面存在结构性差异。

SELinux策略从保守到激进的转变

CentOS 7默认使用的SELinux策略包版本较老,很多自定义模块是用老式.pp文件直接加载的。Rocky Linux 8/9引入了模块化策略和更严格的类型强制规则,旧模块直接安装大概率会因依赖缺失或语法不兼容而失败。迁移时不要直接复制/etc/selinux/targeted/active/modules目录,而是应该重新编译策略源码。如果你的团队之前用audit2allow生成了大量自定义模块,现在需要逐个审查,因为很多放行规则在新系统中已经不再需要,甚至可能引入过度宽松的权限。

实际操作中,先在Rocky Linux上开启permissive模式跑几天,用ausearch -m avc -ts recent抓取所有拒绝记录,再通过audit2why分析根因。你会发现大量关于systemd、NetworkManager、容器运行时的告警,这些在CentOS 7上可能被旧策略默认允许,但新系统明确禁止。处理原则是优先调整服务上下文而非直接创建allow规则,例如httpd访问非标目录时,用semanage fcontext设置持久化标签,而不是简单执行setsebool -P httpd_read_user_content 1了事。

系统加密策略的强制升级

Rocky Linux 8开始引入了系统级加密策略机制update-crypto-policies,这直接控制了SSH、TLS、IPsec等所有使用系统加密库的服务。CentOS 7迁移过来的应用如果还依赖TLS 1.0/1.1或弱加密套件,连接会直接失败。默认的DEFAULT策略已经禁用了这些老旧协议,而FUTURE和FIPS策略更加严格。检查当前策略用update-crypto-policies --show,修改时务必评估所有依赖加密的服务。

一个典型场景是内部遗留的Java应用使用旧版JDK,其加密协商独立于系统策略,但通过Nginx反向代理时会因ssl_ciphers配置不兼容导致握手失败。解决方案不是降级系统策略,而是在Nginx配置中显式指定兼容的加密套件,同时推动应用侧升级。对于必须使用弱加密的内部系统,可以通过自定义策略子策略文件/etc/crypto-policies/policies/modules/CUSTOM.pol来局部放宽,但要做好文档记录和安全评审。

审计系统的日志风暴与性能影响

auditd在Rocky Linux上的默认规则集比CentOS 7庞大得多,尤其是对系统调用和文件访问的监控粒度更细。迁移后如果不清理规则,/var/log/audit/audit.log会以每分钟几百兆的速度增长,不仅消耗磁盘,更严重的是auditd在高负载下可能阻塞内核线程导致系统响应变慢。直接复制/etc/audit/rules.d/下的规则文件是常见错误做法,因为很多旧规则引用的系统调用号或路径已变更。

正确做法是先清空规则,用auditctl -l检查当前加载项,然后根据实际合规需求重新构建规则集。重点关注关键目录的写操作监控和特权命令执行记录,避免使用-a always,exit -S all这类全量审计。对于容器化环境,还需注意auditd与容器运行时的兼容性,部分容器引擎会在audit日志中产生大量噪音,需要通过-a exclude,always -F msgtype=VIRT_CONTROL这类规则过滤。

防火墙后端从iptables到nftables的彻底切换

Rocky Linux 8虽然仍能通过iptables命令操作,但底层已完全使用nftables框架,iptables只是兼容层。直接复制/etc/sysconfig/iptables文件会导致规则转换失败或性能下降,因为兼容层对某些复杂规则的支持不完整,尤其是涉及conntrack和NAT的组合场景。更麻烦的是,firewalld在Rocky Linux上的默认行为也有变化,区域配置文件的语法和优先级逻辑与CentOS 7时期不同。

建议彻底迁移到firewalld+nftables原生配置,放弃直接操作iptables规则的习惯。用firewall-cmd --list-all-zones检查当前配置,把之前写在/etc/sysconfig/iptables里的自定义规则改写成firewalld的rich-rules或direct-rules。对于复杂场景,直接用nft命令编写原生规则并保存到/etc/nftables/目录,通过systemd服务加载。注意Rocky Linux 9中firewalld默认使用nftables作为后端,某些direct-rules写法需要调整。

PAM认证模块的版本差异陷阱

PAM配置看似简单,但Rocky Linux引入了pam_pwquality替代pam_cracklib,pam_faillock替代pam_tally2,这些模块的参数语法完全不同。直接覆盖/etc/pam.d/下的文件会导致认证失败甚至锁死所有登录。密码复杂度策略需要从原来的password requisite pam_cracklib.so try_first_pass retry=3 type=改写为password requisite pam_pwquality.so try_first_pass retry=3 enforce_for_root。

账户锁定策略的迁移更需谨慎,pam_faillock的配置分布在auth和account两个阶段,且preauth和authfail的调用顺序有严格要求。建议在Rocky Linux上使用authselect工具生成标准PAM配置基线,再在此基础上叠加自定义修改,而不是从旧系统直接复制。authselect select sssd --force可以快速生成一套包含SSSD、指纹认证等模块的现代化配置,然后用authselect enable-feature with-faillock启用账户锁定功能。

文件权限与capabilities的隐性变化

Rocky Linux对系统二进制文件的权限控制更严格,很多在CentOS 7上SUID的程序现在改用文件capabilities,例如/bin/ping从SUID root变成了cap_net_raw+ep。如果你的监控脚本或自动化工具依赖SUID位检测来发现异常,迁移后会产生大量误报。用getcap -r /usr/bin /usr/sbin扫描当前capabilities分配情况,更新基线检查规则。

另外umask默认值在Rocky Linux 8/9中为0027,比CentOS 7的0022更严格,这会导致迁移后新建的文件和目录权限偏紧,可能影响那些依赖共享组权限的应用。检查/etc/profile、/etc/bashrc以及各服务的systemd unit文件中的UMask设置,确保与业务需求一致。对于使用ACL的目录,用getfacl导出权限列表,在目标系统上用setfacl --restore恢复,注意备份原有ACL避免覆盖系统默认设置。

日志系统从rsyslog到systemd-journald的架构调整

Rocky Linux中systemd-journald承担了更核心的日志收集角色,rsyslog默认只处理转发和持久化。如果你习惯直接查看/var/log/messages或/var/log/secure,会发现这些文件的内容不如CentOS 7时期详细,因为很多systemd服务日志默认只进journal。迁移时要决定日志架构策略:是继续依赖rsyslog做文本日志持久化,还是转向journald集中管理。

如果选择保留文本日志,需在/etc/systemd/journald.conf中设置ForwardToSyslog=yes,并调整rsyslog的imjournal模块配置。如果转向journald,要规划好日志轮转和存储上限,默认journal日志存储在/run/log/journal(易失性),需创建/var/log/journal目录启用持久化,并通过SystemMaxUse限制磁盘占用。对于合规要求严格的场景,还需配置journald的转发到集中日志平台,避免日志分散在单机。

安全基线检查工具的适配

迁移后运行OpenSCAP或CIS-CAT扫描时,会发现大量规则评估结果与CentOS 7时期不同,这不是系统变不安全了,而是检查标准更新了。Rocky Linux对应的SCAP内容版本更高,新增了对grub2密码保护、内核模块黑名单、sysctl网络参数等检查项。不要盲目追求高分通过,先理解每条规则的安全意义,结合业务实际做取舍。

一个实用方法是使用scap-workbench图形化工具对比两个系统的XCCDF评估结果,找出差异项后分类处理。对于必须通过的合规项,如等保要求的主机入侵检测,Rocky Linux上推荐使用aide配合更严格的数据库初始化参数,因为文件系统结构变化会导致旧aide数据库失效,需重新生成基线。

内核参数安全相关项的迁移

/etc/sysctl.conf和/etc/sysctl.d/下的配置在迁移时看似可以直接复制,但Rocky Linux内核版本更新,部分参数名称已废弃或默认值已变更。例如net.ipv4.tcp_tw_recycle在较新内核中已移除,kernel.randomize_va_space默认值从2变成了更严格的模式,kernel.kptr_restrict默认开启。直接覆盖可能导致系统启动时sysctl报错或覆盖掉更合理的新默认值。

建议用sysctl -a先导出目标系统的完整参数列表,与旧配置做diff,只保留那些确实需要修改的项。重点关注network和kernel命名空间下的安全参数,如net.ipv4.conf.all.rp_filter、kernel.yama.ptrace_scope等,这些在容器和微服务架构下可能需要调整。修改后用sysctl --system加载并验证,注意systemd-sysctl服务会优先加载/etc/sysctl.d/下的配置。

容器与虚拟化安全上下文的重新适配

如果迁移范围包括Podman、Docker或KVM虚拟化环境,安全配置的复杂度会成倍增加。Rocky Linux对容器运行时的SELinux策略更细化,引入了container_t、container_file_t等专用类型,旧系统上用--privileged模式粗暴绕过SELinux的做法在新环境中风险更大。UDICA工具可以自动生成针对特定容器的SELinux策略,比手动编写更可靠。

对于KVM虚拟机迁移,注意Rocky Linux上libvirt默认使用qemu:///system会话模式,SELinux强制隔离各虚拟机进程。如果之前通过NFS或GlusterFS共享存储镜像,需要正确设置virt_use_nfs和virt_use_fusefs布尔值,并用semanage设置存储路径的virt_image_t标签。迁移后务必用virsh dominfo检查每个虚拟机的安全标签是否正确注入。