接手一台裸奔的CentOS服务器,等于把家门钥匙挂在门外。很多人以为装个防火墙就万事大吉,实际上攻击者扫描到你的服务器,第一件事就是探测SSH端口和Web服务的版本信息。最直接的加固手段,是从操作系统底层开始,把不必要的服务、端口、用户权限全部收紧。CentOS 7和CentOS Stream 8/9在命令细节上略有差异,但核心逻辑完全一致。下面直接进入具体操作,每一步都经过生产环境验证。
SSH登录安全:别再用密码了密码登录是最大的安全隐患。暴力破解工具每秒钟能尝试上万个密码组合,一旦撞库成功,服务器直接沦陷。第一件事,生成SSH密钥对,把公钥部署到服务器,然后彻底关闭密码登录。在本地电脑执行 ssh-keygen -t ed25519 生成密钥,用 ssh-copy-id 把公钥推送到服务器。接着修改SSH配置文件:
vim /etc/ssh/sshd_config
找到并修改以下参数:
Port 2222 # 把默认22端口改成高位端口,减少扫描 PermitRootLogin no # 禁止root直接登录 PasswordAuthentication no # 关闭密码认证 PubkeyAuthentication yes # 开启密钥认证 MaxAuthTries 3 # 限制尝试次数 ClientAliveInterval 300 # 超时空闲断开 ClientAliveCountMax 0 AllowUsers yourusername # 只允许特定用户登录
改完端口后,务必先在防火墙放行新端口,测试新端口能正常登录,再关掉22端口。很多人改完配置直接重启sshd,结果新端口被防火墙挡了,自己也被锁在外面。执行 systemctl restart sshd 后不要退出当前会话,另开一个终端测试新端口能否连接,确认无误再关闭旧连接。
系统层面的最小化原则CentOS默认安装会带很多用不到的服务,每一个服务都是潜在的攻击面。用 ss -tlnp 查看所有监听端口,只保留必要的。常见的多余服务比如avahi-daemon、postfix、rpcbind,直接停掉并禁止开机启动:
systemctl stop avahi-daemon postfix rpcbind systemctl disable avahi-daemon postfix rpcbind
内核参数也需要调整,增强网络层面的抗攻击能力。编辑 /etc/sysctl.conf,加入以下参数:
# 防御SYN洪水攻击 net.ipv4.tcp_syncookies = 1 # 忽略ICMP重定向 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 # 禁止源路由 net.ipv4.conf.all.accept_source_route = 0 # 开启反向路径过滤,防止IP欺骗 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 # 记录可疑包 net.ipv4.conf.all.log_martians = 1
执行 sysctl -p 让配置立即生效。这些参数能有效防御常见的DDoS和IP欺骗攻击,是内核层面的第一道防线。
防火墙策略:精细化控制进出流量CentOS 7开始默认使用firewalld,但生产环境我更推荐直接使用iptables或者nftables,规则更直观可控。如果对firewalld不熟悉,建议关闭它并启用iptables-services。核心原则是白名单思维:先设置默认拒绝所有入站流量,再逐个放行需要的端口。
systemctl stop firewalld systemctl disable firewalld yum install iptables-services -y systemctl start iptables systemctl enable iptables
编写iptables规则,只放行Web端口和新改的SSH端口:
iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j 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
如果服务器有多个IP,还可以针对特定IP做访问限制,比如只允许公司出口IP访问SSH端口,其他来源一律拒绝。这样即使端口暴露,攻击者也连不上。
Web服务运行环境加固:Nginx/Apache的安全配置Web服务器是直接面向公网的服务,配置不当会泄露大量信息。以Nginx为例,默认配置会显示版本号,攻击者可以根据版本号查找已知漏洞。在 nginx.conf 的http块中加入:
server_tokens off; proxy_hide_header X-Powered-By; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always;
关闭版本显示的同时,添加安全响应头,防止点击劫持和MIME类型嗅探攻击。对于Apache,需要在httpd.conf中设置:
ServerTokens Prod ServerSignature Off TraceEnable Off Header always append X-Frame-Options SAMEORIGIN
另外,禁止目录浏览是基本操作。Nginx在每个location块中确保没有 autoindex on,Apache则设置 Options -Indexes。上传目录要单独配置,禁止执行脚本权限。比如Nginx对上传目录单独处理:
location /uploads/ {
location ~ .*\.(php|py|sh|pl)?$ {
deny all;
}
}
这样即使攻击者上传了Webshell,也无法通过URL直接执行。
PHP运行环境隔离与权限控制网站程序大多用PHP编写,PHP的配置直接决定安全性。编辑 /etc/php.ini,关闭高危函数和执行权限:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source allow_url_fopen = Off allow_url_include = Off expose_php = Off open_basedir = /var/www/html:/tmp
open_basedir 限制PHP只能访问指定目录,即使程序有文件包含漏洞,也无法读取系统敏感文件。每个网站应该设置独立的open_basedir路径,做到站点间完全隔离。如果使用PHP-FPM,可以为每个站点创建独立的进程池,用不同的用户身份运行:
[site1] user = site1user group = site1group listen = /var/run/php-fpm/site1.sock
这样站点A被入侵,攻击者无法跨站访问站点B的文件,权限隔离做到位。
文件权限与SELinux的正确使用很多人嫌麻烦直接关掉SELinux,等于自废武功。SELinux是强制访问控制系统,能在应用层被突破后提供最后一道防线。正确的做法不是关闭,而是根据实际需求调整策略。先确认SELinux状态为 enforcing:
setenforce 1 sed -i 's/SELINUX=disabled/SELINUX=enforcing/' /etc/selinux/config
网站文件权限要严格区分。所有文件属主设为root或专用用户,属组设为Web服务器用户组,目录权限755,文件权限644。需要写入的目录如缓存、上传,单独设置权限,并配合SELinux策略:
chown -R siteuser:nginx /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
chmod 770 /var/www/html/runtime
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/runtime(/.*)?"
restorecon -Rv /var/www/html/runtime
SELinux的布尔值开关也要合理配置,比如允许Nginx发起网络连接:
setsebool -P httpd_can_network_connect on
这样既保证了功能正常,又保留了SELinux的安全防护能力。
日志审计与入侵检测安全加固不是一次性工作,持续的监控和审计才是关键。配置rsyslog集中收集日志,重点监控 /var/log/secure、/var/log/messages 和Web服务的错误日志。安装并配置AIDE做文件完整性校验,一旦系统关键文件被篡改,能第一时间发现:
yum install aide -y aide --init mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
设置crontab定期执行检查并发送报告:
0 3 * * * /usr/sbin/aide --check | mail -s "AIDE Report" admin@example.com
对于Web应用层面,安装ModSecurity作为Web应用防火墙,配合OWASP核心规则集,能拦截SQL注入、XSS等常见攻击。Nginx下可以使用ModSecurity的独立模块,Apache可以直接加载模块。规则集配置完成后,先以检测模式运行一段时间,确认无误再切换为拦截模式。
数据库安全加固MySQL或MariaDB安装后必须运行安全配置脚本 mysql_secure_installation,移除匿名用户、测试数据库,禁止root远程登录。数据库用户的权限要遵循最小化原则,应用账号只授予对应数据库的权限,不要给ALL PRIVILEGES:
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'appuser'@'localhost' IDENTIFIED BY 'strongpassword'; FLUSH PRIVILEGES;
数据库默认端口3306如果不需要远程连接,绑定在127.0.0.1上,编辑 /etc/my.cnf:
bind-address = 127.0.0.1
定期备份数据库是安全策略的重要一环,被攻击后能快速恢复数据。用mysqldump配合crontab做自动备份,备份文件加密存储并传输到异地。
自动更新与漏洞管理CentOS的yum更新机制要及时利用。安装yum-cron实现安全补丁的自动安装:
yum install yum-cron -y systemctl start yum-cron systemctl enable yum-cron
编辑 /etc/yum/yum-cron.conf,设置 update_cmd 为 security,只安装安全更新,避免功能性更新带来兼容性问题。同时订阅CentOS的安全公告邮件列表,关注CVE漏洞信息,对于高危漏洞要第一时间响应。内核更新后需要重启服务器,可以配合kernel-lt或kernel-ml的长支持版本,减少重启频率。
以上这些加固措施,从操作系统层到Web应用层,形成纵深防御体系。每一层单独看似乎都能被绕过,但多层叠加后,攻击者的成本会指数级上升。安全没有一劳永逸,定期审查日志、更新规则、调整策略,才是长期保持服务器安全的正道。
