如何为运行在虚拟机(IaaS)上的PostgreSQL配置Azure Active Directory身份认证?
我完全理解你的痛点——共享硬编码凭证、没法追踪操作、管理单个用户太麻烦,还怕凭证乱传。确实大多数文档都是针对Azure托管PostgreSQL的AD集成,不过VM上的PostgreSQL也能实现,下面给你两种可行的方案,一步步来:
方案一:通过Kerberos集成Azure AD(适合已加入Azure AD域的VM)
这种方式依赖Kerberos协议,把Azure AD作为KDC(密钥分发中心),适合已经将VM加入Azure AD域服务(AAD DS)的场景。
步骤1:将VM加入Azure AD域
- 如果是Windows VM:直接在Azure Portal中配置VM加入你的Azure AD域服务,完成域加入流程。
- 如果是Linux VM:使用Azure AD Login for Linux工具,执行
az login完成身份验证后,通过az vm extension set命令配置VM加入Azure AD,同时安装Kerberos客户端组件。
步骤2:配置PostgreSQL支持Kerberos认证
- 找到PostgreSQL的配置文件目录(通常是
/etc/postgresql/<你的版本>/main/),修改postgresql.conf:krb_server_keyfile = '/etc/postgresql/<版本>/main/postgres.keytab' krb_caseins_users = on # 可选,允许用户名不区分大小写 - 修改
pg_hba.conf,添加Kerberos认证规则(替换YOUR_AAD_DOMAIN.COM为你的Azure AD域名):host all all 0.0.0.0/0 gss include_realm=0 krb_realm=YOUR_AAD_DOMAIN.COM - 重启PostgreSQL服务:
sudo systemctl restart postgresql
- 找到PostgreSQL的配置文件目录(通常是
步骤3:映射Azure AD用户/组到PostgreSQL
登录PostgreSQL超级用户(比如postgres),执行SQL命令创建对应用户或角色:- 映射单个Azure AD用户:
CREATE USER "user@your-aad-domain.com" LOGIN; - 映射Azure AD组:
CREATE ROLE "aad-dev-team" LOGIN;
之后可以用
GRANT命令给这些用户/角色分配数据库权限,比如GRANT SELECT ON ALL TABLES IN SCHEMA public TO "aad-dev-team";- 映射单个Azure AD用户:
步骤4:测试认证
- Linux客户端:先获取Kerberos票据
kinit user@your-aad-domain.com,输入Azure AD密码后,用psql -h <VM的IP> -U user@your-aad-domain.com -d <数据库名>登录。 - Windows客户端:直接用已登录Azure AD域的账户,打开命令提示符执行
psql -h <VM的IP> -U user@your-aad-domain.com -d <数据库名>即可登录。
- Linux客户端:先获取Kerberos票据
方案二:使用Azure AD OIDC令牌认证(适合未加入域的VM)
这种方式更灵活,不需要VM加入域,通过PostgreSQL的OIDC扩展验证Azure AD颁发的令牌,适合云原生或非域环境。
步骤1:在Azure AD中注册应用程序
登录Azure Portal,创建一个新的应用注册,记录下租户ID和客户端ID(后续配置要用)。如果需要交互式认证,可以设置重定向URI,不过非交互式场景可以跳过。步骤2:安装PostgreSQL的OIDC扩展
以Linux VM为例,克隆pg_oidc扩展源码并编译安装:git clone https://github.com/michelp/pg_oidc.git cd pg_oidc make sudo make install注意要确保安装了PostgreSQL的开发包(比如
postgresql-server-dev-<版本>)和依赖库。步骤3:配置PostgreSQL启用OIDC认证
- 修改
postgresql.conf,添加扩展和OIDC配置(替换<租户ID>和<客户端ID>):shared_preload_libraries = 'pg_oidc' oidc_issuer_url = 'https://login.microsoftonline.com/<租户ID>/v2.0' oidc_client_id = '<你的应用客户端ID>' - 修改
pg_hba.conf,添加OIDC认证规则:host all all 0.0.0.0/0 oidc - 重启PostgreSQL服务:
sudo systemctl restart postgresql
- 修改
步骤4:映射Azure AD用户/组到PostgreSQL
和方案一类似,创建对应用户或角色:CREATE USER "user@your-aad-domain.com" LOGIN; CREATE ROLE "aad-dev-team" LOGIN;可以通过Azure AD应用的组声明配置,让OIDC扩展自动识别用户所属的AD组,实现基于组的权限控制。
步骤5:测试认证
先获取Azure AD访问令牌,比如用Azure CLI:az account get-access-token --resource <你的应用客户端ID> --query accessToken -o tsv然后用令牌登录PostgreSQL:
psql "host=<VM的IP> port=5432 dbname=<数据库名> user=user@your-aad-domain.com password=<刚才获取的令牌>"
额外注意事项
- 确保VM的防火墙开放PostgreSQL端口(5432),如果用Kerberos,还要开放88(Kerberos认证)和464(密码修改)端口。
- Kerberos方式的
postgres.keytab文件需要定期更新,避免凭证过期。 - 可以搭配
pgAudit插件,开启审计日志,这样就能精准追踪每个Azure AD用户的DML/DDL操作了。 - OIDC令牌有有效期,默认是1小时,客户端需要定期刷新令牌。
备注:内容来源于stack exchange,提问作者Senthil

