python - 使用 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
轮换?
解决方案
推荐阅读
- html - 为什么我的 div 会相互重叠?
- javascript - JS await 仅在异步函数中有效。如何解决?
- c++ - C++ 创建随机形状的“blob”对象
- postgresql - 为什么我的 Kubernetes 服务在不同的子网上运行?
- flutter - Flutter:故意隐藏键盘下的Stack项目
- php - 如何从一个表中选择数据并从另一个表中获取所有关联记录?
- python - 我在尝试安装 Labelme 时遇到问题
- python - 使用带有 Python 的 API 创建数据集时出现通道信息中的 KeyError
- python - 用于训练模型的 Keras F1 分数指标
- python - 如何匹配两个numpy数组中包含的值对