SSH(Secure Shell)是 Linux 运维人员每天都要打交道的工具。无论你管理的是一台 VPS,还是成百上千台云主机,几乎所有远程操作都建立在 SSH 这条安全通道之上。可以说,SSH 用得好不好,直接决定了你的运维效率和主机安全性。本文将以 Ubuntu 为对象,系统讲解 SSH 的工作原理、密钥认证的配置方法,以及一套经过实战检验的安全加固策略,帮助你把远程管理做到既高效又稳妥。

一、SSH 核心概念
SSH 采用「客户端 – 服务端」架构。客户端通过 ssh 命令发起连接,服务端由 sshd 守护进程监听并响应。默认情况下,SSH 服务监听 TCP 22 端口,使用非对称加密完成密钥交换与身份认证,随后用对称加密保护整个会话的数据流。
在 Ubuntu 上,服务端由 OpenSSH 提供,通过 openssh-server 包安装。客户端 openssh-client 一般默认已存在。理解 SSH 最关键的三个概念是:
- 身份认证:确认「你是谁」,常见方式有密码认证和密钥认证。
- 主机验证:确认「你连的是不是那台机器」,依靠 known_hosts 中的主机指纹。
- 会话加密:认证完成后,所有数据都走加密隧道,防止窃听与篡改。
二、SSH 密钥认证原理
密码认证简单直接,但存在暴力破解、弱口令、被钓鱼的风险。密钥认证则用一对非对称密钥代替密码:私钥留在本地,公钥放到服务器。认证时,服务器用公钥加密一段随机数据,只有持有对应私钥的客户端才能解密并正确回应,从而完成身份验证。
密钥认证的优势在于:
- 私钥不经过网络传输,理论上无法被中间人窃取。
- 可以配合口令短语(passphrase)实现「双因素」效果。
- 便于自动化运维,脚本无需硬编码密码。
三、实战步骤
3.1 安装并启动 SSH 服务
在 Ubuntu 上,安装并启用 SSH 服务只需两条命令:
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable --now ssh
验证服务状态:
sudo systemctl status ssh
3.2 生成密钥对
在本地客户端(macOS、Linux 或 Windows 的 PowerShell 均可)生成密钥对。推荐使用 ed25519 算法,性能好、安全性高:
ssh-keygen -t ed25519 -C "ops@stellardata.top"
生成过程中会询问保存路径与口令短语,直接回车使用默认路径 ~/.ssh/id_ed25519,建议设置一个 passphrase。生成后会在 .ssh 目录得到两个文件:
id_ed25519:私钥,务必妥善保管,切勿外泄。id_ed25519.pub:公钥,需要上传到服务器。
3.3 上传公钥到服务器
使用 ssh-copy-id 命令一键上传公钥:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
如果没有 ssh-copy-id,也可以手动追加:
cat ~/.ssh/id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
上传后测试免密登录:
ssh user@server_ip
如果无需输入密码即可登录,说明密钥认证配置成功。
3.4 配置客户端别名
在 ~/.ssh/config 中为服务器设置别名,可以省去每次输入冗长参数的麻烦:
Host prod-web
HostName 192.168.1.10
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
之后只需执行 ssh prod-web 即可登录。
四、安全加固
4.1 修改 SSH 配置
编辑 /etc/ssh/sshd_config,逐项调整以下参数。建议先备份原文件:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo vim /etc/ssh/sshd_config
关键配置如下:
# 禁用 root 直接登录
PermitRootLogin no
# 关闭密码认证,仅允许密钥
PasswordAuthentication no
# 关闭空密码
PermitEmptyPasswords no
# 修改默认端口(可选)
Port 2222
# 限制登录用户
AllowUsers ubuntu deploy
# 设置登录超时
LoginGraceTime 30
修改后重启服务使其生效:
sudo systemctl restart ssh
重要提示:在关闭密码认证、修改端口之前,务必先确认密钥登录已经测试通过,否则可能把自己锁在门外。
4.2 配置 fail2ban 防暴力破解
对于仍需保留密码认证的服务器,强烈建议搭配 fail2ban 自动封禁暴力破解来源 IP:
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl enable --now fail2ban
在 /etc/fail2ban/jail.local 中启用 sshd 规则:
[sshd]
enabled = true
port = ssh
maxretry = 5
bantime = 3600
查看封禁情况:
sudo fail2ban-client status sshd
4.3 使用 SSH Agent 管理私钥
当有多台服务器、多把私钥时,ssh-agent 可以统一管理,避免反复输入 passphrase:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
配合客户端配置,即可实现「一次解锁,处处可用」。
五、常见问题
Q1:提示 Permission denied (publickey) 怎么办?
通常是公钥未正确放置,或文件权限过宽。检查服务端 .ssh 目录和 authorized_keys 文件的权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Q2:修改配置后无法登录,被锁在门外了?
如果云主机有 VNC 或 Web 控制台,可以登录进去回滚配置;否则只能通过服务商的控制台重置。这也是强调「先测通密钥再关闭密码」的原因。
Q3:Host key verification failed 是什么原因?
说明服务器的指纹与本地 known_hosts 记录不一致,可能是重装系统或 IP 被复用。确认无误后手动删除旧记录:
ssh-keygen -R server_ip
六、总结
SSH 是 Ubuntu 运维的基石,而密钥认证 + 安全加固则是在此基石上搭建的第一道防线。本文从原理出发,带你完成了密钥生成、公钥上传、客户端配置,再到禁用密码登录、修改端口、fail2ban 防护的完整闭环。掌握这些技能后,你的服务器远程管理将更加安全、高效。记住一条铁律:任何安全配置变更,都要先在测试环境验证,再应用到生产环境。
下期预告:第 14 天,我们将进入「定时任务与自动化」专题,一起掌握 cron、systemd timer 与脚本化运维的精髓,让你的 Ubuntu 运维工作实现「无人值守」。















暂无评论内容