CentOS服务器的安全加固,核心就两件事:把不需要的服务全部关掉,把不需要开放的端口全部封死。很多管理员装完系统就直接用,默认跑着几十个服务、开着一堆端口,等于把大门敞开让人随便进。真正要做安全最小化,你需要从系统服务裁剪、端口审计、防火墙规则配置、入侵检测四个层面同时下手,缺一不可。下面我把每一步具体怎么操作、为什么这么做,全部讲透。
一、为什么要做服务最小化CentOS默认安装后会启动大量后台服务,比如cups打印服务、avahi-daemon本地发现服务、postfix邮件服务、bluetooth蓝牙服务等等。这些服务对于大多数服务器来说完全没用,但每多一个运行中的服务,就多一个潜在的攻击面。黑客做的第一件事就是端口扫描,发现你开了什么端口、跑了什么服务,然后针对已知漏洞发起攻击。所以服务最小化不是可选项,是必选项。原则很简单:这台服务器干什么活,就只留什么服务,其余全部禁用。
二、查看当前运行的所有服务在动手之前,先摸清家底。用以下命令查看所有正在运行的服务:
systemctl list-units --type=service --state=running
再查看所有已安装但未运行的服务:
systemctl list-unit-files --type=service | grep enabled
这两条命令一跑,你就能看到哪些服务是enabled状态(开机自启),哪些是running状态(当前在跑)。把这些列出来,逐个判断是否需要。常见的可以安全禁用的服务包括:cups、avahi-daemon、bluetooth、ModemManager、NetworkManager(如果用静态网络配置)、irqbalance(某些场景)、mdmonitor、postfix(不做邮件服务器时)。
三、禁用不需要的服务确认不需要的服务后,用systemctl禁用并停止:
systemctl stop <服务名> systemctl disable <服务名>
举个例子,禁用打印服务和蓝牙服务:
systemctl stop cups systemctl disable cups systemctl stop bluetooth systemctl disable bluetooth
注意,有些服务之间有依赖关系,直接disable可能会报错。这时候需要用mask命令彻底屏蔽:
systemctl mask <服务名>
mask会创建一个软链接指向/dev/null,这个服务就彻底无法被启动了,包括被其他服务间接调用也不行。对于确定永远不用的服务,mask比disable更彻底。
四、端口审计与关闭策略服务禁用了,对应的端口自然就关了。但有些端口可能被xinetd或者独立程序占用,需要单独检查。用ss命令查看所有监听端口:
ss -tlnp
或者用netstat:
netstat -tlnp
你会看到类似这样的输出,每一行代表一个监听端口和对应的进程:
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=567,fd=13))
重点关注0.0.0.0绑定的端口,这意味着对外完全开放。127.0.0.1绑定的只监听本地,相对安全但也要评估是否必要。常见需要保留的端口:22(SSH,远程管理)、80/443(Web服务)、3306(数据库,通常只监听127.0.0.1)。其他端口如果不是业务必需,一律关闭。
五、配置firewalld防火墙规则CentOS 7及以上版本默认使用firewalld作为防火墙。配置思路是:默认拒绝所有入站流量,只放行必要的端口。首先查看当前防火墙状态和已有规则:
firewall-cmd --state firewall-cmd --list-all
设置默认区域为drop(直接丢弃包,不回响应):
firewall-cmd --set-default-zone=drop
然后只开放必要的端口,比如SSH和HTTP:
firewall-cmd --permanent --add-port=22/tcp firewall-cmd --permanent --add-port=80/tcp firewall-cmd --permanent --add-port=443/tcp firewall-cmd --reload
如果你的数据库只需要本地访问,不要开放3306端口到外部,而是只允许本地:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="3306" accept' firewall-cmd --reload
这里有个关键点:rich-rule比简单的--add-port精细得多,可以指定来源IP、协议、端口,实现精确控制。对于生产环境,强烈建议用rich-rule而不是粗暴地开放端口。
六、SSH端口加固与防暴力破解SSH是服务器管理的命脉,也是黑客暴力破解的首要目标。默认22端口天天被扫,改端口是第一步。编辑/etc/ssh/sshd_config:
Port 2222 PermitRootLogin no PasswordAuthentication no MaxAuthTries 3 LoginGraceTime 30
改完端口后重启SSH服务并在防火墙放行新端口:
systemctl restart sshd firewall-cmd --permanent --remove-port=22/tcp firewall-cmd --permanent --add-port=2222/tcp firewall-cmd --reload
禁止root直接登录、禁用密码认证(改用密钥登录)、限制最大尝试次数、缩短登录超时时间,这几项组合起来,暴力破解基本失效。同时建议安装fail2ban来自动封禁多次失败登录的IP:
yum install -y fail2ban systemctl enable fail2ban systemctl start fail2ban
fail2ban默认会监控SSH日志,发现短时间内多次失败登录就自动把IP加入防火墙黑名单。配置文件在/etc/fail2ban/jail.local,可以自定义封禁时间和阈值。
七、部署端口扫描检测与主动防御光防守不够,你还需要知道有没有人在扫你。可以用psad(Port Scan Attack Detector)来监控iptables/firewalld日志,自动识别端口扫描行为并报警甚至自动封禁:
yum install -y psad systemctl enable psad systemctl start psad
psad会分析防火墙日志中的连接模式,识别出SYN扫描、FIN扫描、XMAS扫描等常见扫描手法,一旦检测到就发邮件告警并可配置自动阻断。另一个工具是Snort或Suricata,这是入侵检测系统(IDS),可以实时分析网络流量中的异常行为。不过IDS部署和维护成本较高,小型服务器用psad配合fail2ban基本够用。
八、定期审计与自动化脚本安全不是一次性的工作,需要持续维护。建议写一个简单的审计脚本,每周定时运行,检查服务状态和端口变化:
#!/bin/bash echo "=== 当前运行的服务 ===" > /var/log/security_audit.log systemctl list-units --type=service --state=running >> /var/log/security_audit.log echo "=== 当前监听端口 ===" >> /var/log/security_audit.log ss -tlnp >> /var/log/security_audit.log echo "=== 防火墙规则 ===" >> /var/log/security_audit.log firewall-cmd --list-all >> /var/log/security_audit.log echo "审计完成: $(date)" >> /var/log/security_audit.log
把这个脚本加入crontab每周执行一次,一旦发现有异常服务启动或新端口开放,立刻排查。很多入侵事件都是因为管理员疏于检查,被植入了后门程序开了新端口都不知道。
九、SELinux不要轻易关闭很多人图省事直接把SELinux设成disabled,这是非常危险的做法。SELinux是CentOS自带的强制访问控制系统,即使某个服务被攻破,SELinux也能限制攻击者的权限范围。正确做法是保持enforcing模式,遇到确实需要放行的操作,用audit2allow生成自定义策略:
ausearch -m avc -ts recent | audit2allow -M mypolicy semodule -i mypolicy.pp
这样既保证了安全,又不影响正常业务运行。
十、总结与核心原则CentOS安全加固的本质就是最小权限原则:只开必要的服务,只放必要的端口,只给必要的权限。具体执行顺序是:先审计现有服务和端口,再逐一禁用无用项,然后配置防火墙精确放行,接着加固SSH等关键服务,最后部署扫描检测和定期审计机制。不要追求一步到位,而是建立持续检查的习惯。服务器安全是动态对抗,没有一劳永逸的方案,但做好这些基础工作,你的服务器安全性已经超过了绝大多数裸奔的机器。
