在CentOS系统中,默认安装并启动了大量你可能根本用不到的服务。这些服务不仅消耗内存和CPU资源,更严重的是,每一个运行中的网络服务都是一个潜在的攻击面。黑客一旦发现某个服务存在漏洞,就能以此为跳板侵入服务器。因此,加固CentOS服务器的第一步,不是安装复杂的防火墙规则,而是立刻停掉所有非必要的进程。这比事后打补丁要有效得多。

如何快速摸清当前运行的服务

动手之前,必须先看清楚系统里到底跑了哪些东西。很多人习惯用top看进程,但那不够直观。对于服务管理,在CentOS 6及以前使用service和chkconfig,而在CentOS 7及以后主要使用systemctl。如果你用的是CentOS 7或更高版本,执行以下命令可以列出所有正在运行的服务:

systemctl list-units --type=service --state=running

这个列表可能会让你大吃一惊。你会发现很多默认开启的服务,比如蓝牙、打印服务、邮件服务等,在服务器环境中完全用不到。再用下面的命令查看哪些服务被设置为开机自启,这些是重点关注对象:

systemctl list-unit-files --type=service | grep enabled

通过这两条命令,你就能对系统的服务现状有一个清晰的底账。接下来要做的就是逐一甄别,哪些是维持系统运行的命脉,哪些是多余的累赘。

第一类必须关闭的高危服务:网络与存储类

有些服务在设计上就缺乏足够的安全认证机制,或者监听在所有网络接口上,这类服务必须优先处理。首先是NFS相关服务。如果你没有使用网络文件系统,rpcbind、nfs-server、nfs-lock这些服务都应该立即关闭。rpcbind服务将RPC程序号转换为通用地址,经常被利用来进行DDoS反射攻击。

systemctl stop rpcbind.socket
systemctl stop rpcbind
systemctl disable rpcbind.socket
systemctl disable rpcbind

注意,rpcbind.socket这种基于套接字的服务需要单独停止和禁用,否则它会在需要时被自动拉起。同样,如果没有使用iSCSI存储,iscsi、iscsid服务也应当关闭。这类服务通常监听在3260端口,容易成为暴力破解的目标。

第二类:过时的和不安全的远程访问服务

Telnet服务是典型的明文传输协议,所有数据包括密码都以明文形式在网络中传输,现在几乎没有任何理由在服务器上保留它。检查一下xinetd管理的服务,telnet-server可能就隐藏在其中。执行chkconfig --list或检查/etc/xinetd.d/目录,找到telnet相关的配置,将disable设为yes。对于使用systemd的系统,直接停用telnet.socket即可。

FTP服务也存在类似问题。vsftpd虽然可以配置TLS加密,但如果你不需要FTP功能,就不要运行它。现在更安全的做法是使用sftp,它基于SSH协议,不需要额外开放端口,也不需要单独维护一套用户认证体系。

systemctl stop vsftpd
systemctl disable vsftpd
第三类:桌面环境残留服务,服务器上完全多余

CentOS服务器安装时如果选择了图形界面,或者某些依赖关系自动拉取了桌面组件,就会带进来一堆无用的服务。比如蓝牙服务bluetooth,服务器根本不需要蓝牙连接,开着它只会增加内核攻击面。还有打印服务cups,服务器不需要处理打印任务,这个服务默认监听631端口,历史上出现过多次远程代码执行漏洞。

另外,Avahi-daemon实现了苹果的Bonjour协议,用于零配置网络发现。在数据中心环境里,这种自动发现机制不仅没用,还可能泄露服务信息。果断关闭:

systemctl stop bluetooth cups avahi-daemon
systemctl disable bluetooth cups avahi-daemon

图形界面相关的显示管理器gdm或lightdm也要关闭。服务器应该运行在multi-user.target模式下,而不是graphical.target。用systemctl get-default查看当前模式,如果不是多用户模式,执行以下命令切换:

systemctl set-default multi-user.target
第四类:邮件相关服务,不收发邮件就不要运行

CentOS默认安装了Postfix邮件传输代理,很多系统任务会通过它发送通知邮件给root用户。但如果你不关心这些系统邮件,或者使用外部SMTP中继,那么监听在25端口的smtp服务就应该被禁用。注意,直接停掉Postfix可能导致某些cron任务的输出无法投递,你可以选择让Postfix仅监听本地回环地址,而不是完全关闭。修改/etc/postfix/main.cf,将inet_interfaces设置为loopback-only:

inet_interfaces = loopback-only

然后重启服务。如果完全不需要,就直接停止并禁用postfix服务。另外,dovecot这类POP3/IMAP服务如果存在,也一并关闭,除非这台机器真的作为邮件服务器使用。

第五类:数据库和缓存服务,注意网络绑定设置

很多运维人员会在服务器上安装Redis、Memcached或MongoDB,却忘记了这些服务默认可能监听在0.0.0.0上,并且没有密码保护。如果你的应用和数据库在同一台机器上,务必让这些服务只监听127.0.0.1。以Redis为例,修改redis.conf:

bind 127.0.0.1

如果这些服务只是测试用的,不再需要,就直接停用。特别是Memcached,它基于UDP的反射放大攻击至今仍在互联网上肆虐。用systemctl stop memcached和systemctl disable memcached来彻底关闭它。

第六类:不常用的计划任务与消息服务

atd是用于执行一次性计划任务的服务,如果你只使用crontab来管理周期任务,可以关闭atd。这个服务虽然风险相对较小,但减少运行中的进程总是有益的。还有dbus服务,在纯服务器无桌面环境下,它的作用被大大削弱,但某些应用程序可能依赖它,关闭前需要确认。

postfix关闭后,如果系统邮件完全不需要,也可以考虑关闭crond中的邮件通知,在每个cron任务后面加上>/dev/null 2>&1,避免产生死信。另外,一些不用的内核模块相关服务,如kdump,它用于内核崩溃时转储内存,但本身也消耗资源,如果不需要分析内核崩溃原因,可以关闭:

systemctl stop kdump
systemctl disable kdump
第七类:微服务与容器遗留进程

现在很多服务器上运行着Docker或Podman。有时候容器已经删除了,但对应的映射端口服务或者docker-proxy进程还在。用ss -tlnp和ss -ulnp查看所有监听端口,对比你的业务需求,找出那些不应该存在的监听。对于Docker,如果某个容器不再使用,直接用docker stop和docker rm清理干净,不要留下僵尸容器占用端口。

如果你的业务不涉及Kubernetes,却安装了kubelet、kube-proxy这些组件,它们也会打开大量端口。确认不需要后,应当完全卸载,而不仅仅是停止服务。

建立服务基线,固化安全配置

清理完无用服务后,你需要建立一个服务基线,记录下当前正常运行的服务列表。这样在后续运维中,一旦有异常服务被启动,就能快速发现。可以用下面命令导出一份干净的服务列表:

systemctl list-unit-files --type=service --state=enabled > /root/service-baseline.txt

将此文件保存在安全位置,定期用diff命令对比当前启用的服务与基线的差异。任何新增的启用服务都应该触发告警,需要人工确认其合法性。

关闭服务时的注意事项与依赖检查

在禁用服务前,一定要检查依赖关系。用systemctl list-dependencies service-name可以查看某个服务被哪些单元依赖。例如,你可能会发现NetworkManager依赖某些看似无关的服务。盲目禁用可能导致网络中断。建议先在测试环境中验证,或者使用mask命令替代disable来彻底屏蔽服务,mask可以防止服务被其他依赖关系自动拉起来:

systemctl mask udisks2

udisks2是存储设备管理服务,服务器上通常不需要,但某些监控工具可能间接调用它。mask之后,任何启动该服务的尝试都会被阻止,这比disable更彻底。

还有一个容易忽略的地方是xinetd超级守护进程。它管理着很多按需启动的服务,如chargen、daytime、discard等。这些服务纯粹是调试用的,在现代网络环境中极其危险。检查/etc/xinetd.d/目录,所有服务的disable都应该是yes。如果整个xinetd都不需要,直接停用xinetd服务。

内核参数与网络层面的辅助加固

关闭服务的同时,可以配合内核参数调整来缩小攻击面。例如,禁止响应ICMP广播请求,减少Smurf攻击风险;开启TCP SYN Cookie保护,防止SYN Flood攻击。编辑/etc/sysctl.conf,添加以下内容:

net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

执行sysctl -p使其生效。这些参数与关闭无用服务形成互补,共同构建更立体的防御体系。关闭服务解决的是应用层和传输层的暴露面,内核参数则在网络层和链路层提供保护。

通过以上步骤,一台典型的CentOS服务器可以关闭至少十几个无用服务,释放出来的内存和CPU资源可能不多,但安全收益巨大。每减少一个监听端口,就消除了一类潜在的攻击路径。这种基于最小化原则的安全策略,是所有高级防御手段的基础。没有这个基础,再昂贵的安全设备也难以发挥作用。