从Bitbucket Pipelines通过Google服务账号SSH登录Compute Engine实例遇权限问题
我之前帮团队排查过几乎一模一样的问题——本地能正常连,但Pipelines一直报权限拒绝,大概率是这几个点出了问题,你可以挨个排查:
私钥权限太宽松
SSH对私钥的权限要求特别严格,必须是600(只有所有者可读可写)。在Pipelines中,如果你是把私钥从变量导出到文件,一定要记得设置权限:echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa没做这一步的话,SSH会直接拒绝使用这个密钥,这是最常见的坑。
Bitbucket变量中私钥的格式问题
如果你把私钥存在Bitbucket的仓库/工作区变量里,要注意私钥是多行文本。粘贴时有没有完整保留所有内容?包括开头的-----BEGIN RSA PRIVATE KEY-----和结尾的-----END RSA PRIVATE KEY-----,中间的换行也不能丢。有些时候变量框会自动吃掉换行,导致密钥直接失效。GCE防火墙限制了Bitbucket的IP
GCE实例的防火墙默认可能只允许你本地IP访问22端口,但Bitbucket Pipelines的运行环境IP属于特定的动态IP段。你需要在GCE防火墙规则里,把Bitbucket Pipelines的IP范围加入到允许SSH访问的规则中。元数据公钥的用户名不匹配
你在GCE实例元数据里添加的公钥格式应该是ssh-rsa [公钥内容] [用户名],这里的用户名要和你在Pipelines中SSH登录用的用户名完全一致(比如默认的ubuntu或者自定义用户)。如果用户名不匹配,GCE会直接拒绝登录请求。SSH首次连接的主机密钥验证
在Pipelines中第一次连接GCE实例时,SSH会因为主机密钥未知而拒绝连接。测试环境可以临时跳过验证:ssh -o StrictHostKeyChecking=no ubuntu@[你的实例IP]生产环境建议提前把主机密钥加到
known_hosts文件里,避免安全风险。GCE实例的SSH daemon配置
检查实例上的/etc/ssh/sshd_config文件,看看有没有AllowUsers/DenyUsers这类限制规则,是不是把你登录用的用户排除了?另外要确保PubkeyAuthentication yes是开启状态。
建议先从私钥权限开始排查,这是最容易犯也最容易解决的问题。
内容的提问来源于stack exchange,提问作者Mike

