跳到主要内容

安全防护

禁止 root 远程登录(强烈建议)

创建好普通账户并测试能正常 sudo 之后,可以禁用 root 远程登录 SSH ,提高安全性:

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

# 找到并确保以下行存在且设置为 no
PermitRootLogin no

# 重启 SSH 服务使配置生效
systemctl restart sshd

遵循原则

步骤1:创建普通用户
步骤2:设置密码
步骤3:赋予 sudo 权限
步骤4:测试该用户能正常 SSH 登录 + 能正常使用 sudo
步骤5:【确认无误后】才禁止 root 远程登录

具体操作:

# === 步骤1-3:在 root 会话中执行 ===
adduser alice
passwd alice
usermod -aG sudo alice

# === 步骤4:另开一个 SSH 窗口测试(千万别关当前的 root 会话!)===
# 在新窗口中:
ssh alice@服务器IP
# 登录成功后:
sudo whoami
# 应该输出 root

# === 只有测试通过后,才执行步骤5 ===
vim /etc/ssh/sshd_config
# 设置 PermitRootLogin no

sudo systemctl restart sshd
# 此时原 root SSH 会话还在!万一出问题可以回滚

:::tip 关键技巧

永远保持当前的 root SSH 会话开着,直到测试完毕

:::

补救措施

通过云服务商的控制台(最常见)

如果你用的是云服务器(阿里云、腾讯云、AWS、DigitalOcean 等):

  • 登录云服务商的管理控制台
  • 找到这台服务器 → VNC 控制台​ 或 救援模式
  • 通过 VNC 直接进入服务器的本地终端(绕过 SSH)
  • 以 root 身份登录
  • 创建普通用户并赋予 sudo 权限
  • 或者直接改回 PermitRootLogin yes,然后 systemctl restart sshd

单用户模式(适用于有控制台权限的情况)

  • 重启服务器
  • GRUB 菜单时按 e编辑启动项
  • 在 linux行末尾加上 init=/bin/bash
  • 启动后以 root shell 直接进入(无需密码)
  • 重新挂载文件系统为可写:mount -o remount,rw /
  • 创建用户或修改 SSH 配置

改用密钥登录,禁止密码登录

使用 ssh 登录

# 在本地电脑生成密钥对
ssh-keygen -t ed25519 -C "alice@server"

# 把公钥传到服务器
ssh-copy-id alice@服务器IP
ssh-copy-id -i ~/.ssh/[自定义密钥名称].pub alice@服务器IP

# 验证密钥登录是否正常
ssh alice@服务器IP
# 应该不需要输入密码就直接登录了

# 确认没问题后,禁用密码登录
sudo vim /etc/ssh/sshd_config

# 设置:
PasswordAuthentication no

# 重启
sudo systemctl restart sshd

修改 SSH 端口

sudo vim /etc/ssh/sshd_config
# 找到 Port 22,改成其他端口(如 2222)
Port 2222

sudo systemctl restart sshd

配置防火墙,只允许特定 IP 访问 SSH

# 只允许你的办公网络/家庭网络访问 SSH
sudo ufw allow from 你的公网IP to any port 22
# 或者只允许特定端口范围
sudo ufw allow 2222/tcp

自动封禁恶意 IP

# 1. 卸载 fail2ban(保留配置选 no,或者干脆删掉)
sudo yum remove fail2ban -y
sudo yum remove fail2ban* -y

# 2. 手动清理残留配置(确保干净)
sudo rm -rf /etc/fail2ban

sudo yum install epel-release -y
sudo yum install fail2ban -y

# 创建本地配置
sudo vim /etc/fail2ban/jail.local
### 以下为配置
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 3600
findtime = 600
maxretry = 3
backend = auto

[sshd]
enabled = true
filter = sshd
port = ssh # 如果更改了 port ,这里需要更改
logpath = /var/log/secure
maxretry = 3
####

# 编辑配置,确保 SSH 防护开启
sudo vim /etc/fail2ban/jail.local

# 找到 [sshd] 部分,确保:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600

# 启动
sudo systemctl start fail2ban
# 设置开机器自启
sudo systemctl enable fail2ban
# 重启 fail2ban
sudo systemctl restart fail2ban

# 查看状态
sudo systemctl status fail2ban

# 查看启用了什么防护监狱
sudo fail2ban-client status

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

# 手动解封某个被误封的 IP
sudo fail2ban-client set sshd unbanip [需要解封的IP地址]

## 查看配置的正则表达式能否抓取日志中的攻击记录
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

验证状态

# 看看还有没有新的失败尝试
sudo tail -f /var/log/auth.log | grep "Failed password"

# 查看 fail2ban 是否在工作
sudo fail2ban-client status

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