CentOS系统在服务器领域依然占据着重要地位,但默认安装后的安全配置往往过于宽松,直接暴露在公网环境下无异于裸奔。解决这个问题最直接的办法,不是手动一条条敲命令,而是利用自动化安全加固脚本,配合基线检查,一次性把系统安全短板补齐。这类脚本的核心逻辑,就是把等保要求、CIS基准这些安全规范,转化成可执行的Shell指令,批量修改配置、关闭高危服务、设置权限策略,最后生成一份清晰的检查报告,告诉你哪里合格、哪里还有风险。

安全加固脚本到底做了什么

一个成熟的CentOS加固脚本,通常会覆盖身份鉴别、访问控制、安全审计、入侵防范这几个关键维度。以身份鉴别为例,脚本会自动检查并修改/etc/login.defs中的密码策略,把PASS_MAX_DAYS设为90天,PASS_MIN_DAYS设为7天,PASS_WARN_AGE设为14天,同时强制密码长度不低于8位,复杂度必须包含大小写字母、数字和特殊字符。这些参数直接写入/etc/pam.d/system-auth文件,通过pam_cracklib.so或pam_pwquality.so模块生效。脚本还会检查是否存在空密码账户,如果有,直接锁定或删除,不留任何后门。

访问控制方面,加固脚本会修改/etc/ssh/sshd_config,禁用root直接远程登录,把PermitRootLogin设为no,同时把默认的22端口改成高位端口,减少自动扫描攻击。对于登录失败处理,脚本会配置pam_tally2.so模块,连续5次输错密码就锁定账户300秒,有效防止暴力破解。此外,脚本还会清理系统中的多余账户和组,比如adm、lp、shutdown这些默认但很少用到的用户,直接锁定或删除,减少攻击面。

安全基线检查的自动化实现

光加固还不够,必须有一份基线检查报告来验证加固效果。自动化基线检查脚本的原理,就是把每一条安全要求拆解成具体的检查命令,然后判断输出结果是否符合预期。比如检查密码策略是否生效,脚本会执行grep PASS_MAX_DAYS /etc/login.defs,然后比对数值是否小于等于90。检查SSH配置时,会grep PermitRootLogin /etc/ssh/sshd_config,确认返回的是no。这些检查项通常有上百条,全部自动化跑下来,几分钟就能生成完整报告。

下面是一段典型的基线检查脚本片段,展示了如何检查重要文件的权限设置:

#!/bin/bash
# 检查passwd和shadow文件权限
check_file_permission() {
    file_path=$1
    expected_perm=$2
    actual_perm=$(stat -c %a "$file_path")
    if [ "$actual_perm" -eq "$expected_perm" ]; then
        echo "[合规] $file_path 权限为 $actual_perm"
    else
        echo "[不合规] $file_path 权限为 $actual_perm,应为 $expected_perm"
    fi
}
check_file_permission "/etc/passwd" 644
check_file_permission "/etc/shadow" 400
check_file_permission "/etc/group" 644

这段代码用stat命令获取文件的实际权限,然后跟期望值对比,输出合规或不合规的结果。实际生产环境中的检查脚本会比这个复杂得多,会覆盖文件权限、服务状态、内核参数、日志配置等方方面面,最后汇总成一份带颜色标记的检查报告,不合规项用红色标注,一目了然。

核心加固项深度解析

真正硬核的加固脚本,一定会处理SELinux和防火墙配置。很多运维人员嫌麻烦直接关掉SELinux,这等于自废武功。加固脚本会把SELinux设为enforcing模式,然后根据实际业务需求配置策略,既保证安全又不影响应用运行。防火墙方面,脚本会清空默认的iptables规则,重新构建白名单策略,只开放必要的业务端口,比如80、443,其他一律DROP。同时还会配置防CC和SYN Flood攻击的规则,限制单IP的连接数和新建连接速率。

审计日志的配置也至关重要。加固脚本会修改/etc/rsyslog.conf,把authpriv日志单独记录到/var/log/secure,把cron日志记录到/var/log/cron,并配置日志轮转策略,避免日志文件撑爆磁盘。对于关键文件的变更监控,脚本会配置auditd规则,监控/etc/passwd、/etc/shadow、/etc/sudoers等敏感文件的写入操作,一旦有人修改,立刻记录审计日志。这些规则写入/etc/audit/rules.d/audit.rules,示例如下:

-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers_change
-w /var/log/lastlog -p wa -k logins

内核参数调优也是加固脚本的重要组成部分。通过修改/etc/sysctl.conf,可以开启TCP SYN Cookie防护、禁用IP转发、禁止响应ICMP重定向、开启反向路径过滤等。这些参数能有效防御常见的网络层攻击,比如SYN Flood、IP欺骗等。脚本执行sysctl -p让配置立即生效,无需重启系统。

实战中的注意事项

加固脚本虽然强大,但直接在生产环境跑风险很大,必须先在测试环境验证。有些配置修改可能导致业务异常,比如改了SSH端口后,如果防火墙规则没同步放开,自己就被关在外面了。所以成熟的加固脚本都会在关键操作前做备份,把原始配置文件复制一份带时间戳的副本,万一出问题可以快速回滚。另外,加固不是一锤子买卖,脚本应该支持重复执行,每次运行都基于当前系统状态重新检查和修复,而不是盲目覆盖配置。

还有一个容易被忽略的点,就是不同CentOS版本的差异。CentOS 6、7、8的很多配置路径和命令都不一样,比如防火墙从iptables变成了firewalld,服务管理从service变成了systemctl。好的加固脚本会先判断系统版本,然后走对应的逻辑分支,保证兼容性。对于CentOS 8已经停止维护的情况,脚本还会提示用户迁移到Rocky Linux或AlmaLinux,这些系统跟CentOS高度兼容,加固脚本稍作调整就能直接用。

最后,加固脚本的输出结果一定要清晰可读。除了屏幕上的实时输出,还应该生成一份详细的日志文件,记录每一步操作的时间、内容和结果。基线检查报告最好输出为HTML或CSV格式,方便存档和审计。有些高级脚本还会对接企业微信或钉钉机器人,把检查结果推送到运维群,实现安全状态的实时监控。

自动化安全加固和基线检查,本质上就是把安全运维的经验固化成代码,让每台CentOS服务器都能快速达到合格的安全水位。这比手动操作效率高得多,也避免了人为遗漏。对于运维团队来说,拥有一套成熟的加固脚本,就等于有了一个不知疲倦的安全专家,24小时守护系统安全。