CentOS服务器上线后如果只是默认安装,等于把一台没锁门的机器扔进了机房。很多人以为改个SSH端口、装个fail2ban就算安全落地,实际上真正的安全策略是一套组合动作,从系统基线、账户体系、网络暴露面、审计日志到内核参数都需要逐项落地。下面直接讲可以立即执行的方法和配置,不绕弯子。

先收紧SSH,这是第一道门

编辑/etc/ssh/sshd_config,不要只改端口,还要把协议、空密码、密码爆破的入口全部堵死。建议至少包含以下配置:

Port 22022
Protocol 2
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deploy opsuser

Port改成非22端口能过滤掉大部分自动扫描,但真正的关键是PermitRootLogin no和PasswordAuthentication no。如果暂时无法完全禁用密码登录,至少对root禁用密码,并强制普通用户使用密钥。AllowUsers白名单比DenyUsers更可靠,因为默认拒绝所有未列出的账户。改完执行systemctl restart sshd,不要断开当前会话,另开窗口测试能否登录。

账户与权限基线要一次做对

CentOS默认会有一些服务账户,这些账户不需要登录shell。用下面命令把所有非交互账户的shell改成/sbin/nologin:

for user in adm lp sync shutdown halt mail operator games ftp nobody; do
  usermod -s /sbin/nologin $user 2>/dev/null
done

同时检查/etc/passwd中UID为0的账户,正常应该只有root一个。执行awk -F: '($3==0){print $1}' /etc/passwd,如果出现其他账户,立即核查并删除或修改UID。sudo权限不要直接编辑/etc/sudoers,应该在/etc/sudoers.d/下创建独立文件,例如/etc/sudoers.d/ops,内容为:

opsuser ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/journalctl

这样opsuser只能执行指定的systemctl和journalctl命令,而不是拿到完整root权限。最小权限原则比事后补救有效得多。

防火墙策略要基于默认拒绝

CentOS 7/8使用firewalld,CentOS 6使用iptables,但思路一致:先设置默认策略为拒绝,再按需放行。以firewalld为例:

systemctl enable firewalld
systemctl start firewalld
firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --add-port=22022/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

默认zone改成drop后,所有未明确放行的流量都会被丢弃。如果服务器只对外提供Web服务,就只开80和443;如果还有内部管理网段,可以用--add-source=192.168.10.0/24 --zone=trusted单独放行。不要图省事直接开一个大范围端口段,尤其是数据库端口3306、6379这类,除非业务确实需要对外,否则一律只监听内网或本机。

内核参数加固,减少网络层攻击面

编辑/etc/sysctl.conf或/etc/sysctl.d/99-security.conf,加入以下参数:

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_echo_ignore_all = 1
net.ipv4.conf.all.log_martians = 1
kernel.randomize_va_space = 2

rp_filter开启反向路径过滤,能防止IP欺骗;tcp_syncookies缓解SYN Flood;关闭ICMP重定向和发送重定向可以避免中间人篡改路由;icmp_echo_ignore_all设为1直接不响应ping,减少被扫描发现的概率。执行sysctl -p让配置生效。如果服务器需要被监控系统ping检测,可以把最后一条改为0,但其余参数建议保留。

日志审计不能只装不配

rsyslog默认会记录一些日志,但安全审计需要更细的粒度。先确认auditd已安装并运行:

yum install audit -y
systemctl enable auditd
systemctl start auditd

然后添加关键文件监控规则,编辑/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
-w /etc/ssh/sshd_config -p wa -k sshd
-w /var/log/secure -p wa -k authlog
-w /usr/bin/systemctl -p x -k systemctl

这些规则监控密码文件、sudo配置、SSH配置的写入和属性变更,以及systemctl的执行。执行service auditd restart加载规则,之后可以用ausearch -k identity查看相关事件。同时建议把/var/log/secure的日志定期同步到远程日志服务器,本地日志一旦被入侵者清除就失去了审计意义。

自动更新与漏洞修复要分优先级

CentOS的yum-cron可以自动安装安全更新,但生产环境不建议全自动更新所有包,因为可能引入兼容性问题。更稳妥的做法是只自动下载安全更新并通知,人工确认后再安装。编辑/etc/yum/yum-cron.conf:

update_cmd = security
update_messages = yes
download_updates = yes
apply_updates = no

这样系统每天会检查安全更新并下载到本地缓存,同时发送邮件或写入日志提醒管理员。管理员每周固定时间执行yum update --security进行安装。对于内核更新,需要重启才能生效,建议配合kexec或计划维护窗口处理,不要长期不更新内核,很多提权漏洞都出在内核模块。

文件系统与目录权限的隐藏风险

很多人忽略了/tmp目录和/tmp的挂载选项。攻击者经常利用/tmp写入脚本或提权工具,建议把/tmp单独分区并加上noexec、nosuid、nodev挂载选项。编辑/etc/fstab,找到/tmp对应行,修改为:

tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev 0 0

如果/tmp不是独立分区,可以挂载一个tmpfs并加上这些选项。同时检查系统中所有可写的目录,执行find / -type d -perm -0002 -not -path "/proc/*" -not -path "/sys/*" -not -path "/tmp/*" 2>/dev/null,对列出的目录逐一确认是否需要全局可写。Web目录尤其要注意,上传目录应该关闭PHP执行权限,配置文件应该设置为640或更严格。

服务最小化与进程白名单

用systemctl list-unit-files --state=enabled查看所有开机自启服务,逐个确认是否必须。常见的可以禁用的服务包括:

systemctl disable avahi-daemon
systemctl disable cups
systemctl disable postfix
systemctl disable chronyd

如果服务器不需要邮件服务,postfix完全可以禁用;avahi-daemon是零配置网络发现,服务器环境基本无用;cups是打印服务,更是多余。进程层面可以配合ps aux定期检查异常进程,尤其是高CPU占用但名字看起来像系统进程的可疑程序。更严格的做法是用systemd的沙箱参数限制服务权限,例如在服务的unit文件中加入:

[Service]
PrivateTmp=true
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=true

这些参数能防止服务访问用户目录、阻止提权、隔离临时文件,对Nginx、PHP-FPM等面向公网的服务尤其有效。

最后做一次全面验证

策略落地后必须验证,不能配置完就认为安全了。用ss -tlnp查看所有监听端口,确认没有多余服务暴露;用last -20查看最近登录记录,确认没有异常来源;用ausearch -m avc -ts recent检查SELinux是否有拒绝事件。如果SELinux处于enforcing状态,很多服务会因为策略问题无法启动,但不要直接关闭SELinux,应该用audit2allow生成自定义策略或调整布尔值。执行getenforce确认状态,如果是Permissive或Disabled,建议重新评估是否需要开启,因为SELinux能有效限制漏洞被利用后的横向移动。

CentOS服务器安全没有一劳永逸的方案,上述每一项都是基础动作。真正落地后,还要定期复查配置变更、检查新增账户、分析异常日志。安全策略的本质是让攻击者的每一步都变得困难,而不是追求绝对不可攻破。