You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为运行在虚拟机(IaaS)上的PostgreSQL配置Azure Active Directory身份认证?

如何为运行在虚拟机(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认证

    1. 找到PostgreSQL的配置文件目录(通常是/etc/postgresql/<你的版本>/main/),修改postgresql.conf:
      krb_server_keyfile = '/etc/postgresql/<版本>/main/postgres.keytab'
      krb_caseins_users = on  # 可选,允许用户名不区分大小写
      
    2. 修改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
      
    3. 重启PostgreSQL服务:sudo systemctl restart 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";

  • 步骤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 <数据库名>即可登录。

方案二:使用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认证

    1. 修改postgresql.conf,添加扩展和OIDC配置(替换<租户ID>和<客户端ID>):
      shared_preload_libraries = 'pg_oidc'
      oidc_issuer_url = 'https://login.microsoftonline.com/<租户ID>/v2.0'
      oidc_client_id = '<你的应用客户端ID>'
      
    2. 修改pg_hba.conf,添加OIDC认证规则:
      host all all 0.0.0.0/0 oidc
      
    3. 重启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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:59:10