已启用Azure AD的Azure PostgreSQL灵活服务器:如何解决应用重启/令牌过期后无法访问问题
问题场景
我部署了Azure PostgreSQL灵活服务器,并且仅启用了Azure AD认证,该认证支持基于令牌的身份验证。我可以通过分配给服务器AD用户的服务主体,使用以下命令登录:
az login --service-principal -u "ID" -p "SECRET" --tenant "TENANT" export PGPASSWORD=$(az account get-access-token --resource-type oss-rdbms --query "[accessToken]" -o tsv) psql "host=mydatabase.database.azure.com user=service-principal dbname=db sslmode=require"
但当我用以下PostgreSQL环境变量配置应用后:
pg_host='mydatabase.database.azure.com' pg_port='5432' pg_database='access-token' pg_username='service-principal' pg_password='<password>' pg_sslmode='require'
遇到了问题:访问令牌每60分钟过期,仅在当前会话有效。如果VM重启,应用就无法连接数据库,必须重新登录并更新pg_password为新令牌。
请问针对灵活服务器和Azure AD登录,除了设置cron在VM重启时更新变量,还有什么基于Azure AD的方案可以解决这个问题?
解决方案
以下是几种更贴合Azure生态的优雅方案,替代手动或cron更新令牌的方式:
1. 用Azure托管标识(Managed Identity)自动获取令牌
如果你的应用部署在Azure资源(VM、App Service、AKS等)上,优先用托管标识——它不需要手动维护服务主体密钥,还能自动安全地获取令牌:
- 给你的VM(或应用所在资源)分配系统分配或用户分配的托管标识
- 在Azure PostgreSQL灵活服务器中,将该托管标识添加为AD用户(或对应权限角色的成员)
- 在VM内部,无需执行
az login,直接通过Azure实例元数据服务(IMDS)获取令牌:
可以把这段命令加到VM的启动脚本里,或者在应用启动前自动执行,甚至在应用代码里集成定时调用逻辑刷新令牌。export PGPASSWORD=$(curl -s "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://ossrdbms-aad.database.windows.net/" -H "Metadata: true" | jq -r .access_token)
2. 在应用代码中集成令牌自动刷新逻辑
如果你的应用有代码控制权,直接用Azure官方SDK(比如Azure.Identity系列)来自动处理令牌的获取与刷新:
- 以Python为例,用
azure-identity库实现:
这类SDK会自动监控令牌有效期,临近过期时自动刷新,完全不需要手动干预。from azure.identity import ClientSecretCredential import psycopg2 # 初始化服务主体凭据 credential = ClientSecretCredential( tenant_id="你的租户ID", client_id="你的服务主体ID", client_secret="你的服务主体密钥" ) # 获取PostgreSQL的访问令牌(SDK会自动处理过期刷新) token = credential.get_token("https://ossrdbms-aad.database.windows.net/.default") # 建立数据库连接 conn = psycopg2.connect( host="mydatabase.database.azure.com", database="access-token", user="service-principal", password=token.token, sslmode="require" )
3. 结合Azure Key Vault实现安全的密钥与令牌管理
把服务主体的敏感信息(ID、密钥、租户ID)存到Key Vault,再通过托管标识访问Key Vault,同时集成令牌刷新逻辑:
- 将服务主体的相关信息作为机密存储到Azure Key Vault
- 给应用所在的VM分配访问Key Vault机密的权限
- 应用启动时从Key Vault拉取服务主体信息,再用Azure SDK获取令牌,并且定时刷新令牌更新数据库连接密码
这种方式既避免了明文存储敏感信息,又能自动处理令牌过期问题。
4. 利用PostgreSQL驱动的原生Azure AD支持
部分PostgreSQL驱动直接支持Azure AD令牌的自动处理,比如.NET的Npgsql驱动,支持直接传入AccessToken参数,无需把令牌放到Password字段,还能配合Azure SDK自动完成令牌刷新。
内容的提问来源于stack exchange,提问作者philthy
相关产品推荐
相关产品推荐

