想象一下这样的场景:凌晨三点,你的手机突然收到服务器被暴力破解的告警。攻击者通过穷举密码成功入侵,而这一切本可以通过一个简单的安全措施避免——禁用密码登录,强制使用SSH密钥认证。在云计算时代,密码就像用纸糊的锁,而SSH密钥则是银行金库级别的防护。
在谷歌云Compute Engine环境中,SSH密钥认证不仅仅是推荐做法,而是现代云安全架构的基本要求。传统密码认证存在几个致命缺陷:
相比之下,SSH密钥认证采用非对称加密体系:
bash复制# 典型SSH密钥对生成过程
ssh-keygen -t ed25519 -C "gc-user-2024" -f ~/.ssh/gcp-prod-key
这个命令会生成两个文件:
gcp-prod-key(私钥,相当于你的数字身份证)gcp-prod-key.pub(公钥,需要上传到服务器)密钥认证的安全优势体现在:
| 安全维度 | 密码认证 | SSH密钥认证 |
|---|---|---|
| 抗暴力破解 | 弱 | 极强 |
| 传输加密 | 可选 | 强制 |
| 多因素支持 | 困难 | 原生支持 |
| 密钥轮换难度 | 高 | 低 |
大多数教程会教你使用默认的RSA算法,但在2024年,我们有更优选择:
bash复制# 更安全的ED25519算法(推荐)
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/gcp-ed25519
# 或者使用更长的RSA密钥(兼容旧系统)
ssh-keygen -t rsa -b 4096 -o -a 100 -f ~/.ssh/gcp-rsa
关键参数说明:
-a 100:增加密钥派生迭代次数,提升抗暴力破解能力-o:使用新的OpenSSH密钥存储格式-C:添加注释,建议包含用途和日期信息重要提示:生成密钥后立即设置600权限:
chmod 600 ~/.ssh/gcp-* && chmod 644 ~/.ssh/gcp-*.pub
谷歌云提供了两种密钥部署方式:
实例级部署(传统方式)
bash复制gcloud compute instances add-metadata INSTANCE_NAME \
--metadata ssh-keys="$(cat ~/.ssh/gcp-ed25519.pub)"
项目级部署(推荐生产环境使用)
bash复制gcloud compute project-info add-metadata \
--metadata ssh-keys="$(cat ~/.ssh/gcp-ed25519.pub)"
项目级策略的优势:
仅仅添加密钥还不够,必须关闭密码认证这个危险入口。以下是完整的加固流程:
bash复制sudo vim /etc/ssh/sshd_config
确保包含以下关键配置:
code复制PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
PermitRootLogin prohibit-password
AllowUsers your_username
ClientAliveInterval 300
ClientAliveCountMax 2
bash复制# 检查配置语法
sudo sshd -t
# 重启服务
sudo systemctl restart sshd
# 在另一个终端保持连接测试!
# 新开终端验证密钥登录
ssh -i ~/.ssh/gcp-ed25519 username@IP
致命陷阱:务必在重启sshd前确保密钥登录可用,否则可能被锁在服务器外!
结合谷歌云防火墙规则,限制SSH访问源IP:
bash复制gcloud compute firewall-rules create allow-ssh-from-office \
--direction=INGRESS \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=YOUR_OFFICE_IP/32 \
--target-tags=ssh
安装google-cloud-sdk后,使用更安全的SSH代理:
bash复制# 使用云代理连接(无需暴露22端口)
gcloud compute ssh INSTANCE_NAME \
--ssh-key-file=~/.ssh/gcp-ed25519 \
--tunnel-through-iap
启用SSH登录审计日志:
bash复制# 安装审计工具
sudo apt-get install auditd
# 配置SSH审计规则
sudo tee -a /etc/audit/rules.d/ssh.rules <<EOF
-a always,exit -F arch=b64 -S execve -F path=/usr/sbin/sshd -F key=ssh_cmd
-w /etc/ssh/sshd_config -p wa -k sshd_config
EOF
# 重启审计服务
sudo service auditd restart
建议每90天轮换一次密钥:
bash复制# 生成新密钥
ssh-keygen -t ed25519 -f ~/.ssh/gcp-ed25519-$(date +%Y%m%d)
# 部署新密钥
gcloud compute instances add-metadata INSTANCE_NAME \
--metadata ssh-keys="$(cat ~/.ssh/gcp-ed25519-$(date +%Y%m%d).pub)"
# 测试确认后删除旧密钥
gcloud compute instances remove-metadata INSTANCE_NAME \
--keys ssh-keys
为防止密钥丢失导致无法访问,应设置:
bash复制# 紧急启用密码访问(限时操作)
sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# 使用后立即禁用!
在过去的运维经历中,我曾遇到开发团队因未禁用密码认证导致服务器被植入挖矿程序的情况。那次事件后,我们建立了严格的密钥管理制度——所有生产环境实例在创建时自动应用项目级SSH密钥策略,并通过组织策略强制禁用密码登录。这套机制运行三年来,成功阻断了所有暴力破解尝试。