13 10 月 2026

服务器一上线,24 小时内就会被全网的扫描器盯上。你可以看一下自己的日志:

grep "Failed password" /var/log/auth.log | wc -l

很多新机一天能有几百上千条失败登录尝试。只要密码稍微弱一点、或者开了 22 端口对全网开放,被撞库只是时间问题。

这篇讲清楚 SSH 密钥登录的完整配置流程,以及配套的账号加固动作。做完之后,密码爆破对你完全无效。

需要一台服务器来练手?财富云计算 提供云服务器与 NAT 型云服务器(无独立公网 IP,价格比独立 IP 机型省一半以上),后者可通过端口映射方式远程管理,适合做内网服务与游戏服务端。

一、为什么密码登录不安全

  1. 密码可以被暴力猜:扫描器每秒能试几十次,6 位纯数字密码几分钟就破。
  2. 密码可能已经泄露:你在别处用过的密码进了社工库,撞库成功率很高。
  3. 密码会被记录:键盘记录器、共用电脑、截屏,都可能泄露。
  4. 无法做到不可否认:多人共用 root 密码,出事查不到是谁干的。

密钥登录的原理:本地生成一对密钥(公钥 + 私钥),公钥放服务器,私钥留在自己电脑。登录时服务器用公钥出题,只有持有私钥的人能答对。私钥不上传、不传输,从根本上杜绝了"被猜中"。


二、第一步:本地生成密钥对

在你自己的电脑上执行(不是服务器):

ssh-keygen -t ed25519 -C "yourmail@example.com"

输出示例:

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\you/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
  • 一路回车即可,也可以给私钥设置一个使用密码(passphrase),这样即使私钥文件泄露,对方还得再破一层。
  • 生成后得到两个文件:

    • id_ed25519 —— 私钥,绝不能给任何人、不能上传服务器、不能发群里。
    • id_ed25519.pub —— 公钥,可以随便放。

如果你的系统比较老不支持 ed25519,用 RSA 4096:

ssh-keygen -t rsa -b 4096 -C "yourmail@example.com"
Windows 用户:PowerShell / Windows Terminal 里自带 OpenSSH,可直接用;或者用 Xshell「工具 → 新建用户密钥生成向导」、PuTTYgen 生成。

三、第二步:把公钥传到服务器

方法一:ssh-copy-id(最省事)

ssh-copy-id -i ~/.ssh/id_ed25519.pub root@1.2.3.4

按提示输一次密码就完成了。Windows 原生没有这个命令,用方法二。

方法二:手动追加(通用,推荐理解这一步)

先在本地看公钥内容:

cat ~/.ssh/id_ed25519.pub
# 输出形如:ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxx yourmail@example.com

登录服务器,把它追加进授权文件:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxx yourmail@example.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

权限必须对:.ssh 是 700,authorized_keys 是 600。权限太松 SSH 会直接拒绝使用密钥(这是很多人配完还是让输密码的原因)。

方法三:云控制台注入(重装系统时)

不少云厂商(含 财富云计算)在重装/创建实例时支持"注入 SSH 密钥",勾选后系统自动写好 authorized_keys,开机即密钥登录。


四、第三步:验证密钥登录可用(关键!)

别急着关密码登录。 先开一个新的终端窗口测试:

ssh -i ~/.ssh/id_ed25519 root@1.2.3.4

能直接进去、不用输服务器密码,说明配置成功。

如果还是提示输密码,按顺序排查:

# 服务器端查看 SSH 日志
tail -f /var/log/auth.log        # Debian/Ubuntu
tail -f /var/log/secure          # CentOS/Rocky
# 常见报错:Authentication refused: bad ownership or modes
# → 家目录或 .ssh 权限不对,执行:
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
chmod g-w ~ && chmod o-w ~

同时确认 /etc/ssh/sshd_config 里这几项没被关掉:

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

五、第四步:关闭密码登录

确认密钥登录 100% 可用后,再改配置:

sudo nano /etc/ssh/sshd_config

找到并修改这几行(有的被 # 注释了,去掉注释再改):

Port 2299                      # 改成非 22 的端口,能挡掉大部分无脑扫描
PermitRootLogin prohibit-password   # 禁止 root 用密码登录(密钥仍可)
PasswordAuthentication no      # 关闭密码认证
PubkeyAuthentication yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM no                      # 部分系统需保留 yes,改完务必测试
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
⚠️ 改 Port 之后,务必先在防火墙/安全组里放行新端口再重启 SSH,否则会把自己关在门外。

重启服务:

# Debian/Ubuntu
sudo systemctl restart ssh
# CentOS/Rocky
sudo systemctl restart sshd

重启后不要关掉当前窗口,另开一个窗口测试新端口能连上,再断开旧连接。这是保命习惯。

ssh -p 2299 -i ~/.ssh/id_ed25519 root@1.2.3.4

六、第五步:建普通用户 + sudo,别再直接用 root

root 权限太大,一个误操作就全盘皆输。推荐做法:

# 新建用户
adduser ops
# 设置密码(虽然关闭密码登录,但 sudo 时还要用)
passwd ops
# 给 sudo 权限(Debian/Ubuntu)
usermod -aG sudo ops
# CentOS/Rocky 是 wheel 组
usermod -aG wheel ops

把公钥也部署给这个用户:

mkdir -p /home/ops/.ssh
cp ~/.ssh/authorized_keys /home/ops/.ssh/
chown -R ops:ops /home/ops/.ssh
chmod 700 /home/ops/.ssh
chmod 600 /home/ops/.ssh/authorized_keys

然后把 root 登录彻底关掉:

PermitRootLogin no

以后就用 ssh ops@1.2.3.4 登录,需要管理员权限时 sudo 命令。

详见本站《Linux 用户与 sudo 权限管理详解》。


七、第六步:上 fail2ban,自动封禁爆破 IP

即使关了密码登录,扫描器还是会浪费你的连接资源。fail2ban 能自动把连续失败的 IP 拉黑:

# Debian/Ubuntu
apt install fail2ban -y
# CentOS
yum install epel-release -y && yum install fail2ban -y

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.local

核心配置:

[sshd]
enabled  = true
port     = 2299          # 改成你的 SSH 实际端口
filter   = sshd
logpath  = /var/log/auth.log    # CentOS 是 /var/log/secure
maxretry = 3
findtime = 600
bantime  = 86400         # 封 24 小时
systemctl enable --now fail2ban
fail2ban-client status sshd     # 查看已封禁的 IP

完整玩法见本站《fail2ban 防暴力破解实战配置》。


八、第七步:防火墙只放行必要端口

最小化暴露面,是安全的第一原则:

# Ubuntu(ufw)
ufw allow 2299/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status

# CentOS(firewalld)
firewall-cmd --permanent --add-port=2299/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

注意云平台的安全组是第二道防火墙,两边都要放行才生效。详见本站《Linux 防火墙配置:ufw / firewalld / iptables》。


九、私钥丢了 / 换电脑怎么办

  • 有控制台:通过云平台的 VNC / 控制台终端登录(这是留的最后一条后路,也是为什么不建议把控制台也锁死),重新写入新公钥。
  • 有其他密钥用户:用另一个还能登录的用户把新公钥写进去。
  • 都没了:只能重装系统(所以重要数据一定要做快照/备份)。

私钥管理建议:

  1. 私钥文件权限设为 600,别放网盘、别发微信。
  2. 多台服务器可以用同一把公钥,省事。
  3. 公司/团队场景按人分配密钥,离职就删对应公钥行(在 authorized_keys 里一行一个)。
  4. 给私钥加 passphrase,配合 ssh-agent 免重复输入:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519

十、SSH 配置速查表(可直接抄)

场景配置
只许密钥登录PasswordAuthentication no、PubkeyAuthentication yes
禁 root 密码登录PermitRootLogin prohibit-password
彻底禁 root 登录PermitRootLogin no
改端口Port 2299(记得防火墙放行)
限制登录用户AllowUsers ops alice
限制登录 IPAllowUsers ops@1.2.3.4
缩短超时ClientAliveInterval 300、ClientAliveCountMax 2
防反复试探MaxAuthTries 3
闲置自动断开ClientAliveInterval 60、ClientAliveCountMax 3

改完每次都要:

sshd -t                    # 语法自检,报错就别重启
systemctl restart sshd

十一、常见故障排查

现象排查
配完还是让输密码authorized_keys 权限不是 600;家目录权限过松;PubkeyAuthentication 是 no
Permission denied (publickey)公钥内容粘贴不全(注意别换行);-i 指定的私钥不对
改端口后连不上防火墙/安全组没放行新端口;SELinux 拦截(CentOS 需 semanage port -a -t ssh_port_t -p tcp 2299)
REMOTE HOST IDENTIFICATION HAS CHANGED服务器重装过,删除本地 ~/.ssh/known_hosts 里对应行
关闭密码登录后被锁走云控制台 VNC,或重装

十二、一份最小化的安全清单

上线前花 10 分钟做完这些,能挡掉 95% 的自动化攻击:

  • [ ] 改用 SSH 密钥登录,关闭密码认证
  • [ ] 改掉默认 22 端口
  • [ ] 禁止 root 直接登录,用普通用户 + sudo
  • [ ] 装 fail2ban
  • [ ] 防火墙只开必要端口
  • [ ] apt update && apt upgrade 打齐补丁
  • [ ] 重要数据开启自动快照/备份
  • [ ] 云控制台密码独立且够强,开二次验证

做游戏开服的,还要额外注意别把 RCON 端口、Steam 查询端口直接暴露给全网,参考本站《游戏服务器安全加固指南》。


想低成本练手这套流程,推荐 财富云计算 的云服务器。只是做内网服务、游戏服务端、练手环境的话,NAT 型云服务器(无独立公网 IP)价格比带独立 IP 的机型省一半以上,配合端口映射即可远程管理,性价比非常高。

相关阅读:

  • 《Linux 防火墙配置:ufw / firewalld / iptables》
  • 《fail2ban 防暴力破解实战配置》
  • 《Linux 用户与 sudo 权限管理详解》
  • 《游戏服务器安全加固指南》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:Linux 常用命令速查表(新手必备 80 条):从连不上服务器到能独立运维
  2. 下一篇:Linux 文件权限与用户组详解:chmod / chown 到底该怎么设
发表评论 6