postgresql 使用IAM用户连接到Cloud SQL

rsl1atfo  于 2023-05-28  发布在  PostgreSQL
关注(0)|答案(3)|浏览(126)

我无法测试在Google Cloud的PostgreSQL产品中使用IAM用户的能力。
以下是我的思考过程:
1.我已经在Google Cloud上的PostgreSQL示例上设置了相应的标志:

$ gcloud sql instances describe [MY_DB_INSTANCE] --format json | jq '.settings.databaseFlags'
[
  {
    "name": "cloudsql.iam_authentication",
    "value": "on"
  }
]
$

1.我有一个IAM用户,我已经在数据库示例中创建了该用户:

gcloud sql users create [MY_EMAIL] --instance=[MY_DB_INSTANCE] --type=CLOUD_IAM_USER
$ gcloud sql users list --instance [MY_DB_INSTANCE] | grep CLOUD_IAM_USER
[MY_EMAIL]                                      CLOUD_IAM_USER
$
  • 当我尝试使用下面的任一命令连接到数据库时,出现身份验证错误。在这两种情况下,我都使用gcloud auth print-access-token的输出作为密码:
  • 此方法将我的IP添加到allowlist:
$ gcloud sql connect [MY_DB_INSTANCE] --database=[DB_NAME] --user=[MY_EMAIL]
Allowlisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [MY_EMAIL]. Password:
psql: error: FATAL:  Cloud SQL IAM user authentication failed for user "[MY_EMAIL]"
FATAL:  pg_hba.conf rejects connection for host "100.200.300.400", user "[MY_EMAIL]", database "[MY_EMAIL]", SSL off
$

可能与失败有关,也可能与失败无关,但这里的错误消息令人困惑。最后一行是...database "[MY_EMAIL]",显然我没有试图连接到与我的电子邮件同名的数据库;我正在连接到一个具有非常特定名称的数据库,例如。[DB_NAME]。

更新,目前在“Known issues”页面中列出了对此的确认:

以下仅适用于默认用户('postgres'):gcloud sql connect --user

  • 此方法使用云SQL代理:
$ gcloud beta sql connect [MY_DB_INSTANCE] --database=[DB_NAME] --user=[MY_EMAIL]
Starting Cloud SQL Proxy: [/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/cloud_sql_proxy -instances my-project-id:europe-west1:[MY_DB_INSTANCE]=tcp:9470 -credential_file /Users/eugene/.config/gcloud/legacy_credentials/[MY_EMAIL]/adc.json]]
2021/01/26 16:35:03 Rlimits for file descriptors set to {&{8500 9223372036854775807}}
2021/01/26 16:35:03 using credential file for authentication; path="/Users/eugene/.config/gcloud/legacy_credentials/[MY_EMAIL]/adc.json"
2021/01/26 16:35:04 Listening on 127.0.0.1:9470 for my-project-id:europe-west1:[MY_DB_INSTANCE]
2021/01/26 16:35:04 Ready for new connections
Connecting to database with SQL user [MY_EMAIL].Password:
psql: error: FATAL:  Cloud SQL IAM user authentication failed for user "[MY_EMAIL]"
$
  • 如果我从云控制台检查访问日志,对于两次登录尝试,我都会看到相同的错误消息:
2021-01-26 14:20:11.988 UTC [594848]: [2-1] db=[DB_NAME],user=[MY_EMAIL] DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.

在这一点上,我完全迷失了。
也许我的期望与连接到DB的工作方式不一致。我期望:
1.将不需要输入密码(例如,gcloud auth print-access-token的值),因为gcloud会自动为我生成并使用密码,
1.如果需要手动输入密码(通过复制粘贴来自paste-buffer的gcloud auth print-access-token命令的输出),它将工作(当它不工作时)。
我希望通过依赖IAM auth机制对DB进行身份验证,能够避免创建用户并使用psql(或类似地使用gcloud sql users create ... --type=BUILD_IN)为他设置密码的必要性。
我到底错过了什么?

Upd,如果不使用gcloud sql命令,而是运行代理,直接使用命令,就可以成功连接:

$ cloud_sql_proxy -instances my-project-id:europe-west1:[MY_DB_INSTANCE]=tcp:9470
2021/01/26 17:29:56 Rlimits for file descriptors set to {&{8500 9223372036854775807}}
2021/01/26 17:29:56 Listening on 127.0.0.1:9470 for my-project-id:europe-west1:[MY_DB_INSTANCE]
2021/01/26 17:29:56 Ready for new connections
$ env PGPASSWORD=(gcloud auth print-access-token) psql --host 127.0.0.1 --port 9470 --username=[MY_EMAIL] --dbname=[MY_DB]
psql (13.1, server 13.0)
Type "help" for help.

[MY_DB]=>
jtw3ybtb

jtw3ybtb1#

我也有同样的问题。没有很好记录的关键信息是,Cloud SQL Proxy工具将在后台自动为您请求新令牌。因此,您不需要手动传递令牌,只需将您想要使用的任何客户端指向Cloud SQL代理服务。
要激活此模式,您需要指定-enable_iam_login命令行选项,如下所示:

./cloud_sql_proxy -instances=[project]:[zone]:[server]=tcp:5432 -enable_iam_login

它将为当前使用gcloud auth login验证的任何用户生成访问密钥

连接云SQL Proxy服务时,请务必关闭sslmode。它处理自己的加密,所以如果postgres客户端也试图加密,连接将超时。由于Cloud SQL Proxy服务正在处理身份验证,因此您只需在postgres客户端中指定user

psql "host=127.0.0.1 dbname=postgres user=[the IAM email account] sslmode=disable"

它不应该要求密码。如果有,就把它留空。
我发现Cloud SQL Proxy自述文件比官方文档更有用:https://github.com/GoogleCloudPlatform/cloudsql-proxy/blob/main/README.md

ee7vknir

ee7vknir2#

在玩了一下之后,我能够“拿起”正确的连接命令。这就是:

env PGPASSWORD=(gcloud auth print-access-token) gcloud beta sql connect [MY_DB_INSTANCE] --user=[MY_EMAIL] --database=[MY_DB]

这里的关键似乎是为进程指定PGPASSWORD变量,然后,当提示输入密码时,只需按enter即可🤯
我还尝试了通过非测试版gcloud sql connect连接,这似乎是gcloud sql中的一个bug:

$ env PGPASSWORD=(gcloud auth print-access-token) gcloud sql connect [MY_DB_INSTANCE] --user=[MY_EMAIL] --database=[MY_DB]
Allowlisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [MY_EMAIL].Password:
psql: error: FATAL:  database "[MY_EMAIL]" does not exist
$

请注意,它是如何表示为database "[MY_EMAIL]" does not exist的,而数据库被指定为命令行标志--database=[MY_DB]。对我来说就像个虫子。

qxsslcnc

qxsslcnc3#

对于自动(无密码)身份验证,我添加了一个检查表:

  • 使用以下格式创建数据库上的用户:username@your-project-name.iam
  • 授予此用户roles/cloudsql.instanceUser权限
  • 授权此用户roles/cloudsql.client
  • 也使用特殊用户名登录:username@your-project-name.iam
  • 使用./cloud-sql-proxy --auto-iam-authn运行云SQL代理

(我创建了一个没有@xyz.iam的用户,但它一直失败)

相关问题