SSH 加固与密钥登录
High Contrast
Dark Mode
Light Mode
Sepia
Forest
3 min read534 words

SSH 加固与密钥登录

SSH 是你最重要的入口。入口不安全,后面所有监控、备份、部署都没有意义。

最小 SSH 安全路线

graph LR A[生成密钥对] --> B[上传公钥到服务器] B --> C[验证密钥登录成功] C --> D[修改 sshd_config 禁用密码] D --> E[重启 sshd 验证配置] E --> F[设置防火墙限制来源 IP]

顺序非常重要:必须先验证密钥登录成功,才能禁用密码登录。否则会把自己锁在外面。


生成和部署密钥

# 在本机生成 ED25519 密钥(比 RSA 更短更安全)
ssh-keygen -t ed25519 -C "your-email@example.com"
# 生成:~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)
# 将公钥上传到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@your-server-ip
# 验证密钥登录
ssh -i ~/.ssh/id_ed25519 ubuntu@your-server-ip
# 服务器上查看已授权的公钥
cat ~/.ssh/authorized_keys

/etc/ssh/sshd_config 加固配置

在修改之前,先备份原配置:

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

修改以下关键配置(Ubuntu 默认配置中多数需要取消注释并修改值):

# 禁止 root 直接登录(最重要)
PermitRootLogin no
# 禁用密码登录(确认密钥登录成功后才改!)
PasswordAuthentication no
ChallengeResponseAuthentication no
# 启用公钥认证
PubkeyAuthentication yes
# 限制最大认证尝试次数
MaxAuthTries 3
# 禁用空密码
PermitEmptyPasswords no
# 关闭 X11 转发(服务器不需要图形界面)
X11Forwarding no
# 可选:修改默认端口(减少扫描噪音,但非银弹)
# Port 2222
# 可选:限制只允许特定用户登录
# AllowUsers ubuntu deploy

应用配置(不要直接 reload,先测试语法):

# 测试配置语法
sudo sshd -t
# 语法正确后重启(保持当前 session 不断)
sudo systemctl reload sshd
# 另开一个终端验证新连接能否正常登录(验证成功再关闭旧终端)
ssh ubuntu@your-server-ip

密码 vs 密钥安全对比

方面 密码登录 SSH 密钥登录
暴力破解 可被穷举(常见密码字典攻击) 密钥无法穷举(256 位熵)
泄漏风险 同一密码可能复用于多处 私钥单独存储,泄漏可即时撤销
多人协作 多人共用密码,无法区分操作者 每人独立密钥,操作可归因
自动化脚本 明文密码嵌入脚本风险高 私钥文件权限 600,安全可控

多人协作密钥管理

# 每位运维人员在 ~/.ssh/authorized_keys 中添加各自公钥(每行一个)
# 示例:
ssh-ed25519 AAAAC3Nza... alice@macbook  # 工程师 Alice
ssh-ed25519 AAAAC3Nzb... bob@laptop    # 工程师 Bob
# 撤销某人的访问权限:删除对应行,无需修改其他人的密钥

常见误区

误区 正确做法
还没测试密钥登录就改 PasswordAuthentication no 必须先验证密钥登录成功,再禁用密码
把私钥传给他人或放入 Git 私钥只能存本机,永远不要传输;需要授权则共享公钥
多人共用同一个 SSH 用户和密钥 每位运维者有独立公钥,便于撤销和审计
修改端口就觉得安全了 修改端口只能减少扫描日志,不能防止真正的攻击者

本节执行清单

下一节最小权限与 Secrets 基础——入口安全之后,开始做权限隔离。