VPS安全加固教程2026:SSH安全与防暴力破解

前言

VPS服务器的安全问题是每个站长都必须重视的话题。根据安全研究机构的统计数据,每天都有数十万台服务器遭受暴力破解攻击。一旦服务器被攻破,不仅网站数据会泄露,还可能被用来发起DDoS攻击或传播恶意软件。

2026年的网络安全形势更加严峻,攻击手段层出不穷。传统的用户名+密码认证方式已经无法满足安全需求。我们需要采取多层次的安全加固措施,从SSH认证、防火墙、到入侵检测,全面提升服务器的安全性。

本文将详细介绍在VPS上进行安全加固的完整流程,包括SSH密钥认证、防暴力破解配置、Fail2Ban部署、以及其他实用的安全措施。这些措施组合使用,可以有效阻挡99%以上的网络攻击。

一、SSH安全认证配置

1.1 SSH密钥认证设置

相比密码认证,SSH密钥认证更加安全。公钥私钥机制使得暴力破解几乎不可能。

生成SSH密钥对(在本地执行):

# 生成RSA密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 或者生成Ed25519密钥(推荐,更安全且性能更好)
ssh-keygen -t ed25519 -C "your_email@example.com"

将公钥上传到服务器:

# 方法1:使用ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your_vps_ip

# 方法2:手动上传
# 复制公钥内容,添加到服务器的 ~/.ssh/authorized_keys 文件

在服务器上创建authorized_keys文件:

# 登录服务器
ssh user@your_vps_ip

# 创建.ssh目录
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# 创建authorized_keys文件
nano ~/.ssh/authorized_keys
# 粘贴公钥内容,保存退出

# 设置正确权限
chmod 600 ~/.ssh/authorized_keys

1.2 禁用密码认证

密钥认证配置完成后,禁用密码认证:

# 编辑SSH配置文件
sudo nano /etc/ssh/sshd_config

修改以下配置项:

# 禁用密码认证
PasswordAuthentication no

# 禁用空密码
PermitEmptyPasswords no

# 禁用root登录(建议)
PermitRootLogin no

# 只允许特定用户登录(可选)
AllowUsers your_username

# 修改默认SSH端口(可选,增加安全性)
Port 2222

重启SSH服务:

# Ubuntu/Debian
sudo systemctl restart sshd

# CentOS/RHEL
sudo systemctl restart sshd

1.3 使用SSH Agent转发

如果需要跳板访问内网服务器:

# 在本地启动SSH Agent
eval "$(ssh-agent -s)"

# 添加私钥
ssh-add ~/.ssh/id_ed25519

# SSH Agent转发连接
ssh -A user@jump_server

二、防暴力破解配置

2.1 配置登录次数限制

通过PAM模块限制登录尝试次数:

# 编辑SSH配置
sudo nano /etc/security/limits.conf

添加以下内容:

# 限制登录尝试
* hard maxlogin 3

或者使用sshd内置的登录限制:

# 编辑SSH配置
sudo nano /etc/ssh/sshd_config

添加:

# 5分钟内最多3次尝试
MaxAuthTries 3

# 登录间隔
LoginGraceTime 60

2.2 Fail2Ban安装与配置

Fail2Ban是防止暴力破解的重要工具,可以自动封禁可疑IP地址。

安装Fail2Ban:

# Ubuntu/Debian
sudo apt update
sudo apt install fail2ban -y

# CentOS/RHEL
sudo yum install epel-release -y
sudo yum install fail2ban -y

配置Fail2Ban:

# 创建配置文件
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

修改以下配置:

[DEFAULT]
# 忽略的IP列表(自己的IP一定要添加)
ignoreip = 127.0.0.1 你的IP地址/32

# 封禁时间(秒)
bantime = 3600

# 时间窗口(秒)
findtime = 600

# 最大尝试次数
maxretry = 5

# SSH防暴力破解配置
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5

启动Fail2Ban:

# 启动服务
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# 查看状态
sudo fail2ban-client status

# 查看被封禁的IP
sudo fail2ban-client banned

2.3 自定义SSH防暴力破解规则

创建自定义过滤规则:

sudo nano /etc/fail2ban/filter.d/sshd-enhanced.conf

添加:

[Definition]
failregex = ^%(__prefix_line)s(?:error: PAM:)?authentication failure for .* from <HOST>$ 
            ^%(__prefix_line)sFailed (?:password|publickey) for .* from <HOST>(?: port \d+)?(?: ssh\d+)?$
            ^%(__prefix_line)smax authentication attempts exceeded for .* from <HOST>$

ignoreregex =

三、防火墙配置

3.1 UFW防火墙(Ubuntu)

# 安装UFW
sudo apt install ufw -y

# 添加规则
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# 启用防火墙(注意:一定要先开放SSH端口!)
sudo ufw enable

# 查看状态
sudo ufw status verbose

# 删除规则
sudo ufw delete allow 22/tcp

3.2.firewalld配置(CentOS)

# 启动firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld

# 添加规则
sudo firewall-cmd --permanent --add-port=22/tcp --zone=public
sudo firewall-cmd --permanent --add-port=80/tcp --zone=public
sudo firewall-cmd --permanent --add-port=443/tcp --zone=public

# 重新加载配置
sudo firewall-cmd --reload

# 查看状态
sudo firewall-cmd --list-all

# 移除规则
sudo firewall-cmd --permanent --remove-port=22/tcp --zone=public

3.3 iptables基础配置

如果需要更细粒度的控制:

# 清空现有规则
sudo iptables -F
sudo iptables -X

# 默认策略:拒绝所有入站
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许SSH(指定你的IP更安全)
sudo iptables -A INPUT -p tcp --dport 22 -s 你的IP地址 -j ACCEPT

# 允许HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 保存规则
sudo iptables-save > /etc/iptables/rules.v4

四、账户安全加固

4.1 密码策略

安装密码复杂度插件:

# Ubuntu/Debian
sudo apt install libpam-pwquality -y

# CentOS/RHEL(默认已安装)

配置密码复杂度:

sudo nano /etc/security/pwquality.conf

修改配置:

# 最小密码长度
minlen = 12

# 至少包含一个大写字母
ucredit = -1

# 至少包含一个小写字母
lcredit = -1

# 至少包含一个数字
dcredit = -1

# 至少包含一个特殊字符
ocredit = -1

设置密码过期策略:

# 编辑密码策略
sudo nano /etc/login.defs

修改:

# 密码最大有效期(天)
PASS_MAX_DAYS 90

# 密码最小有效期(天)
PASS_MIN_DAYS 7

# 密码过期警告(天)
PASS_WARN_AGE 14

4.2 禁用不必要的账户

# 查看所有用户
cat /etc/passwd

# 锁定账户(不影响已登录用户)
sudo passwd -l username

# 解锁账户
sudo passwd -u username

4.3 sudo权限管理

# 编辑sudo配置
sudo visudo

# 限制特定用户使用sudo
username ALL=(ALL:ALL) ALL

# 不需要密码(生产环境不推荐)
username ALL=(ALL) NOPASSWD: ALL

五、系统安全加固

5.1 内核参数优化

加固系统内核:

sudo nano /etc/sysctl.conf

添加:

# 禁止IP转发(如果不是路由器)
net.ipv4.ip_forward = 0

# 禁止ICMP重定向
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

# 禁止源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# 启用SYN Cookie防止SYN flood攻击
net.ipv4.tcp_syncookies = 1

# 禁止ping请求
net.ipv4.icmp_echo_ignore_all = 1

# 启用RPCbind服务安全
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0

应用配置:

sudo sysctl -p

5.2 文件权限加固

# 检查关键文件权限
ls -la /etc/passwd
ls -la /etc/shadow
ls -la /etc/group

# 确保安全
chmod 644 /etc/passwd
chmod 000 /etc/shadow
chmod 644 /etc/group

5.3 禁用不必要的服务

# 查看运行中的服务
systemctl list-units --type=service --state=running

# 禁用不需要的服务
sudo systemctl disableService-name

# 常见需要禁用的服务
sudo systemctl disable telnet.socket
sudo-systemctl disable cups.service

六、日志监控与告警

6.1 关键日志文件

常用日志位置:

日志 路径 说明
SSH登录 /var/log/auth.log 登录尝试记录
系统日志 /var/log/syslog 系统事件
认证日志 /var/log/secure 认证相关信息
Nginx /var/log/nginx/access.log 网站访问

查看登录失败记录:

# 查看失败的SSH登录尝试
grep "Failed password" /var/log/auth.log

# 查看最近的登录记录
last
lastlog

# 查看当前登录用户
who

6.2 日志告警脚本

创建登录异常告警脚本:

#!/bin/bash
# login_alert.sh

LOG_FILE="/var/log/auth.log"
ALERT_EMAIL="admin@example.com"

# 检查过去1小时内的失败登录
FAILED_COUNT=$(grep "Failed password" $LOG_FILE | grep "$(date -d '1 hour ago' +'%b %d %H')" | wc -l)

if [ $FAILED_COUNT -gt 10 ]; then
    echo "检测到过去1小时内有 $FAILED_COUNT 次失败登录尝试!" | \
    mail -s "[警告] 服务器登录异常" $ALERT_EMAIL
fi

添加到crontab:

crontab -e

# 每小时检查
0 * * * * /usr/local/bin/login_alert.sh >> /var/log/alert.log 2>&1

注意事项

  1. 开启双重认证:考虑使用Google Authenticator或YubiKey
  2. 定期备份配置:将安全配置文件备份到安全的位置
  3. 测试后再部署:在测试环境验证后再应用到生产服务器
  4. 记录操作日志:所有配置变更都要有记录,便于审计
  5. 保持更新:及时更新系统和软件包,修补安全漏洞

总结

通过本文的学习,您应该已经掌握:
1. SSH密钥认证的配置与使用方法
2. 密码认证的安全替代方案
3. Fail2Ban的安装与配置
4. 防火墙的基本配置
5. 系统账户安全管理
6. 日志监控与异常告警

关键要点回顾:
- 优先使用SSH密钥认证,禁用密码登录
- 部署Fail2Ban自动封禁攻击者IP
- 配置防火墙只开放必要的端口
- 启用密码��杂��要求
- 定期检查登录日志,发现异常及时处理

服务器安全是一个持续的过程。建议将本文与《VPS监控资源使用教程2026》结合,实现全面的服务器安全监控体系。

相关文章推荐

如果您对VPS安全和系统管理感兴趣,以下文章可能对您有帮助:
- VPS监控资源使用教程2026:Zabbix/Prometheus监控搭建 - 实时监控服务器安全状态
- VPS配置防火墙规则教程2026:iptables与firewalld详解 - 深入学习防火墙配置
- VPS定时任务设置教程2026:crontab配置与自动化任务 - 实现安全任务自动化
- VPS搭建网站教程2026:LNMP环境搭建与配置 - 在安全环境中部署网站
- VPS安装Docker教程2026:容器化部署完整指南 - Docker容器安全配置

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。