CentOS服务器在长期运行后,最容易出现的安全问题往往不是来自某个神秘的高级攻击,而是源于已知漏洞未修补、默认配置未修改、以及不必要的服务暴露在公网。排查安全漏洞的第一步,是确认当前系统版本和内核状态。很多用户以为安装了CentOS 7.9或者CentOS Stream 8就万事大吉,但实际上内核补丁和用户态软件包的更新频率远高于系统大版本。执行uname -r和cat /etc/redhat-release可以快速掌握内核版本与发行版信息,然后对照官方公告判断是否处于受支持的补丁周期内。如果系统已经停止维护,继续使用就等于把门打开等人进来。
接下来要立即检查的是当前已安装软件包中存在哪些已知漏洞。CentOS系使用rpm包管理,可以通过yum update --security或者dnf update --security列出仅涉及安全修复的更新。这个操作不会直接修改系统,但能让你清楚看到有多少高危漏洞等待处理。很多运维人员跳过这一步,直接盲目执行全量更新,结果导致业务依赖的库版本被升级,引发兼容性问题。更稳妥的做法是先查看安全更新列表,评估影响范围,再分批次升级。对于无法立即重启的关键服务器,至少要对内核漏洞和远程可利用漏洞优先处理,例如涉及OpenSSL、OpenSSH、glibc、systemd的漏洞,这些组件一旦被攻破,攻击者可能直接获得root权限。
弱口令和密钥管理是另一个高频风险点。CentOS默认安装后,如果开启了SSH密码登录,并且存在弱密码账户,攻击者用自动化扫描工具几分钟就能爆破进入。排查时先检查/etc/ssh/sshd_config中的PermitRootLogin、PasswordAuthentication、PubkeyAuthentication三个关键配置。推荐设置为PermitRootLogin prohibit-password或no,PasswordAuthentication no,仅允许密钥登录。同时用awk -F: '($3==0){print $1}' /etc/passwd查看UID为0的账户,确认除了root之外没有其他隐藏超级用户。检查/etc/shadow中密码字段为空的账户,这类账户无需密码即可登录,属于严重配置错误。对于必须保留密码登录的场景,至少要用pam_pwquality模块强制密码复杂度,并设置失败登录锁定策略。
防火墙策略的审查不能只看表面。很多人以为firewalld开启就安全了,但实际上默认zone可能放行了过多端口。执行firewall-cmd --list-all查看当前生效的规则,重点关注public zone中开放的端口和服务。如果发现Redis的6379、MongoDB的27017、MySQL的3306等端口直接对0.0.0.0开放,且没有绑定内网IP或设置访问控制,这就是严重暴露。数据库和缓存服务应当只监听127.0.0.1或内网网卡,外部访问通过SSH隧道或VPN完成。对于必须公网访问的Web端口,要在防火墙层面限制来源IP,或者在应用层做访问控制。另外检查iptables -L -n是否存在历史遗留的放行规则,有些老系统同时运行firewalld和iptables,规则冲突会造成意想不到的开放。
系统账户和文件权限的排查要细致到每一个细节。使用find / -perm -4000 -type f 2>/dev/null查找所有SUID文件,这些文件以root权限执行,如果其中某个程序存在漏洞,攻击者可以利用它提权。常见的SUID文件如/usr/bin/passwd、/usr/bin/sudo是正常的,但要留意/usr/bin/find、/usr/bin/vim、/usr/bin/bash等工具是否被错误设置了SUID位。同样检查SGID文件,以及/tmp、/var/tmp、/dev/shm等可写目录中是否存在异常可执行文件。攻击者经常在这些目录放置恶意脚本或二进制木马。另外用lsattr检查关键系统文件是否被添加了不可修改属性,防止rootkit自我保护。对于Web目录,要确认上传目录没有执行权限,配置文件权限不超过644,防止敏感信息泄露。
日志分析是发现入侵痕迹的最直接手段。CentOS默认使用rsyslog记录系统日志,但很多服务器从未检查过/var/log/secure和/var/log/messages。排查时先看secure日志中是否有大量失败的SSH登录尝试,统计来源IP和尝试的用户名。如果某个IP尝试了上百次不同用户名,基本可以判定为暴力破解。再看是否有陌生IP成功登录的记录,特别是凌晨时段的登录。使用last命令查看登录历史,lastb查看失败登录记录。对于已经怀疑被入侵的系统,还要检查/var/log/cron、/var/log/maillog以及各应用的访问日志,寻找异常的计划任务、邮件发送记录或Webshell访问痕迹。日志文件本身也可能被攻击者删除或篡改,如果发现日志出现时间断层,要高度警惕。
计划任务和启动项是攻击者维持持久化的常用位置。检查/etc/crontab、/etc/cron.d/、/var/spool/cron/目录下的所有计划任务,以及各用户自己的crontab。特别注意那些指向/tmp、/dev/shm、/var/tmp下脚本的任务,这些目录可写且容易被利用。使用systemctl list-unit-files --type=service查看所有开机启动的服务,找出陌生的服务名。攻击者经常创建一个看似正常的服务名,比如systemd-networkd.service的变体,实际指向恶意程序。还要检查/etc/rc.local、/etc/profile、/etc/bashrc等文件中是否被追加了恶意命令,这些文件在用户登录或系统启动时执行,隐蔽性很高。
对于已经确认存在漏洞或入侵迹象的服务器,加固工作要分优先级执行。第一优先级是切断外部攻击路径,包括关闭不必要的端口、限制SSH来源IP、暂停可疑服务。第二优先级是修补已知漏洞,升级存在高危漏洞的软件包,必要时重启系统使内核补丁生效。第三优先级是清理后门和恶意文件,删除可疑的计划任务、启动项、SUID异常文件,重置所有账户密码和SSH密钥。第四优先级是建立持续监控机制,配置logwatch或自研脚本定期检查登录日志、文件变更和异常进程。加固不是一次性工作,而是需要定期复查的循环过程。
在具体加固操作中,有几个容易被忽略但非常有效的措施。第一是限制SSH登录来源,在/etc/ssh/sshd_config中使用AllowUsers或AllowGroups明确允许的账户,同时在防火墙层面只放行特定IP访问22端口。第二是配置fail2ban,它能够自动识别暴力破解行为并临时封禁来源IP,大幅降低密码爆破的成功率。第三是开启SELinux,虽然CentOS默认可能关闭,但SELinux的强制访问控制能在应用层漏洞被利用时提供最后一道防线。很多人觉得SELinux麻烦,但通过setenforce 1和调整布尔值,可以在不影响业务的前提下获得额外保护。第四是定期使用rkhunter或chkrootkit扫描rootkit,这两个工具能检测常见的内核级后门和隐藏进程。
对于运行Web服务的CentOS服务器,还要特别关注Web应用层面的安全。检查Nginx或Apache的运行账户是否为独立低权限用户,而不是root。确认PHP的disable_functions中禁用了exec、system、shell_exec、passthru等危险函数,防止Webshell执行系统命令。检查网站目录中是否存在可疑的php、jsp、asp文件,特别是文件名包含随机字符或位于上传目录中的脚本。使用grep -r "eval(" /var/www/html --include="*.php"查找可疑的代码执行语句。对于数据库,检查是否修改了默认端口、是否删除了默认账户、是否限制了远程访问。MySQL和Redis的默认配置往往是攻击者入侵后的首要目标。
内核参数调优也能显著提升服务器的抗攻击能力。在/etc/sysctl.conf中添加net.ipv4.tcp_syncookies=1开启SYN Cookie防护,防止SYN Flood攻击。设置net.ipv4.conf.all.rp_filter=1开启反向路径过滤,防止IP欺骗。设置net.ipv4.conf.all.accept_redirects=0和net.ipv4.conf.all.send_redirects=0关闭ICMP重定向,防止中间人攻击。设置kernel.randomize_va_space=2保持地址空间布局随机化,增加缓冲区溢出攻击的难度。这些参数修改后执行sysctl -p立即生效,对系统性能影响极小,但能有效阻断多种网络层攻击。
最后要强调的是备份和应急响应。无论加固做得多么完善,都无法保证绝对安全。定期备份关键数据和配置文件,确保在遭受勒索软件或数据破坏时能够快速恢复。制定应急响应流程,明确发现入侵后第一步做什么、如何隔离受感染服务器、如何保留证据。对于CentOS服务器,建议至少每周检查一次安全更新,每月做一次全面的安全审计,包括账户、端口、日志、计划任务、文件权限的复查。安全是一个持续对抗的过程,攻击者的手段在不断进化,防守方也必须保持警惕和更新。
