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 用户和密钥 | 每位运维者有独立公钥,便于撤销和审计 |
| 修改端口就觉得安全了 | 修改端口只能减少扫描日志,不能防止真正的攻击者 |
本节执行清单
- [ ] 生成 ED25519 密钥对并上传公钥
- [ ] 验证密钥登录成功(新终端验证)
- [ ] 修改
sshd_config:禁用PasswordAuthentication和PermitRootLogin - [ ] 用
sudo sshd -t验证配置语法,再systemctl reload sshd - [ ] 为每位运维人员配置独立密钥行
下一节:最小权限与 Secrets 基础——入口安全之后,开始做权限隔离。