服务器被黑、数据泄露、网站挂马——这些 nightmare 每个站长都不想遇到。但现实中,很多VPS出厂配置几乎"裸奔",默认端口、弱密码、无防火墙,黑客扫描器全自动攻击,不挑目标只挑漏洞。今天分享一套经过实战验证的安全加固方案,从网络层到应用层层层设防,让你的VPS从"纸糊的"变成"铁打的"。
一、网络层加固:第一道防线
- 修改SSH默认端口
SSH默认22端口是暴力破解的重灾区,修改后攻击量下降90%以上。
# 编辑SSH配置文件
vim /etc/ssh/sshd_config
# 修改端口(建议1024-65535之间)
Port 37291
# 禁用root登录
PermitRootLogin no
# 仅允许密钥登录
PasswordAuthentication no
# 重启SSH服务
systemctl restart sshd
注意:修改前确保已添加普通用户并配置好sudo权限,否则可能把自己锁在门外。
- 配置防火墙
iptables基础规则:
# 清空现有规则
iptables -F
# 默认策略:拒绝所有入站
iptables -P INPUT DROP
iptables -P FORWARD DROP
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH(修改后的端口)
iptables -A INPUT -p tcp --dport 37291 -j ACCEPT
# 允许HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许Ping(可选)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 保存规则
iptables-save > /etc/iptables/rules.v4
推荐使用ufw(Ubuntu):
# 安装
apt-get install ufw
# 默认拒绝入站
ufw default deny incoming
# 允许SSH(修改后的端口)
ufw allow 37291/tcp
# 允许Web服务
ufw allow 80/tcp
ufw allow 443/tcp
# 启用
ufw enable
# 查看状态
ufw status verbose
- 安装Fail2ban防暴力破解
Fail2ban监控日志,自动封禁暴力破解IP。
# 安装
apt-get install fail2ban
# 创建本地配置
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
backend = systemd
[sshd]
enabled = true
port = 37291
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log
EOF
# 启动
systemctl enable fail2ban
systemctl start fail2ban
# 查看封禁状态
fail2ban-client status sshd
二、系统层加固:减少攻击面
- 及时更新系统
漏洞修复是第一优先级。
# Debian/Ubuntu
apt-get update && apt-get upgrade -y
# CentOS
yum update -y
# 自动安全更新(推荐)
apt-get install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
- 最小化安装服务
只运行必要的服务,每个服务都是潜在漏洞。
# 查看运行中的服务
systemctl list-units --type=service --state=running
# 停止不必要的服务
systemctl stop apache2
systemctl disable apache2
# 卸载不需要的软件
apt-get remove --purge telnet ftp
- 配置SELinux/AppArmor
强制访问控制,限制进程权限。
# Ubuntu安装AppArmor
apt-get install apparmor apparmor-utils
# 查看状态
aa-status
# 将Nginx设为enforce模式
aa-enforce /etc/apparmor.d/usr.sbin.nginx
三、应用层加固:Web服务安全
- Nginx安全配置
server {
listen 443 ssl http2;
server_name example.com;
# SSL配置
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline';" always;
# 隐藏版本号
server_tokens off;
# 限制请求体大小
client_max_body_size 10M;
# 限制连接数
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;
location / {
# 禁止访问隐藏文件
location ~ /\. {
deny all;
}
# 禁止访问敏感文件
location ~* \.(git|env|sql|log|ini)$ {
deny all;
}
}
}
- 数据库安全
MySQL加固:
# 删除匿名用户
DELETE FROM mysql.user WHERE User='';
# 删除远程root访问
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
# 删除测试数据库
DROP DATABASE IF EXISTS test;
# 刷新权限
FLUSH PRIVILEGES;
# 创建专用应用用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'appuser'@'localhost';
- PHP安全配置
# php.ini关键设置
expose_php = Off
display_errors = Off
log_errors = On
allow_url_fopen = Off
allow_url_include = Off
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
# 上传限制
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 2
四、监控与告警:及时发现异常
- 安装AIDE文件完整性检查
AIDE监控关键系统文件变更,发现篡改立即告警。
# 安装
apt-get install aide
# 初始化数据库
aideinit
# 移动数据库到正确位置
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# 手动检查
aide --check
# 加入crontab每日检查
0 3 * * * /usr/bin/aide --check | mail -s "AIDE Check $(hostname)" admin@example.com
- 日志集中管理
# 安装rsyslog
apt-get install rsyslog
# 配置远程日志服务器(可选)
echo "*.* @log-server:514" >> /etc/rsyslog.conf
# 关键日志监控脚本
cat > /opt/log-monitor.sh << 'EOF'
#!/bin/bash
# 监控SSH失败登录
FAILED_SSH=$(grep "Failed password" /var/log/auth.log | wc -l)
if [ $FAILED_SSH -gt 10 ]; then
echo "警告:SSH失败登录次数过多:$FAILED_SSH" | mail -s "SSH告警" admin@example.com
fi
# 监控404攻击
HTTP_404=$(grep " 404 " /var/log/nginx/access.log | wc -l)
if [ $HTTP_404 -gt 100 ]; then
echo "警告:404请求过多:$HTTP_404" | mail -s "Web告警" admin@example.com
fi
EOF
chmod +x /opt/log-monitor.sh
echo "*/10 * * * * /opt/log-monitor.sh" | crontab
- 安装OSSEC HIDS
OSSEC是开源主机入侵检测系统,实时监控文件完整性、日志分析、rootkit检测。
# 下载安装
wget https://github.com/ossec/ossec-hids/archive/3.7.0.tar.gz
tar -xzf 3.7.0.tar.gz
cd ossec-hids-3.7.0
./install.sh
# 启动
/var/ossec/bin/ossec-control start
五、备份策略:最后一道防线
3-2-1备份原则:
- 3份数据副本
- 2种不同存储介质
- 1份异地备份
自动化备份脚本:
cat > /opt/backup.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup/$DATE"
REMOTE="user@backup-server:/backup/"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份网站文件
tar czf $BACKUP_DIR/www.tar.gz /var/www/html
# 备份数据库
mysqldump -u root -p'password' --all-databases > $BACKUP_DIR/all-databases.sql
gzip $BACKUP_DIR/all-databases.sql
# 备份配置文件
tar czf $BACKUP_DIR/config.tar.gz /etc/nginx /etc/php /etc/mysql
# 同步到远程
rsync -avz --delete $BACKUP_DIR $REMOTE
# 清理7天前的本地备份
find /backup -type d -mtime +7 -exec rm -rf {} \;
echo "备份完成:$DATE"
EOF
chmod +x /opt/backup.sh
echo "0 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1" | crontab
六、安全加固检查清单
网络层
- SSH端口已修改,禁用root登录,仅密钥认证
- 防火墙已配置,仅开放必要端口
- Fail2ban已安装并运行
- 无公网暴露的管理面板
系统层
- 系统已更新到最新补丁
- 仅运行必要服务
- SELinux/AppArmor已启用
- 自动安全更新已配置
应用层
- Web服务器安全头已配置
- 数据库已删除默认用户,使用专用账号
- PHP危险函数已禁用
- 文件上传已限制类型和大小
监控层
- AIDE文件完整性检查已配置
- 关键日志已监控并告警
- OSSEC或其他HIDS已安装
- 备份策略已验证,可恢复测试通过
七、常见问题
Q:安全加固后网站变慢了?
A:检查防火墙规则是否过于严格,安全头是否影响缓存,必要时调整配置。
Q:密钥登录不方便,能不能保留密码?
A:强烈建议只用密钥。如果必须用密码,设置强密码(16位以上,含大小写+数字+符号)+ Fail2ban。
Q:被攻击了怎么办?
A:立即隔离服务器(断网或改防火墙),保留日志,分析攻击路径,重装系统后恢复备份。
总结
服务器安全不是一次性工作,而是持续的过程。今天加固完,明天可能有新漏洞。建议每月跑一次检查清单,关注安全公告,及时更新。记住:没有绝对安全的服务器,只有相对安全的防护。备份是你的最后一道防线,务必做好。
