azure - KeyVaultClient 方法 GetSecret() 安全吗?
问题描述
我正在使用 Azure Key Vault,并且正在测试 Azure 资源的“托管标识”。长话短说:使用此功能,我们可以轻松地从(例如)VM、应用服务访问 KeyVault 机密...我编写了以下简单代码:
private void GetKeyVaultSecrets()
{
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
var akvCallback = new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback);
var keyVaultClient = new KeyVaultClient(akvCallback);
var secret = keyVaultClient.GetSecretAsync("https://mykeyvault.vault.azure.net/secrets/mySecret").GetAwaiter().GetResult();
string superSecret = secret.Value;
}
而且我可以在没有任何授权的情况下访问我的“秘密” 。安全吗?我错过了什么吗?看起来很奇怪,通过这 7 行代码,您可以访问所有秘密。感谢您的关注。
解决方案
如果您在具有系统分配的托管标识的服务上运行它,实际发生的情况如下(例如,应用服务,VM 略有不同):
- 您的应用读取 IDENTITY_ENDPOINT 和 IDENTITY_HEADER 环境变量
- 使用 IDENTITY_HEADER 作为身份验证对 IDENTITY_ENDPOINT 的 HTTP 调用
- 不能从外部调用此端点,只能从实例内部调用。
- 它的端口也是随机的
- 在通话中,您的应用指定它需要 Key Vault 的令牌(资源https://vault.azure.net)
- 托管标识终结点使用它创建的证书通过客户端凭据流向 Azure Active Directory 进行身份验证
- Azure AD 验证请求并颁发令牌
- 托管身份端点将令牌返回给您的应用
- KeyVaultClient 使用令牌授权对 Key Vault 的调用
在虚拟机上,实例元数据服务用于获取令牌。
要了解的主要内容是,在实例本身上运行的任何进程都能够从托管身份获取令牌。尽管如果您要在您的实例上运行恶意代码,其他方法也可能会遇到麻烦:)
如果您在本地运行该代码,它也可以工作。AzureServiceTokenProvider 还会尝试 Visual Studio 身份验证以及 Azure CLI 身份验证。因此,如果您登录到例如 AZ CLI,它能够为您的用户获取 Azure Key Vault 的访问令牌并访问它。
推荐阅读
- linux - 什么负责在Linux上进行字体渲染?
- visual-studio - 为什么有时选项存档会从 Visual Studio 中消失?
- java - 读取突出显示的 Jtable 行的数据
- amazon-web-services - AWS CLI 与控制台和 CloudFormation 堆栈
- azure - 无法共享仪表板
- angular - Angular 6.1.9 嵌套路由到命名出口 - “无法匹配任何路由”错误
- c - 使用C中的信号在两个进程之间进行通信
- python - 如何在python3程序中使用超过20个嵌套for循环,而静态嵌套块太多?
- python - 正则表达式:如何捕获带有空格/连字符的单词,不包括数字?
- r - 多次调用函数而不重复(使用 %>%)