在 Linux 服务器运维中,SSH(Secure Shell)几乎是我们每天都要打交道的工具。无论是登录服务器排查故障、远程执行命令,还是通过隧道传输文件、搭建跳板机,SSH 都是最基础也最关键的通道。正因为它连接着运维人员与生产环境,SSH 的安全配置就显得尤为重要:一旦口令被暴力破解或密钥泄露,攻击者就能长驱直入。
本篇文章围绕 Ubuntu 上的 SSH 远程管理展开,重点讲解密钥认证的原理与配置,以及安全加固的完整思路。我们会从安装 OpenSSH 开始,一步步完成密钥对生成、公钥部署、禁用密码登录、修改默认端口、限制登录来源等操作,最终交付一台既方便管理又坚固可靠的远程服务器。

核心概念:SSH 与密钥认证的工作原理
SSH 是一种加密的网络协议,默认监听 22 端口,用于在不安全的网络上提供安全的远程登录和其他网络服务。Ubuntu 上最常见的实现是 OpenSSH,它由客户端 ssh 和服务端 sshd 组成。
密码认证 vs 密钥认证是理解 SSH 安全的关键。密码认证依赖「你知道什么」,而密钥认证依赖「你拥有什么」——即一对非对称密钥:
- 私钥(private key):保存在你的本地电脑上,严格保密,永远不要上传到服务器。
- 公钥(public key):部署在服务器上,可以公开,用于验证持有私钥的人。
登录时,服务器用公钥加密一段随机信息,只有持有对应私钥的客户端才能解密并完成身份验证。由于私钥通常还受到口令(passphrase)保护,即便私钥文件泄露,攻击者仍难以直接使用。相比容易被人肉或字典攻击的口令,密钥认证的安全性高出一个数量级。
关键文件与目录
在动手之前,先认识几个 SSH 相关的重要位置:
/etc/ssh/sshd_config # 服务端主配置文件
/etc/ssh/ssh_config # 客户端全局配置文件
~/.ssh/authorized_keys # 用户级公钥白名单(服务端)
~/.ssh/id_ed25519 # 用户私钥(客户端)
~/.ssh/known_hosts # 已知主机指纹缓存
实战步骤:从安装到加固
1. 安装并启动 OpenSSH 服务
Ubuntu Server 通常在安装时已包含 SSH,桌面版则可能需要手动安装。使用 APT 一键安装并确认服务状态:
sudo apt update
sudo apt install -y openssh-server
sudo systemctl enable --now ssh
sudo systemctl status ssh
安装完成后,用 ss 命令确认 22 端口正在监听:
sudo ss -tlnp | grep ':22'
2. 在本地生成密钥对
推荐使用更安全、性能更好的 Ed25519 算法(若需兼容老旧系统,可用 RSA 4096)。在本地电脑上执行:
ssh-keygen -t ed25519 -C "yourname@workstation"
按提示可设置 passphrase 保护私钥。生成后会在 ~/.ssh/ 下得到 id_ed25519(私钥)和 id_ed25519.pub(公钥)两个文件。
3. 部署公钥到服务器
使用 ssh-copy-id 是最简单的方式,它会自动把公钥追加到服务器对应用户的 authorized_keys:
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@server_ip
如果服务器禁用了密码登录、只能手动部署,则把公钥内容追加到目标文件即可:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
cat id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
注意 ~/.ssh 与 authorized_keys 的权限必须是 700 和 600,否则 SSH 会因权限过于宽松而拒绝读取。
4. 加固 sshd_config
登录成功后,编辑服务端配置文件进行安全加固。先备份原文件:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo vim /etc/ssh/sshd_config
推荐调整以下关键参数:
# 禁止 root 直接登录,改用普通用户 + sudo
PermitRootLogin no
# 只允许密钥认证,关闭密码登录
PasswordAuthentication no
# 关闭空密码与不安全的认证方式
PermitEmptyPasswords no
ChallengeResponseAuthentication no
# 限制登录用户范围(按需)
AllowUsers deployadmin
# 修改默认端口,减少扫描器噪声(可选)
Port 2222
修改后先做语法校验,再重启服务。切记保留当前会话窗口,另开一个终端验证新配置能正常登录,避免把自己锁在门外:
sudo sshd -t
sudo systemctl restart ssh
5. 配合防火墙与 fail2ban 双重防护
SSH 加固不能只靠配置文件。使用 UFW 限制来源 IP,再用 fail2ban 自动封禁暴力破解者:
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp
sudo ufw enable
sudo apt install -y fail2ban
sudo systemctl enable --now fail2ban
fail2ban 的 SSH 监狱默认规则即可生效,它会监控 /var/log/auth.log,对多次登录失败的主机自动封禁一段时间。
6. 测试密钥登录
在另一终端使用 -i 指定私钥,并用 -v 查看详细握手过程,确认走的是密钥认证:
ssh -i ~/.ssh/id_ed25519 -p 22 username@server_ip -v
如果使用密钥登录成功,则说明整个密钥认证链路已打通。
常见问题
Q1:提示 Permission denied (publickey) 怎么办?
A:按顺序排查:服务器 authorized_keys 中公钥内容是否完整、文件与目录权限是否正确(700/600)、本地私钥路径是否指定、服务端是否已关闭密码认证而公钥未生效。可用 ssh -v 查看关键日志定位。
Q2:修改端口后连不上服务器?
A:先确认 UFW 已放行新端口,再确认 Port 配置正确、sshd -t 校验通过。若已断开,只能通过控制台(VNC/云厂商终端)恢复。
Q3:私钥丢了或忘记 passphrase 怎么办?
A:无法找回。若服务器仍可登录(如其他管理通道),重新生成密钥对并更新 authorized_keys;否则只能通过云厂商的救援模式重置。
Q4:需要多人共用一个账号管理服务器吗?
A:不建议。应为每个运维人员建立独立账号,各自部署公钥,既便于审计,也避免私钥共享带来的风险。
总结
SSH 是 Ubuntu 运维的「生命线」,密钥认证 + 安全加固是守护这条生命线的标准姿势。本文从 OpenSSH 安装、Ed25519 密钥生成、公钥部署,到 sshd_config 加固、防火墙与 fail2ban 联动,完整走了一遍「可用 → 安全」的演进路径。
安全没有一劳永逸。养成良好习惯:不用 root 直接登录、不给私钥设空口令、定期审查 authorized_keys 与登录日志、及时更新 OpenSSH 版本,你的服务器就能长期保持稳固。
下期预告:第 13 天将进入《防火墙与网络安全——UFW、nftables 与 fail2ban 实战》,把今天埋下的防护伏笔彻底展开,从规则语法到实际排障,构建完整的网络防御体系,敬请期待。















暂无评论内容