SSH 安全加固:改端口、禁用 root、强制密钥登录

三步收紧 SSH:换非标准端口、关掉 root 直登、只允许密钥登录,把爆破挡在门外。

SSH 是你登录服务器的正门。默认配置(22 端口 + 允许 root + 允许密码)每天都会被自动化脚本扫描爆破。本文用三步把它加固,命令以 Ubuntu/Debian 为主,并标注 CentOS/Rocky 的差异。

动手前:先备一条后路

所有改动都在 /etc/ssh/sshdconfig。改完千万不要立刻关掉当前会话——另开一个新终端验证能登录成功后再退出,一旦配置写错还能用旧会话救回来。建议先备份:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

第一步:确保密钥能登录

这是最关键的一步。先确认密钥可用,再关密码,否则容易把自己锁在门外。

在你的本地电脑生成密钥(已有可跳过),并上传到服务器:

ssh-keygen -t ed25519 -C "你的备注"
ssh-copy-id -p 22 user@your-server-ip

然后新开一个终端用密钥实测登录一次:

ssh -p 22 user@your-server-ip

能免密码进去,才可以继续下一步。

第二步:修改 sshdconfig

用编辑器打开配置,逐项设置:

sudo nano /etc/ssh/sshd_config
Port 2222                       # 换成一个 1024-65535 的非标准端口
PermitRootLogin no              # 禁止 root 直接登录
PubkeyAuthentication yes        # 开启密钥登录
PasswordAuthentication no       # 关闭密码登录(确认密钥可用后再关)
AllowUsers deploy admin         # 白名单:只允许这些用户登录

AllowUsers 按需填写你的普通账号,用空格分隔多个用户。改端口不是万能的,但能显著减少无脑爆破的噪音。

第三步:放行端口与重启

改了端口后,必须让防火墙和 SELinux 都放行,否则重启后连不上。

防火墙(Ubuntu/Debian 用 ufw):

sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp    # 确认新端口能登后再删旧规则

CentOS/Rocky 用 firewalld:

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

SELinux(CentOS/Rocky 默认开启,Ubuntu/Debian 一般无需):

sudo semanage port -a -t ssh_port_t -p tcp 2222

若提示 semanage 未安装,先装 policycoreutils-python-utils。

重启 SSH 服务:

sudo systemctl restart ssh

注意:CentOS/Rocky 上服务名是 sshd:

sudo systemctl restart sshd

重启前建议先校验语法:sudo sshd -t,无输出即正常。

收尾验证

保持当前会话不动,新开终端用新端口和密钥登录:

ssh -p 2222 user@your-server-ip

登录成功、且用密码登录被拒绝,说明加固生效。这时再安心关掉旧会话。若云控制台有安全组/防火墙,记得同步放行新端口。

小结

SSH 加固的核心顺序是:先让密钥能登,再关密码,最后改端口配防火墙。三项配置——PermitRootLogin no、PasswordAuthentication no、AllowUsers——就能挡掉绝大多数自动化攻击。全程牢记别关当前会话、每一步都新开终端验证,就不会有把自己锁外面的风险。