首页 / 帮助文档 / centos服务器虚拟主机安全防护配置

centos服务器虚拟主机安全防护配置

CentOS服务器部署虚拟主机后,默认配置几乎不具备抵御真实网络攻击的能力。最常见的失陷入口不是漏洞利用,而是SSH弱口令、未限制的数据库监听、开放的面板端口以及没有隔离的站点目录权限。安全防护要做的第一件事是确认当前系统暴露了多少服务,用ss -lntup查看所有监听地址。如果看到mysqld监听在0.0.0.0:3306,或者redis监听在0.0.0.0:6379且未设置密码,这台机器基本处于裸奔状态。把数据库和缓存服务绑定到127.0.0.1是必须立即执行的步骤,修改/etc/my.cnf中的bind-address,以及redis.conf中的bind参数,然后重启对应服务。

SSH登录加固与访问控制

虚拟主机环境下,多个站点管理员可能需要通过SSH维护服务器,但默认的22端口和密码登录会持续吸引暴力破解。修改SSH端口只能降低噪音,不能作为主要防线。更有效的做法是禁用密码登录,强制使用密钥认证。编辑/etc/ssh/sshd_config,设置PasswordAuthentication no、PermitRootLogin no、PubkeyAuthentication yes。如果确实需要保留root的紧急登录通道,可以配合AllowUsers限制仅允许特定IP和用户登录。修改前务必先配置好普通用户的密钥登录并测试成功,否则可能把自己锁在服务器外。对于必须保留密码登录的场景,安装fail2ban并配置sshd监狱,连续失败3次封禁来源IP两小时,能显著减少日志噪音和暴力尝试。

系统防火墙策略细化

CentOS 7及之后的版本默认使用firewalld,但很多运维直接关闭防火墙以避免配置麻烦,这是虚拟主机环境中最危险的操作之一。正确的做法是默认拒绝所有入站流量,只开放必要的服务端口。对于提供Web服务的虚拟主机,通常只需要开放80和443端口。如果使用非标准SSH端口,也要在防火墙中放行该端口。执行firewall-cmd --permanent --add-service=http、firewall-cmd --permanent --add-service=https、firewall-cmd --permanent --add-port=2222/tcp,然后firewall-cmd --reload。如果服务器上有多个虚拟主机共用一个IP,防火墙无法区分域名,但可以限制某些管理后台仅允许特定来源IP访问,例如只允许办公网络IP访问宝塔面板或phpMyAdmin的端口。

Web服务运行权限与目录隔离

Apache和Nginx在CentOS上默认以apache或nginx用户运行,所有虚拟主机的PHP进程也继承这个身份。这意味着任何一个站点被上传webshell后,攻击者可以读取同一服务器上其他站点的配置文件、数据库密码甚至源代码。解决这个问题的核心是使用PHP-FPM的进程池隔离。在php-fpm.d目录下为每个虚拟主机创建独立的pool配置文件,每个pool设置不同的user和group,并开启chroot或至少设置open_basedir限制。配置示例:

[site1]
user = site1user
group = site1group
listen = /var/run/php-fpm-site1.sock
listen.owner = nginx
listen.group = nginx
php_admin_value[open_basedir] = /var/www/site1:/tmp
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen

Nginx的站点配置中,将fastcgi_pass指向对应的socket文件,这样每个站点的PHP进程只拥有自己目录的权限。同时检查站点目录的属主和权限,网站文件不应由nginx用户可写,只有需要上传的目录如uploads才开放写权限,且设置权限为755或775,避免777。

数据库账号最小权限原则

虚拟主机环境中,很多管理员图省事给所有站点使用同一个数据库root账号,这是非常危险的做法。一旦某个站点的数据库配置文件泄露,所有站点的数据都会暴露。为每个虚拟主机创建独立的数据库用户,并只授予该数据库的权限。使用以下SQL创建用户并授权:

CREATE USER 'site1_dbuser'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON site1_database.* TO 'site1_dbuser'@'localhost';
FLUSH PRIVILEGES;

同时移除或禁用数据库root用户的远程登录权限,确保root只能通过本地socket登录。定期检查mysql.user表中的用户,删除匿名用户和测试数据库。对于使用phpMyAdmin的服务器,将phpMyAdmin目录设置独立的访问密码,或者直接通过SSH隧道访问,不对外公开。

HTTPS与传输层加密

虚拟主机上如果还运行着HTTP明文站点,用户登录信息和管理后台的Cookie都可能被中间人截获。使用Let's Encrypt的certbot可以免费为每个域名签发SSL证书。在CentOS上安装certbot后,执行certbot --nginx -d example.com -d www.example.com自动配置证书和续期。对于Apache环境使用certbot --apache。证书续期可以通过cron定时任务自动完成,添加0 3 * * * certbot renew --quiet到crontab。配置完成后,在Nginx或Apache中强制跳转HTTPS,并启用HSTS头。在Nginx中添加add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;。同时检查SSL协议版本,禁用TLS 1.0和1.1,只保留TLS 1.2和1.3。

日志监控与入侵检测

安全防护不是配置完就结束了,持续监控才能发现异常行为。确保系统日志服务正常运行,定期检查/var/log/secure中的SSH登录记录、/var/log/nginx/中的访问日志和错误日志。对于虚拟主机环境,重点关注异常频繁的404请求、对/wp-admin、/phpmyadmin等敏感路径的扫描、以及突然增大的流量。安装并配置auditd可以记录关键文件的修改操作,例如对/etc/passwd、/etc/shadow、网站配置文件的改动。使用命令auditctl -w /etc/passwd -p wa -k passwd_changes添加监控规则。对于更主动的防御,可以部署mod_security作为Web应用防火墙,配合OWASP核心规则集拦截SQL注入、XSS等常见攻击。CentOS下安装mod_security后,在Nginx或Apache中启用,并针对虚拟主机环境调整规则,避免误杀正常的网站功能。

系统更新与软件版本管理

CentOS 7已经停止维护,CentOS 8也提前结束生命周期,继续使用这些版本意味着内核和系统组件不再获得安全补丁。如果条件允许,应迁移到Rocky Linux或AlmaLinux等兼容的替代发行版。对于仍在运行CentOS的服务器,至少确保所有已安装的软件包保持最新,执行yum update -y定期更新。但要注意,更新前在测试环境验证,避免更新导致PHP版本不兼容或服务启动失败。虚拟主机上运行的PHP、MySQL、Nginx等核心软件,不要使用源码编译的旧版本,优先使用发行版仓库或官方维护的软件源。对于使用面板管理的服务器,面板本身的漏洞往往比站点漏洞更致命,及时更新面板版本,并限制面板的访问来源。

备份与灾难恢复

再完善的防护也无法保证绝对安全,可靠的备份是最后的防线。虚拟主机环境需要备份两部分:网站文件和数据库。使用rsync将网站文件同步到远程存储或另一台服务器,数据库使用mysqldump每日导出。对于数据量较大的站点,可以使用xtrabackup进行在线热备份。备份文件本身也需要加密和权限保护,避免备份服务器成为新的攻击目标。定期进行恢复演练,验证备份文件可以正常还原。将备份存储在异地,防止服务器被入侵后攻击者删除本地备份。设置备份保留策略,至少保留最近7天的每日备份和最近4周的每周备份。

虚拟主机安全防护是一个持续的过程,不是一次性的配置工作。攻击手段不断演变,防护策略也需要定期审视和调整。从最基础的端口和权限控制做起,逐步建立完整的防护体系,才能让CentOS服务器上的虚拟主机在公网环境中稳定运行。