为何通过Cloud SQL Auth Proxy连接PostgreSQL无需postgres用户密码?
Cloud SQL Auth Proxy连接PostgreSQL无需输入密码的原因及密码缓存排查
一、Auth Proxy免密码的核心原因
Cloud SQL Auth Proxy的认证逻辑和直接连接完全不同:
- 直接连接Cloud SQL实例时,你是通过公网IP和PostgreSQL原生的账号密码体系认证,必须输入数据库用户的密码才能通过实例的身份校验。
- 而Auth Proxy是通过Google Cloud身份凭据完成认证的:启动Proxy时,它会读取本地的Application Default Credentials(比如你通过
gcloud auth login登录的账号,或者服务账号密钥文件),向Google Cloud验证你是否拥有目标Cloud SQL实例的访问权限(比如cloudsql.client角色)。 - 一旦Proxy认证通过,它会在本地127.0.0.1:5432建立加密通道,此时通过这个通道连接数据库时,Cloud SQL实例会信任Proxy传递的身份,跳过PostgreSQL的密码校验环节,所以不需要输入密码。
二、密码缓存的可能排查方向
你排除了PGPASSWORD环境变量,那可以从这些地方找原因:
- PostgreSQL客户端密码配置文件:Windows下路径为
%APPDATA%\postgresql\pgpass.conf,文件格式是hostname:port:database:username:password。如果这个文件里存在本地127.0.0.1:5432对应你的数据库账号条目,psql会自动读取密码,无需手动输入。 - Windows凭据管理器:部分PostgreSQL客户端会将密码存储在系统凭据中,打开「控制面板→用户账户→凭据管理器→Windows凭据」,搜索包含PostgreSQL、127.0.0.1或你的实例名称的条目,看看是否有缓存的密码。
- 终端会话缓存:如果用的是带会话记忆功能的终端工具(比如Windows Terminal的某些配置),可能会缓存之前输入的密码,但重启终端后会失效,你可以换个干净的终端窗口测试。
附操作及连接示例
直接连接Cloud SQL实例的命令输出
> psql --host=12.34.56.78 --dbname=mydb --username=postgres Password for user postgres: psql (17.2) WARNING: Console code page (850) differs from Windows code page (1252) 8-bit characters might not work correctly. See psql reference page "Notes for Windows users" for details. SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: PostgreSQL) Type "help" for help. mydb=>
通过Auth Proxy连接的命令输出
> psql --dbname=mydb --username=postgres psql (17.2) WARNING: Console code page (850) differs from Windows code page (1252) 8-bit characters might not work correctly. See psql reference page "Notes for Windows users" for details. Type "help" for help. mydb=>
实例创建及Proxy启动命令
> gcloud sql instances create --database-version POSTGRES_17 --tier db-perf-optimized-N-2 test-sql WARNING: Starting with release 233.0.0, you will need to specify either a region or a zone to create an instance. Creating Cloud SQL instance for POSTGRES_17...done. Created [https://sqladmin.googleapis.com/sql/v1beta4/projects/test-gcp-123456/instances/test-sql]. NAME DATABASE_VERSION LOCATION TIER PRIMARY_ADDRESS PRIVATE_ADDRESS STATUS test-sql POSTGRES_17 us-central1-c db-perf-optimized-N-2 12.345.678.910 - RUNNABLE > gcloud sql databases create test-db --instance test-sql Creating Cloud SQL database...done. Created database [test-db]. instance: test-sql name: test-db project: test-gcp-123456 > gcloud sql users set-password postgres --instance test-sql --password postgres Updating Cloud SQL user...done. > gcloud sql instances describe test-sql --format='get(connectionName)' test-gcp-123456:us-central1:test-sql > C:\Users\orbsv\Downloads\cloud-sql-proxy.x64.exe test-gcp-123456:us-central1:test-sql 2025/01/22 20:37:59 Authorizing with Application Default Credentials 2025/01/22 20:38:01 [test-gcp-123456:us-central1:test-sql] Listening on 127.0.0.1:5432 2025/01/22 20:38:01 The proxy has started successfully and is ready for new connections!
内容的提问来源于stack exchange,提问作者Pragmateek
相关产品推荐
相关产品推荐

