如何使用cloudsql_proxy模拟服务账号且不修改全局gcloud配置
我此前发现可以通过如下命令设置全局模拟配置来实现Cloud SQL代理的身份模拟需求:gcloud config set auth/impersonate_service_account <MY_SERVICE_ACCOUNT>
cloudsql_proxy可执行文件可以读取gcloud的全局配置,但这种全局配置的方式非常不灵活。我希望在启动代理时就直接指定要模拟的特定用户,无需修改全局配置,同时也不想生成永久有效的JSON密钥,要使用模拟身份的方式实现认证。
目前很多gcloud命令都支持对应参数实现单次身份模拟,但cloudsql_proxy可执行文件暂不支持该类参数。
我之前尝试思考另一种实现方案:运行gcloud auth print-access-token --impersonate-service-account=<MY_SERVICE_ACCOUNT>,然后将返回的令牌设置为cloudsql_proxy可读取的环境变量或者启动参数,是否可以实现需求?
我查找过cloudsql_proxy的代码,里面关于gcloud认证的说明如下:
当本地设备安装了gcloud命令行工具时,会使用「活跃账户」进行身份认证。运行
gcloud auth list可查看本地设备安装的所有账户,运行gcloud config list account可查看当前活跃账户。
但这里存在不合理的地方:当配置了auth/impersonate_service_account时,gcloud config list account不会返回任何相关的模拟账户信息。另外我也想知道有没有办法让Gcloud实现按会话级别的身份模拟?
验证可行的解决方案
经实测,cloudsql_proxy的--token参数完全可以满足需求,现在可以同时启用IAM认证和GSA身份模拟来运行代理,示例如下:
# 启动代理,通过已配置Cloud SQL权限的GSA进行IAM身份登录 ./cloud_sql_proxy \ -enable_iam_login \ -dir=/var/run/cloudsql \ -instances=项目ID:区域:实例名 \ --token=$(gcloud auth print-access-token --impersonate-service-account='my-gsa@myco.iam.gserviceaccount.com') # 启动后即可通过代理以Cloud SQL联邦用户的身份完成认证 psql "sslmode=disable \ host='/var/run/cloudsql/项目ID:区域:实例名' \ user=my-gsa@myco.iam dbname=mydb"
内容的提问来源于stack exchange,提问作者red888

