把网站部署到VPS上之后,很多人会有一种“终于搞定了”的放松感,然后就把服务器扔在那里不管了。直到某天收到CPU跑满的告警邮件,登录一看发现多了几个不认识的进程,或者网站被挂了一堆垃圾页面,才意识到安全这件事不是“有空再说”的。这篇文章整理了一份基础的VPS安全设置清单,按照这个顺序做完,至少能把80%的自动扫描和脚本攻击挡在门外。
SSH安全加固:守住服务器的第一道门
SSH是几乎所有VPS的默认管理入口,也是被暴力破解最频繁的服务。如果你去看一下VPS的SSH日志,多半会发现每天都有成千上万条来自世界各地的失败登录尝试——全是机器人程序在自动扫描。
修改默认端口
把SSH端口从22改成其他端口,这是最基础也最有效的防御手段。大量扫描器只扫22端口,改掉之后能过滤掉绝大部分自动攻击。
# 编辑SSH配置文件
sudo vim /etc/ssh/sshd_config
# 找到并修改Port行
Port 2222 # 改成你喜欢的端口,建议选五位数高位端口,避开已知服务
# 重启SSH服务
sudo systemctl restart sshd
重要提醒:改端口之前先测试好新端口是否能正常连接,千万别关掉当前SSH会话,否则万一端口没开,你就把自己锁在门外了。
禁用root直接登录
root是每个Linux系统都存在的账号,攻击者不需要猜用户名,只需要破解密码就行。禁用root登录,用普通用户登录后再通过sudo提权,能显著提高安全性。
# 在sshd_config中修改
PermitRootLogin no
# 之后用普通用户登录,需要用root权限时执行:
sudo -i
使用SSH密钥登录并关闭密码验证
密码暴力破解是SSH被攻破的主要途径。密钥登录使用非对称加密,私钥不在服务器上,几乎不可能被暴力破解。
生成密钥对的步骤:
# 在本地电脑上执行(不要在服务器上执行)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 一路回车,会生成 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)
把公钥传到服务器上:
# 用ssh-copy-id自动复制,注意指定修改后的端口
ssh-copy-id -p 2222 username@your_server_ip
# 或者手动添加
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
确认密钥能正常登录后,关闭密码验证:
# 在sshd_config中修改
PasswordAuthentication no
PubkeyAuthentication yes
# 重启SSH
sudo systemctl restart sshd
安装Fail2ban防御暴力破解
Fail2ban能自动监控日志中的失败登录尝试,对异常IP进行临时封禁。
sudo apt-get install fail2ban -y # Debian/Ubuntu
sudo yum install fail2ban -y # CentOS/RHEL
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# 查看被封禁的IP列表
sudo fail2ban-client status sshd
防火墙配置:控制进出流量
防火墙是VPS安全的基础防线,规则设置得当可以防止未授权的端口暴露在公网上。Cloudflare的报告显示,配置不当的端口和服务是导致数据泄露的主要原因之一,所以这一步建议花点心思认真处理。
UFW基本配置(适用于Ubuntu/Debian)
# 安装UFW
sudo apt-get install ufw -y
# 默认策略:拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 允许SSH新端口(一定要先开这个,否则下一次就连不上了)
sudo ufw allow 2222/tcp
# 允许HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 如果使用FTP
sudo ufw allow 21/tcp
# 启用防火墙
sudo ufw enable
# 查看状态
sudo ufw status numbered
Firewalld基本配置(适用于CentOS/RHEL)
# 启动firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
# 开放需要的端口
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 重新加载配置
sudo firewall-cmd --reload
# 查看已开放的端口和服务
sudo firewall-cmd --list-all
端口开放原则
防火墙配置的核心原则是最小暴露:只开放业务必需的端口,其他端口一律关闭。Web服务器通常只需要开放22/2222(SSH)、80(HTTP)、443(HTTPS)这几个端口。数据库端口(如3306、5432)建议只监听内网或通过白名单IP访问,不要直接暴露在公网上。
定期备份:最后一道防线
前面所有的安全措施都有可能被突破,只有备份是“出了事还能翻盘”的保障。一个完整的备份方案至少要做到:定期执行、异地存储、可验证恢复。
数据库备份
数据库通常比文件更重要,MySQL的备份脚本示例:
#!/bin/bash
# 数据库备份脚本
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_USER="your_db_user"
DB_PASS="your_db_password"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份所有数据库
mysqldump -u$DB_USER -p$DB_PASS --all-databases > $BACKUP_DIR/all_db_$DATE.sql
# 压缩
gzip $BACKUP_DIR/all_db_$DATE.sql
# 删除7天前的备份
find $BACKUP_DIR -type f -mtime +7 -delete
PostgreSQL备份命令:
pg_dumpall -U postgres | gzip > /backup/pg_all_$(date +%Y%m%d).sql.gz
网站文件备份
#!/bin/bash
# 网站文件备份脚本
BACKUP_DIR="/backup/www"
DATE=$(date +%Y%m%d)
WWW_DIR="/var/www"
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/www_$DATE.tar.gz $WWW_DIR
# 同步到远程存储(以AWS S3为例)
aws s3 sync $BACKUP_DIR s3://your-bucket-name/backups/
备份是否有效的唯一检验标准是“能不能恢复”。建议每个季度至少做一次完整的恢复演练,确保备份文件可用、恢复流程清晰。有经验的老手也都踩过备份文件损坏或权限不足导致恢复失败的坑,定期验证能避免同样的问题。