CentOS服务器在默认安装完成后,真正暴露在公网上的攻击面往往比管理员预期的要大得多。很多人以为装完系统改个SSH端口、关掉root登录就安全了,实际上系统中预置的大量软件包、常驻服务、计划任务和内核模块,才是漏洞利用的主要入口。最小化安装的核心逻辑不是“装得少”,而是“只保留业务必需组件,其余全部移除或禁用”,让攻击者找不到可用的跳板。
为什么默认安装的CentOS不适合直接上线
CentOS的默认安装源会带入大量通用软件包,包括图形界面组件、打印服务、邮件传输代理、蓝牙支持、无线工具、开发库和各类硬件驱动。这些组件在服务器场景下几乎用不到,但它们会引入额外的二进制文件、库依赖和后台进程。每一个未被维护的组件都可能包含已知CVE漏洞,而攻击者通过指纹识别或端口扫描,很容易判断目标系统上运行了哪些服务。即便某个漏洞不能直接拿到root权限,也可能被用来做本地提权或横向移动。
以常见的Postfix为例,很多CentOS镜像默认安装了邮件传输代理,服务器并不收发邮件,但25端口却处于监听状态。攻击者可以利用它探测用户是否存在、尝试SMTP命令注入,甚至在特定版本下触发远程代码执行。类似的情况还包括Avahi-daemon、Chronyd的默认配置、rpcbind以及NetworkManager自带的各类插件。每一个多余的监听端口,都是攻击者可以交互的入口。
最小化安装的第一层:选择正确的安装组
在安装CentOS时,软件选择界面不要使用“Server with GUI”或“Minimal Install”以外的任何预设环境。“Minimal Install”只包含基础系统、核心工具和必要的系统服务,大约会安装300到400个软件包。相比之下,“Server with GUI”会带入超过1000个软件包,包含X Window System、GNOME桌面、浏览器、办公组件和大量图形依赖库。图形环境不仅增加磁盘占用,更重要的是它引入了D-Bus、PolicyKit、图形驱动和字体解析器等复杂组件,这些组件历史上多次出现过高危漏洞。
如果系统已经安装完成,可以通过以下命令查看当前安装组:
yum groups list
然后使用以下命令移除不需要的组:
yum group remove "Graphical Administration Tools" yum group remove "X Window System"
移除图形环境后,还需要检查是否有残留的桌面相关软件包:
rpm -qa | grep -E "gnome|kde|xfce|gtk|qt"
对于列出的包,逐个确认是否被其他必需组件依赖,确认无用后再用rpm -e或yum remove清理。
第二层:审计并关闭不必要的系统服务
最小化安装完成后,系统中仍然会启用一些默认服务。使用systemctl列出所有已启用的服务:
systemctl list-unit-files --type=service --state=enabled
重点检查以下服务,如果业务不需要就立即停止并禁用:
systemctl stop postfix systemctl disable postfix systemctl stop rpcbind systemctl disable rpcbind systemctl stop avahi-daemon systemctl disable avahi-daemon systemctl stop chronyd systemctl disable chronyd
Chronyd在部分场景下用于时间同步,但如果服务器使用NTPDATE手动同步或云平台自带时间同步,就可以关闭。Rpcbind是NFS相关服务的基础,不使用NFS的服务器必须关闭,否则111端口会成为扫描器的重点目标。Postfix如果不做邮件投递,直接禁用即可。
还要检查是否存在xinetd管理的服务:
chkconfig --list
如果xinetd本身没有启用,可以将其移除:
yum remove xinetd
另外,使用ss命令查看当前所有监听端口:
ss -tulnp
每一个监听地址都应该能被解释清楚。如果出现无法确认的服务,立即定位进程并检查其启动方式。
第三层:精简软件包依赖树
最小化安装并不意味着系统中没有多余软件包。使用以下命令可以列出所有已安装的软件包:
rpm -qa --qf "%{NAME}\n" | sort
逐个审视这些包,重点关注以下几类:开发工具(gcc、make、automake、libtool)、内核开发头文件(kernel-devel、kernel-headers)、调试工具(gdb、strace、ltrace)、文档包(*-doc)、以及各类硬件固件(*-firmware)。这些包在服务器运行环境中通常不需要,移除它们可以减少本地提权风险。攻击者一旦通过Web漏洞拿到低权限shell,如果系统上没有编译器,就很难编译提权exp;如果没有调试工具,也会增加漏洞利用难度。
批量移除开发工具示例:
yum remove gcc gcc-c++ make automake libtool kernel-devel kernel-headers
移除文档包:
yum remove $(rpm -qa | grep -E "\-doc$")
移除固件包时要注意,某些云平台或特定硬件需要特定固件才能正常启动,移除前最好在测试环境验证。对于物理服务器,建议保留linux-firmware包,但可以移除明显无用的无线网卡、蓝牙固件子包。
第四层:内核参数与网络层加固
最小化安装还需要配合内核参数调整,减少网络层的攻击面。编辑/etc/sysctl.conf或/etc/sysctl.d/99-hardening.conf,加入以下内容:
net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.default.secure_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.conf.all.log_martians = 1 net.ipv4.conf.default.log_martians = 1
然后执行sysctl -p使其生效。这些参数可以防止ICMP重定向攻击、源路由攻击和IP欺骗,同时开启SYN Cookie防护抵御SYN Flood。对于公网服务器,还可以考虑完全禁用IPv6,如果业务不需要的话:
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf sysctl -p
禁用IPv6后,需要同时修改SSH配置,确保sshd只监听IPv4地址。
第五层:SSH服务的深度裁剪
SSH是远程管理的命脉,也是暴力破解和漏洞利用的高发地。最小化安装后,SSH配置必须做以下调整。编辑/etc/ssh/sshd_config:
Port 2222 ListenAddress 0.0.0.0 PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes PermitEmptyPasswords no MaxAuthTries 3 LoginGraceTime 30 ClientAliveInterval 300 ClientAliveCountMax 2 AllowUsers admin Protocol 2 X11Forwarding no AllowTcpForwarding no
将端口改为非标准端口可以减少大量自动化扫描流量,但真正的安全性来自禁用密码登录和root登录。AllowUsers白名单只允许指定用户通过SSH登录,其他用户即使有有效密钥也无法连接。AllowTcpForwarding设为no可以防止攻击者利用SSH隧道绕过防火墙。X11Forwarding关闭后,即使系统中残留X11库,也无法通过SSH转发图形会话。
修改后重启sshd服务:
systemctl restart sshd
同时检查/etc/ssh/目录下是否存在多余的host key类型,只保留ed25519和rsa即可,移除dsa和ecdsa相关文件可以减少指纹泄露。
第六层:防火墙策略与包过滤
最小化安装的服务器必须启用防火墙,并且默认拒绝所有入站流量,只放行明确需要的端口。使用firewalld或iptables均可。以firewalld为例:
systemctl enable firewalld systemctl start firewalld firewall-cmd --permanent --remove-service=ssh firewall-cmd --permanent --add-port=2222/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload
这里先移除默认的ssh服务规则,再添加自定义端口的放行规则。如果服务器只提供Web服务,就只开放80和443。对于数据库服务器,只对特定内网IP开放数据库端口,不要直接对公网开放。防火墙规则配置完成后,使用firewall-cmd --list-all确认生效。
如果使用iptables,可以设置默认策略为DROP:
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 2222 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT service iptables save
默认拒绝策略可以确保即使某个服务意外启动并监听端口,外部也无法直接访问。
第七层:计划任务与自动化脚本的清理
CentOS默认安装会包含一些计划任务,例如logrotate、mlocate、updatedb等。这些任务本身通常安全,但攻击者如果获得了写权限,可能会利用计划任务实现持久化。检查/etc/cron.d、/etc/cron.daily、/etc/cron.hourly、/etc/cron.weekly和/var/spool/cron目录:
ls -la /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.weekly /var/spool/cron
移除不需要的任务,例如mlocate的updatedb,如果服务器上不需要快速文件搜索功能:
yum remove mlocate
同时检查/etc/crontab和root用户的crontab,确保没有异常条目。对于使用systemd timer替代cron的较新系统,使用systemctl list-timers查看所有定时任务。
第八层:日志与审计的最小化配置
最小化安装不代表放弃日志,反而需要更精确的日志记录。确保rsyslog或systemd-journald正常运行,但日志内容要经过筛选,避免记录过多无用信息。编辑/etc/rsyslog.conf,确保authpriv、kern、daemon等重要设施的日志被记录到独立文件:
authpriv.* /var/log/secure kern.* /var/log/kern.log daemon.* /var/log/daemon.log
同时配置logrotate,限制日志文件大小和保留份数,防止日志占满磁盘。对于安全审计,建议安装auditd并配置关键文件监控:
yum install audit systemctl enable auditd systemctl start auditd
在/etc/audit/rules.d/audit.rules中添加对/etc/passwd、/etc/shadow、/etc/ssh/sshd_config等关键文件的监控规则:
-w /etc/passwd -p wa -k identity -w /etc/shadow -p wa -k identity -w /etc/ssh/sshd_config -p wa -k sshd_config
这样任何对这些文件的写入或属性修改都会触发审计记录,帮助管理员发现入侵痕迹。
第九层:定期验证最小化效果
完成上述步骤后,需要定期验证系统的攻击面是否保持在最小状态。可以编写一个简单的检查脚本,定期执行以下命令并对比输出:
ss -tulnp
systemctl list-unit-files --type=service --state=enabled
rpm -qa --qf "%{NAME}\n" | sort
将输出保存为基线文件,之后每次检查时用diff对比。如果出现新增的监听端口、启用的服务或安装的软件包,立即排查原因。这种基线对比方法比依赖人工记忆更可靠,也能在服务器被入侵后快速发现异常。
对于使用配置管理工具的环境,可以将上述所有最小化步骤写成Ansible Playbook或Shell脚本,在新服务器部署时自动执行。这样既能保证每台服务器的一致性,也能减少人工操作遗漏。脚本中应包含软件包移除、服务禁用、内核参数调整、防火墙规则配置和SSH加固等全部内容,并在执行完成后输出审计报告。
最小化安装不是一次性的工作,而是一个持续的过程。每次系统更新或安装新软件后,都要重新评估攻击面。CentOS 7将在2024年6月停止维护,如果还在使用CentOS 7,建议尽快迁移到CentOS Stream、Rocky Linux或AlmaLinux等替代发行版,并在迁移过程中重新执行最小化部署。旧版本系统即使做了最小化安装,内核和核心库的未修补漏洞仍然会带来严重风险。
