GitLab流水线中SSH连接无外网IP的GCP VM公钥拒绝报错排查
GCE SSH公钥拒绝故障额外排查项
1. 流水线身份与权限验证
- 确认GitLab流水线中gcloud使用的身份符合预期:在流水线中新增步骤执行
gcloud config get-value account,输出应为你授权过的服务账号 - 确认该服务账号已被授予
roles/compute.osAdminLogin或roles/compute.osLogin权限,若实例启用了OS Login,手动上传公钥到实例元数据的操作会失效,必须通过IAM权限关联密钥 - 若未启用OS Login,确认服务账号有权限修改实例/项目级别的元数据,用于自动上传公钥
2. SSH登录参数与配置验证
- 强制指定IAP隧道连接:执行ssh命令时添加
--tunnel-through-iap参数,避免部分场景下gcloud未自动识别无公网IP的实例、没有走IAP隧道 - 不要默认使用root用户登录:GCE实例默认禁用root用户SSH登录,如果你确实需要用root,先通过Cloud Shell登录实例,修改
/etc/ssh/sshd_config中PermitRootLogin配置为yes,再重启sshd服务 - 确认流水线变量有效性:在执行ssh命令前打印
$CLOUDSDK_COMPUTE_ZONE、$VM_NAME、$CLOUDSDK_CORE_PROJECT三个变量,确认取值和预期一致 - 规避镜像版本问题:将
google/cloud-sdk:latest替换为固定版本号的镜像(例如google/cloud-sdk:460.0.0-slim),避免最新版本引入的未知bug
3. 密钥匹配验证
gcloud compute ssh默认会在运行环境的~/.ssh/目录下生成google_compute_engine密钥对,GitLab流水线无持久化存储,每次运行都会生成新密钥对,你可以在流水线中打印公钥内容cat ~/.ssh/google_compute_engine.pub,再到实例中确认该公钥是否存在于对应用户的~/.ssh/authorized_keys文件中- 如果你指定了自定义密钥对,确认私钥在流水线中有权限读取,且文件权限为
600(sshd会拒绝权限过高的私钥认证请求)
4. 实例内部日志排查
- 通过Cloud Shell登录实例,查看ssh认证日志:
- Debian/Ubuntu系统执行
cat /var/log/auth.log - RHEL/CentOS/Fedora系统执行
cat /var/log/secure
日志中会明确标注公钥被拒绝的具体原因,例如用户不存在、密钥不匹配、root登录被禁用等
- Debian/Ubuntu系统执行
内容的提问来源于stack exchange,提问作者guilhem
相关产品推荐
相关产品推荐

