首页 > 解决方案 > 使用 MSI 从 Azure 应用服务连接到 Azure SQL DB 定期失败

问题描述

我有一个 Python Web 应用程序部署到 Azure 应用程序服务,并使用其托管服务标识 (MSI) 获取令牌并连接到 Azure SQL DB。

一切正常,我在 8 小时到期前刷新了令牌。但是,数据库会定期(似乎大约每 10 天一次)变得无法访问,并且日志中的错误是:

pyodbc.InterfaceError: ('28000', "[28000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user ''. (18456) (SQLDriverConnect)")

当前的修复是重新启动应用服务。

我对原因的思考是如何使用以下代码获取令牌:

msi_enpoint  = environ.get("MSI_ENDPOINT")
msi_secret  = environ.get("MSI_SECRET")
token_auth_uri = f"{msi_endpoint}?resource={resource_uri}&api-version={token_api_version}"
head_msi = {'Secret': msi_secret}
resp = requests.get(token_auth_uri, headers=head_msi)
access_token = resp.json()['access_token']

以及来自MSFT 文档的以下行

MSI_SECRET - 用于帮助减轻服务器端请求伪造 (SSRF) 攻击的标头。该值由平台旋转

如果在应用程序运行时值被轮换,那么应用程序下次尝试获取令牌时,旧的MSI_SECRET仍然是环境变量,并且是获取令牌的无效凭据,因此导致后续无法登录到D B。

这看起来对吗?我们如何克服这个问题,因为应用程序的计划重启仍然可能错过MSI_SECRET轮换?

标签: pythonazureazure-sql-databaseazure-web-app-serviceazure-managed-identity

解决方案


推荐阅读