拿到一台全新的CentOS服务器,默认配置往往侧重于易用性而非安全性。SSH端口敞开着,root用户可以远程登录,防火墙规则一片空白,系统日志默认保留的时长可能不足以应对审计需求。这些不是潜在风险,而是摆在明面上的突破口。企业级安全加固不是装个杀毒软件或者改个端口就完事,它是一套从内核参数到应用层、从身份认证到审计追溯的完整动作链条。下面直接进入具体操作,每一步都对应一个必须解决的安全问题。

最小化安装与软件包裁剪

系统安装阶段就决定了攻击面的大小。如果服务器已经跑了一段时间,第一时间应该清查已安装的软件包。执行 yum list installed 查看所有包,把图形界面组件、开发工具链、不必要的服务守护进程全部移除。像 X Window System、GNOME、KDE 这类桌面环境组件在服务器上没有任何保留理由。用 rpm -qa | grep -i 配合包名关键词逐个排查,再用 yum remove 清理。清理完成后运行 yum autoremove 扫除孤立依赖。这个动作能直接减少数百个不必要的二进制文件暴露在系统中,每减少一个组件就减少一个可能被利用的漏洞载体。

OpenSSH服务深度加固

SSH是远程管理的生命线,也是暴力破解的首要目标。第一步不是改端口,而是彻底禁止root直接登录。编辑 /etc/ssh/sshd_config,设置 PermitRootLogin no。接着禁止空密码登录,设置 PermitEmptyPasswords no。关闭基于主机的认证,设置 HostbasedAuthentication no。然后才是修改默认端口,找到 #Port 22 这一行,取消注释并改为一个高位端口,比如 24892。端口选择上避免使用广为人知的替代端口如2222。同时限制可登录的用户,在配置文件末尾添加 AllowUsers yourusername,只允许指定用户通过SSH访问。密码认证和密钥认证的选择上,如果已经配置好密钥对,直接设置 PasswordAuthentication no,彻底关闭密码登录。最后重启sshd服务使配置生效。

# 关键配置项示例
PermitRootLogin no
PermitEmptyPasswords no
HostbasedAuthentication no
Port 24892
AllowUsers maintainer
PasswordAuthentication no
PubkeyAuthentication yes
系统账户与口令策略强化

账户体系是权限控制的根基。检查 /etc/passwd 中UID为0的用户,正常情况下只有root一个。用 awk -F: '($3 == 0) {print $1}' /etc/passwd 命令快速筛查。锁定系统中所有非必要的系统账户,比如 games、ftp、news 等,用 passwd -l 锁定,并用 usermod -s /sbin/nologin 禁止其登录shell。口令策略方面,编辑 /etc/login.defs 设置 PASS_MAX_DAYS 90、PASS_MIN_DAYS 7、PASS_WARN_AGE 14,强制用户定期更换密码。再通过 /etc/pam.d/system-auth 引入 pam_pwquality.so 模块,限制密码最小长度、字符类型组合和重复使用次数。

# /etc/pam.d/system-auth 中pam_pwquality.so配置示例
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 minlen=12 difok=4 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
防火墙策略精细化配置

CentOS 7及以后版本默认使用firewalld作为防火墙管理工具,但底层仍然是iptables或nftables。推荐直接使用firewalld管理,因为它对动态规则更新更友好。首先将默认区域设置为drop或public,然后仅开放业务必需的端口。比如只开放上面修改后的SSH端口和Web服务的443端口,用 firewall-cmd --permanent --add-port=24892/tcp 和 firewall-cmd --permanent --add-service=https 添加规则。特别注意,不要为了方便随手加 --add-service=ssh,这个服务默认关联22端口,加进去等于给扫描器留了路标。添加完规则后执行 firewall-cmd --reload 重载。对于出入站流量都要做限制,出站流量默认允许但应该考虑限制,防止反弹shell类攻击。

SELinux强制模式部署

很多运维人员装完系统第一件事就是关掉SELinux,这在企业级环境里是反向操作。SELinux提供的强制访问控制是防止提权漏洞被利用的最后一道防线。查看当前状态用 getenforce,如果不是Enforcing,编辑 /etc/selinux/config 设置 SELINUX=enforcing,然后重启系统。重启后如果业务出现异常,不要直接关掉SELinux,而是用 audit2allow 分析审计日志,生成针对性的策略模块。具体做法是 grep 相关报错信息 /var/log/audit/audit.log,然后用 audit2allow -a -M custom_policy 生成自定义策略包,再用 semodule -i custom_policy.pp 加载。这个过程虽然比关掉SELinux麻烦,但它保留了强制访问控制的保护能力。

内核参数安全调优

系统内核参数直接影响网络层面的抗攻击能力。编辑 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的自定义配置文件,加入一系列安全相关参数。开启TCP SYN Cookie保护,防止SYN Flood攻击,设置 net.ipv4.tcp_syncookies = 1。禁用ICMP重定向,防止中间人篡改路由,设置 net.ipv4.conf.all.accept_redirects = 0 和 net.ipv4.conf.all.send_redirects = 0。开启反向路径过滤,防止IP地址欺骗,设置 net.ipv4.conf.all.rp_filter = 1。禁止源路由,设置 net.ipv4.conf.all.accept_source_route = 0。同时记录并丢弃可疑包,开启 net.ipv4.conf.all.log_martians = 1。配置完成后执行 sysctl -p 立即生效。

# 内核安全参数
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
kernel.randomize_va_space = 2
审计系统部署与日志加固

没有审计能力的安全防护是盲目的。Linux内核自带的auditd是强大的审计框架。安装 audit 包后,配置 /etc/audit/rules.d/audit.rules 文件,添加对关键文件和系统调用的监控。监控 /etc/passwd、/etc/shadow 的写入操作,监控 sudo 使用记录,监控用户登录注销事件。用 -w 参数添加文件监控,用 -a 参数添加系统调用规则。同时配置auditd日志轮转,避免日志撑满磁盘。除了auditd,还要加固rsyslog,配置日志远程转发到集中的日志服务器,防止攻击者登录后清除本地日志。修改 /etc/rsyslog.conf,添加远程转发规则,并使用TCP协议加密传输。

# audit.rules 关键规则示例
-w /etc/passwd -p wa -k identity_changes
-w /etc/shadow -p wa -k identity_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /var/log/lastlog -p wa -k login_records
-a always,exit -F arch=b64 -S execve -k command_execution
文件系统权限与完整性监控

关键目录和文件的权限如果设置不当,普通用户可能读取到敏感配置。检查 /etc/passwd 权限应为644,/etc/shadow 应为000或600,/etc/group 应为644。用 chmod 和 chown 逐一修正。对Web目录、数据库目录设置严格的属主和权限,遵循最小权限原则。部署AIDE入侵检测系统,初始化数据库 aide --init,然后配置定期任务比对文件系统指纹。一旦关键二进制文件或配置文件被篡改,AIDE能第一时间发现并告警。将AIDE数据库保存在只读介质或远程位置,防止攻击者同时篡改数据库。

服务基线检查与自动化扫描

加固完成后需要进行验证。使用开源工具如Lynis进行系统安全审计,它会检查数百项安全指标并给出加固建议。执行 lynis audit system 获取完整报告,根据报告中的Warning和Suggestion逐项处理。对于Web应用服务器,还需要检查中间件配置,比如Nginx是否隐藏了版本号,PHP是否禁用了危险函数,数据库是否限制了远程访问来源IP。将这些检查项写成脚本,纳入日常巡检流程。安全加固不是一次性工作,每次系统更新、业务变更后都需要重新评估。

定时任务与自动化运维安全

crontab中配置的定时任务往往拥有较高权限,是攻击者持久化的常用手段。检查 /etc/crontab、/etc/cron.* 目录以及各用户的crontab,确保没有异常条目。限制 at 和 cron 的使用权限,通过编辑 /etc/cron.allow 和 /etc/at.allow 白名单控制。同时检查系统中所有定时任务脚本的权限,确保不会被非授权用户修改。如果使用Ansible、SaltStack等自动化运维工具,它们的配置文件和密钥存储也需要纳入加固范围,通信通道必须加密。

内核模块限制与USB存储管控

物理机环境下,USB端口可能被用来接入恶意设备。通过modprobe黑名单禁用不必要的内核模块,编辑 /etc/modprobe.d/blacklist.conf,添加 usb-storage 等模块的禁用条目。对于确实不需要的驱动模块,直接在系统层面阻断加载。同时限制内核模块的自动加载行为,设置 /etc/sysctl.conf 中的 kernel.modules_disabled = 1,一旦系统稳定运行后,彻底禁止新模块加载,这能有效防止rootkit注入。

# 禁用USB存储模块
echo "blacklist usb-storage" >> /etc/modprobe.d/blacklist.conf
echo "install usb-storage /bin/true" >> /etc/modprobe.d/blacklist.conf
安全更新策略与漏洞响应

没有及时打补丁的系统,前面的所有加固都可能白费。配置yum-cron实现安全更新的自动下载和通知。编辑 /etc/yum/yum-cron.conf,设置 apply_updates = yes 仅针对安全更新,或者设置为只下载不自动安装,由运维人员评估后手动安装。加入CentOS官方的安全公告邮件列表,或者关注相关漏洞情报源,确保在漏洞公开后第一时间知晓。对于生产环境,建立测试环境先行验证更新的机制,避免补丁导致业务中断。

企业级安全加固的终点不是完成上述清单,而是建立起持续的安全运维能力。每一次登录失败、每一次文件变更、每一次异常的系统调用,都应该被记录、被分析、被响应。把加固动作写成标准化文档,纳入服务器上线前的检查清单,让安全基线成为基础设施的一部分而不是事后补救措施。CentOS的生命周期即将走到尽头,如果条件允许,应考虑迁移到Rocky Linux或AlmaLinux等后继发行版,它们保持了与CentOS的兼容性,同时提供持续的安全更新支持。