通过堡垒机和IAP连接Google Cloud SQL时IAM认证失败
问题背景与故障排查
环境
- Google Cloud Platform (GCP)
- 仅配置私有IP的Cloud SQL PostgreSQL实例
- 仅配置私有IP的堡垒机(Bastion host)
- 用于堡垒机访问的Identity-Aware Proxy (IAP)
- SQL客户端DBeaver
问题描述
我需要从本地机器连接仅私有IP的Cloud SQL PostgreSQL实例,因此通过堡垒机中转访问。堡垒机上用systemd运行Cloud SQL Proxy的命令如下:
/usr/local/bin/cloud-sql-proxy --auto-iam-authn --private-ip --address 0.0.0.0 --port 3307 [connection-string]
本地通过IAP建立TCP转发:
gcloud compute start-iap-tunnel [bastion-name] 3307 --local-host-port=localhost:5432 --zone=[zone]
用DBeaver连接时配置:
- 主机:localhost
- 端口:5432
- 数据库:db_name
- 用户名:myname@company.com
- 密码:空
收到错误:
FATAL: Cloud SQL IAM user authentication failed for user "myname@company.com"
此前本地直接运行Cloud SQL Proxy时该配置完全正常,部署到堡垒机后就出现认证失败。
已尝试操作
确认自身账号拥有必要IAM权限且已添加至Cloud SQL实例,本地直连Proxy时无问题。
原因分析与解决方案
核心原因
当Cloud SQL Proxy部署在堡垒机上时,--auto-iam-authn模式会使用堡垒机实例所在的服务账号完成IAM认证,而非你本地机器的用户账号。这和本地直接运行Proxy时使用你本地gcloud身份的逻辑完全不同,因此导致你的IAM用户认证失败。
正确配置方案
方案1:让Proxy传递本地用户身份(推荐)
修改堡垒机上的Cloud SQL Proxy启动命令,去掉--auto-iam-authn,让Proxy仅做中转,由本地客户端传递IAM认证信息:
/usr/local/bin/cloud-sql-proxy --private-ip --address 0.0.0.0 --port 3307 [connection-string]
然后调整DBeaver的连接配置:
- 打开PostgreSQL连接设置的「认证」标签页
- 选择「Cloud SQL IAM认证」方式
- 配置本地gcloud SDK路径,或直接使用已登录的gcloud身份
- 用户名填写你的IAM邮箱
myname@company.com,密码留空
方案2:给堡垒机服务账号添加IAM数据库权限
如果必须在堡垒机上保留--auto-iam-authn,需要做以下配置:
- 找到堡垒机实例使用的服务账号(默认格式为
[project-number]-compute@developer.gserviceaccount.com) - 在Cloud SQL实例的IAM设置中,给该服务账号添加Cloud SQL Client角色
- 登录PostgreSQL实例,创建对应IAM用户:
CREATE USER "堡垒机服务账号邮箱" WITH LOGIN; GRANT cloudsqliamuser TO "堡垒机服务账号邮箱";
- 本地连接时,用户名填写堡垒机的服务账号邮箱,密码留空
验证步骤
- 重启堡垒机上的Cloud SQL Proxy服务:
sudo systemctl restart cloud-sql-proxy.service
- 重新建立IAP隧道连接
- 用修改后的配置尝试DBeaver连接
内容的提问来源于stack exchange,提问作者Артём Викторович
相关产品推荐
相关产品推荐

