You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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登录被禁用等

内容的提问来源于stack exchange,提问作者guilhem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:36:01