文档关于 Cloud SQL 代理包含一行,“由于代理始终从除代理之外无法访问的主机名进行连接,因此您可以创建一个只能由代理使用的用户帐户。这样做的好处是,您可以在不输入密码的情况下指定此帐户,而不会损害您的实例或数据的安全性。”
是否有任何实用的方法可以通过 Google Cloud Proxy 连接 MySQL 客户端,该代理使用仅允许访问特定 MySQL 用户的服务帐户进行身份验证?
使用 Cloud SQL Proxy 时限制访问的一种潜在方法是使用 Cloud SQL 代理 IP 地址创建 MySQL 用户帐号: '[USER_NAME]'@'cloudsqlproxy~[IP_ADDRESS]'
。但是,这对于在多个云虚拟机上运行的服务帐户不起作用。这基本上是通过 IP 地址而不是服务帐户对 MySQL 用户进行身份验证。
将服务帐户限制为 MySQL 用户的第二种方法可能是使用 MySQL 用户帐户'[USER_NAME]'@'cloudsqlproxy~%'
并依靠 IAM 来限制访问。运行 Cloud SQL 客户端的服务帐户需要角色roles/cloudsql.client
,相当于cloudsql.instances.connect
和cloudsql.instances.get
权限。不幸的是,如果你授予多个服务帐户这个角色,那么看起来似乎没有办法限制他们使用彼此的 MySQL 用户。
实现无密码身份验证的第三种潜在方式可能是使用客户端证书(gcloud sql ssl-certs create [CERT_NAME] client-key.pem --instance [INSTANCE_NAME]
)。但是客户端私钥比密码更难管理,因为当你刷新服务器证书时,不到一年的时间,它们就会同时失效:“当你刷新服务器证书时,你还必须生成新的客户端证书;现有的客户端证书将被撤销。”这使得它们基本上不可能在生产中使用。
基本上,Cloud SQL Proxy 似乎不支持通过 IAM 服务帐户对特定 MySQL 用户进行身份验证。这是正确的吗?
答案1
讽刺的是,所谓的“Auth 代理”至今尚未提供数据库用户身份验证。Google Cloud SQL 终于增加了对无密码 IAM 登录的支持,其中cloud-sql-proxy
(或者golang,Java 语言, 或者Python连接器)对 IAM 用户或服务账户进行身份验证,然后连接到MySQL 前端的 Auth 代理服务器使用临时客户端证书。
对于 Postgres,Cloud SQL 添加了手动 IAM 身份验证2020 年(Cloud SQL 发行说明:2020-10-12),他们还补充道自动 IAM 身份验证并在 2021 年支持 cloud-sql-proxy-enable_iam_login
(cloud-sql-proxy 更新日志:1.20.0 2021-02-24,Cloud SQL 发行说明:2021-04-06,一般可在2021-08-30),但该标志在 2.0.0 中已被替换--auto-iam-authn
。
对于 MySQL,添加了 Cloud SQL手动 IAM 身份验证2021 年(Cloud SQL 发行说明:2021-07-08)。自动 IAM 身份验证尚未记录,但它已在golang cloud.google.com/go/cloudsqlconn 1.1.0和云-sql-proxy 2.0.0-预览版.4 (2022-12-12)和--auto-iam-authn
。
Google Cloud SQL MySQL 上的无密码 IAM 身份验证需要:
roles/cloudsql.instanceUser
角色,或等效于cloudsql.instances.get
权限cloudsql.instances.login
(MySQL IAM 角色)--cloudsql_iam_authentication=on
在 MySQL 服务器上(实例配置)type
创建并设置 IAM 身份验证的用户:gloud sql users create --type=cloud_iam_user --instance=MY_INSTANCE USERNAME@DOMAIN
,或gloud sql users create --type=cloud_iam_service_account --instance=MY_INSTANCE [email protected]
手动或自动 IAM 身份验证
- 手动 IAM 身份验证:要求用户名是电子邮件地址的本地部分,密码设置为 的结果
gcloud sql generate-login-token
,--enable-cleartext-plugin
并且需要使用gcloud sql ssl client-certs create
(使用手动 IAM 数据库身份验证登录) - 自动 IAM 身份验证:需要生成临时客户端证书生成EphemeralCert将 access_token 设置为 的结果
gcloud auth print-access-token
,并且需要使用 Cloud SQL Proxy 协议(端口 3307)进行连接(它确实不是作为端口 3306 上的客户端证书工作)。这一切都由 cloud-sql-proxy 或其中一个语言连接器自动完成。然后,您连接到 cloud-sql-proxy,将用户名设置为电子邮件地址的本地部分,密码将被忽略。示例:
# Download v2.0.0-preview.4 or higher wget https://storage.googleapis.com/cloud-sql-connectors/cloud-sql-proxy/v2.0.0-preview.4/cloud-sql-proxy.linux.amd64 chmod +x cloud-sql-proxy.linux.amd64 sudo mv cloud-sql-proxy.linux.amd64 /usr/local/bin/cloud-sql-proxy cloud-sql-proxy --port=3306 --auto-iam-authn $(gcloud sql instances describe MY_INSTANCE --format='value(connectionName)') & mysql --user=MY_USERNAME --password= --protocol=tcp --host=127.0.0.1 --port=3306 --ssl-mode=disabled
- 手动 IAM 身份验证:要求用户名是电子邮件地址的本地部分,密码设置为 的结果