安全防护
禁止 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-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