category
在开发web服务时,您可能需要使用OAuth 2.0代表(OBO)流来获取令牌。海外建筑运营管理局流服务于应用程序调用服务或web API的用例,而服务或web又需要调用另一个服务或web API。海外建筑运营管理局通过请求链传播委托的用户身份和权限。当应用程序需要无限期地使用访问和刷新令牌时,通常在离线访问场景中,安全地存储刷新令牌至关重要。
警告
仔细考虑存储任何安全令牌所涉及的风险和责任,因为这些令牌可能会让恶意行为者访问受组织的
Microsoft Entra ID保护的资源。针对任何组织目录(任何Microsoft Entra目录-多租户)中的帐户
的应用程序的安全漏洞可能特别严重。
存储访问令牌会带来更大的安全风险,因为访问令牌本身就可以访问资源。建议的方法不是存储访问令牌,
而是根据需要获取访问令牌。只安全地存储刷新令牌,就像它们是访问令牌一样严格。
如有必要,如果刷新令牌被破坏,您可以撤销它们。
潜在用例
此解决方案使用Azure密钥库、Azure功能和Azure DevOps来安全地更新和存储OBO刷新令牌。
架构
显示密钥和令牌刷新过程的图表。
Download a Visio file of this architecture.
流
- Azure密钥库为每个Microsoft Entra ID租户保存秘密加密密钥。
- Azure函数计时器触发的函数从密钥库获取最新的密钥。另一个Azure函数从Microsoft身份平台检索刷新令牌,并将其与最新的密钥版本一起保存。
- 数据库存储最新的加密密钥和不透明数据。
- Azure DevOps连续交付管道管理和同步秘密轮换和令牌刷新过程。
如果您已经将管道作为代码(IaC)或持续集成和交付(CI/CD)用于基础设施,那么Azure管道是添加关键轮换战略的方便场所。您不必使用Azure管道,只要您限制设置和检索机密的路径即可。
应用以下策略以允许Azure DevOps服务连接的服务主体在密钥保管库中设置机密。将<Key Vault Name>和<Service Connection Principal>变量替换为适合您的环境的正确值。
az keyvault set-policy --name $<Key Vault Name>
--spn $<Service Connection Principal> --secret-permissions set
将Azure管道设置为创建和更新密钥后,可以安排管道定期运行。管道将更新密钥库密钥以与密钥旋转同步,并将加密的令牌与新的密钥版本一起保存。有关详细信息,请参阅配置管道的时间表。
托管身份
Azure功能等Azure服务访问密钥库的首选方式是使用该服务的托管身份。您可以通过Azure门户、Azure CLI或通过用于IaC场景的Azure资源管理器(ARM)模板授予访问权限。
Azure门户
在Azure门户中,添加密钥保管库访问策略,以允许Azure功能托管的身份对象ID获取和设置机密。有关更多信息,请参阅为应用程序服务和Azure功能添加系统分配的标识和使用密钥库参考。
Azure CLI
您还可以使用Azure CLI设置Azure密钥保管库策略:
Azure CLI
az keyvault set-policy --name $<Key Vault Name>
--spn $<Service Connection Principal> --secret-permissions set
az keyvault set-policy --name $<Key Vault Name>
--spn $<Managed Identity Principal> --secret-permissions get
ARM模板
以下ARM模板允许Azure功能访问Azure密钥库。将***变量替换为适合您的环境的正确值。
JSON
{
"type": "Microsoft.KeyVault/vaults",
"apiVersion": "2019-09-01",
"name": "***",
"location": "***",
"properties": {
"sku": {
"family": "A",
"name": "standard"
},
"tenantId": "***",
"enableSoftDelete": true,
"enabledForDeployment": false,
"enabledForTemplateDeployment": false,
"enabledForDiskEncryption": false,
"accessPolicies": [
{
"tenantId": "***",
"objectId": "<Managed Identity Principal>",
"permissions": {
"secrets": [
"get"
]
}
},
{
"tenantId": "***",
"objectId": "<Service Connection Principal>",
"permissions": {
"secrets": [
"set"
]
}
}
]
}
}
Token存储
您可以使用任何数据库以加密形式存储令牌。下图显示了在数据库中存储刷新令牌的顺序:
该序列有两个函数,userId()和secretId()。您可以将这些函数定义为token.oid、token.tid和token.sub的某种组合。有关更多信息,请参阅使用id_token。
将加密密钥存储为机密后,您可以在Azure密钥库中查找该密钥的最新版本。
Token使用
使用密钥很简单。以下序列根据最新的密钥版本查询密钥。
令牌刷新与DoWork函数正交,因此Azure函数可以通过使用耐用函数异步执行DoWork和令牌刷新。有关具有耐用函数的HTTP触发函数的更多信息,请参阅HTTP功能。
不建议在HTTP请求管道中使用Azure密钥保管库,因此请在合理的时候缓存响应。在本例中,Key Vault对getSecret(secretId,secretVersion)调用的响应是可缓存的。
密钥轮换和令牌刷新
您可以在刷新刷新令牌的同时旋转密钥,因此最新的令牌将使用最新版本的加密密钥进行加密。此进程使用内置的Azure函数支持计时器触发器。有关详细信息,请参阅Azure函数的计时器触发器。
以下序列图说明了将令牌刷新与密钥旋转同步的过程:
用户和访问控制
Microsoft身份平台提供了在发生泄露时撤销刷新令牌的功能。请参阅令牌吊销和吊销AzureADUserAllRefreshToken。
笔记
自2024年3月30日起,Azure AD和MSOnline PowerShell模块已弃用。要了解更多信息,请阅读弃用更新。
在此日期之后,对这些模块的支持仅限于对Microsoft Graph PowerShell SDK的迁移帮助和安全修复。
弃用的模块将继续运行至2025年3月30日。
我们建议迁移到Microsoft Graph PowerShell以与Microsoft Entra ID(以前的Azure AD)交互。有关常见的迁移问题,请参阅迁移常见问题解答。注:MSOnline的1.0.x版本可能会在2024年6月30日之后出现中断。
要从Microsoft Entra ID中删除用户,只需删除该用户的记录。要删除每个用户的应用程序访问权限,请删除用户数据的refreshToken部分。
要删除一组用户(如目标租户中的所有用户)的访问权限,可以使用Azure Pipelines基于secretId()删除该组的机密。
- 登录 发表评论
- 7 次浏览
Tags
最新内容
- 12 hours ago
- 14 hours 55 minutes ago
- 15 hours 11 minutes ago
- 3 days 6 hours ago
- 3 days 14 hours ago
- 3 days 14 hours ago
- 3 days 15 hours ago
- 3 days 15 hours ago
- 1 week 1 day ago
- 1 week 1 day ago