前置准备
本次实操使用CentOS 7.9服务器,其他主流Linux发行版(Ubuntu 20.04+/Debian 11+)仅需替换部分命令即可。
- 服务器登录信息:IP地址、SSH默认端口(通常22)、root账号密码
- 本地SSH工具:Windows推荐用PowerShell(无需额外安装)或Xshell免费版,Mac/Linux直接用终端
第一步:修改SSH默认端口与禁用root远程登录
90%以上的服务器入侵来自SSH暴力破解默认端口与root账号,这一步是最核心的基础防护。
1.1 修改SSH默认端口
远程连接到服务器后,执行以下命令:
- 备份SSH配置文件(修改前必做,出问题可直接恢复):
```bash
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
```
- 打开配置文件编辑:
```bash
vi /etc/ssh/sshd_config
```
- 按i键进入编辑模式,找到Port 22这一行,删除号,将22修改为10000-65535之间未被占用的端口(比如32456)
- 找到PermitRootLogin yes这一行,删除号,将yes修改为no
- 按Esc键退出编辑模式,输入:wq按回车保存退出
1.2 配置防火墙放行新端口
- CentOS 7.9默认用firewalld,Ubuntu/Debian默认用ufw,分别执行:
CentOS 7.9:
```bash
firewall-cmd --permanent --add-port=32456/tcp
firewall-cmd --reload
```
- Ubuntu/Debian:
```bash
ufw allow 32456/tcp
ufw reload
```
1.3 创建普通管理员账号并重启SSH
- 创建名为admin的普通账号,设置密码(密码要求:至少12位,包含大小写字母、数字、特殊符号):
```bash
useradd admin
passwd admin
```
- 给admin账号添加sudo权限:
CentOS 7.9:
```bash
echo "admin ALL=(ALL) ALL" >> /etc/sudoers.d/admin
chmod 0440 /etc/sudoers.d/admin
```
- Ubuntu/Debian:
```bash
usermod -aG sudo admin
```
- 重启SSH服务:
CentOS 7.9:
```bash
systemctl restart sshd
```
- Ubuntu/Debian:
```bash
systemctl restart ssh
```
1.4 验证新配置

不要断开当前root连接!新开一个本地终端窗口,用admin账号、新端口尝试连接:
```bash
ssh admin@你的服务器IP -p 32456
```
连接成功后,执行sudo su - 切换到root测试权限,确认无误后再关闭旧的root连接。
第二步:配置防火墙仅放行必要端口
默认仅放行SSH新端口,后续如果部署Web/数据库等服务,再单独开放对应端口。
2.1 CentOS 7.9配置
- 查看当前防火墙状态:
```bash
firewall-cmd --state
```
如果显示not running,先启动并设置开机自启:
```bash
systemctl start firewalld
systemctl enable firewalld
```
- 关闭默认开放的所有其他端口(先执行第二步的32456放行,避免连不上):
```bash
firewall-cmd --list-all --permanent
```
查看permanent配置下多余的端口,比如public区域默认的ssh、dhcpv6-client,执行删除:
```bash
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --permanent --remove-service=dhcpv6-client
firewall-cmd --reload
```
2.2 Ubuntu/Debian配置
- 查看当前防火墙状态:
```bash
ufw status
```
如果显示inactive,先启动并设置开机自启:
```bash
ufw enable
```
- 设置默认策略:拒绝所有入站,允许所有出站:
```bash
ufw default deny incoming
ufw default allow outgoing
```
第三步:安装Fail2Ban防止SSH暴力破解
Fail2Ban会监控SSH登录日志,当同一IP连续登录失败超过设定次数,自动封禁该IP一段时间。
3.1 安装Fail2Ban
- CentOS 7.9需要先安装EPEL源:
```bash
yum install -y epel-release
yum install -y fail2ban fail2ban-systemd
```
- Ubuntu/Debian直接安装:
```bash
apt update && apt install -y fail2ban
```
3.2 配置Fail2Ban
- 复制默认配置文件为正式配置(避免官方更新覆盖):
```bash
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
```
- 打开正式配置文件编辑:
```bash
vi /etc/fail2ban/jail.local
```
- 按i键进入编辑模式,找到[sshd]这一段,修改或添加以下内容(注意替换32456为你的新SSH端口):
```
[sshd]
enabled = true
port = 32456
logpath = %(sshd_log)s
maxretry = 5
findtime = 600
bantime = 86400
```
- 各参数说明:
- maxretry:连续失败次数,设为5
- findtime:统计失败次数的时间窗口,单位秒,设为600(10分钟)
- bantime:封禁时长,单位秒,设为86400(24小时)
- 按Esc键退出编辑模式,输入:wq按回车保存退出
3.3 启动Fail2Ban并设置开机自启
```bash
systemctl start fail2ban
systemctl enable fail2ban
```
3.4 验证Fail2Ban运行状态
```bash
fail2ban-client status
fail2ban-client status sshd
```
如果看到Status for the jail: sshd下有Filter、Actions项,说明配置成功。
第四步:定期自动更新系统安全补丁
4.1 CentOS 7.9配置yum-cron
- 安装yum-cron:
```bash
yum install -y yum-cron
```
- 打开配置文件编辑:
```bash
vi /etc/yum/yum-cron.conf
```
- 按i键进入编辑模式,修改以下两项:
```
update_cmd = security
apply_updates = yes
```
- 按Esc键退出编辑模式,输入:wq按回车保存退出
- 启动yum-cron并设置开机自启:
```bash
systemctl start yum-cron
systemctl enable yum-cron
```
4.2 Ubuntu/Debian配置unattended-upgrades
- 安装unattended-upgrades:
```bash
apt install -y unattended-upgrades apt-listchanges
```
- 打开自动升级配置文件编辑:
```bash
vi /etc/apt/apt.conf.d/50unattended-upgrades
```
- 按i键进入编辑模式,找到"${distro_id}:${distro_codename}-security";这一行,确保前面没有号,其他升级源(比如-updates、-backports)可以加号注释掉
- 按Esc键退出编辑模式,输入:wq按回车保存退出
- 打开自动升级周期配置文件编辑:
```bash
vi /etc/apt/apt.conf.d/20auto-upgrades
```
- 按i键进入编辑模式,确保内容为:
```
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
```
- 按Esc键退出编辑模式,输入:wq按回车保存退出
第五步:禁止root使用密码登录(可选但推荐,需提前配置SSH密钥)
如果担心密码泄露,这一步可以彻底杜绝SSH密码暴力破解。
5.1 本地生成SSH密钥对
- Windows PowerShell/Mac/Linux终端执行:
```bash
ssh-keygen -t ed25519 -C "你的备注信息(比如admin@服务器名)"
```
- 一路按回车,生成的密钥对默认保存在:
- Windows:C:\Users\你的用户名\.ssh\id_ed25519(私钥,绝对不要泄露)和id_ed25519.pub(公钥)
- Mac/Linux:~/.ssh/id_ed25519和id_ed25519.pub
5.2 将公钥上传到服务器
用admin账号执行:
```bash
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "你的本地公钥内容(打开id_ed25519.pub复制完整内容)" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
```
5.3 服务器禁用SSH密码登录
- 打开SSH配置文件编辑:
```bash
sudo vi /etc/ssh/sshd_config
```
- 按i键进入编辑模式,找到PasswordAuthentication yes这一行,删除号,将yes修改为no
- 按Esc键退出编辑模式,输入:wq按回车保存退出
- 重启SSH服务(同第一步1.3)
- 新开一个终端窗口验证密钥登录,确认无误后再关闭旧的SSH连接