我无法测试在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]=>
3条答案
按热度按时间jtw3ybtb1#
我也有同样的问题。没有很好记录的关键信息是,Cloud SQL Proxy工具将在后台自动为您请求新令牌。因此,您不需要手动传递令牌,只需将您想要使用的任何客户端指向Cloud SQL代理服务。
要激活此模式,您需要指定
-enable_iam_login
命令行选项,如下所示:它将为当前使用
gcloud auth login
验证的任何用户生成访问密钥连接云SQL Proxy服务时,请务必关闭
sslmode
。它处理自己的加密,所以如果postgres客户端也试图加密,连接将超时。由于Cloud SQL Proxy服务正在处理身份验证,因此您只需在postgres客户端中指定user
。它不应该要求密码。如果有,就把它留空。
我发现Cloud SQL Proxy自述文件比官方文档更有用:https://github.com/GoogleCloudPlatform/cloudsql-proxy/blob/main/README.md
ee7vknir2#
在玩了一下之后,我能够“拿起”正确的连接命令。这就是:
这里的关键似乎是为进程指定
PGPASSWORD
变量,然后,当提示输入密码时,只需按enter即可🤯我还尝试了通过非测试版
gcloud sql connect
连接,这似乎是gcloud sql
中的一个bug:请注意,它是如何表示为
database "[MY_EMAIL]" does not exist
的,而数据库被指定为命令行标志--database=[MY_DB]
。对我来说就像个虫子。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的用户,但它一直失败)