首页 > 解决方案 > 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 行代码,您可以访问所有秘密。感谢您的关注。

标签: azuresecurityazure-keyvault

解决方案


如果您在具有系统分配的托管标识的服务上运行它,实际发生的情况如下(例如,应用服务,VM 略有不同):

  1. 您的应用读取 IDENTITY_ENDPOINT 和 IDENTITY_HEADER 环境变量
  2. 使用 IDENTITY_HEADER 作为身份验证对 IDENTITY_ENDPOINT 的 HTTP 调用
    • 不能从外部调用此端点,只能从实例内部调用。
    • 它的端口也是随机的
  3. 在通话中,您的应用指定它需要 Key Vault 的令牌(资源https://vault.azure.net
  4. 托管标识终结点使用它创建的证书通过客户端凭据流向 Azure Active Directory 进行身份验证
  5. Azure AD 验证请求并颁发令牌
  6. 托管身份端点将令牌返回给您的应用
  7. KeyVaultClient 使用令牌授权对 Key Vault 的调用

在虚拟机上,实例元数据服务用于获取令牌。

要了解的主要内容是,在实例本身上运行的任何进程都能够从托管身份获取令牌。尽管如果您要在您的实例上运行恶意代码,其他方法也可能会遇到麻烦:)

如果您在本地运行该代码,它也可以工作。AzureServiceTokenProvider 还会尝试 Visual Studio 身份验证以及 Azure CLI 身份验证。因此,如果您登录到例如 AZ CLI,它能够为您的用户获取 Azure Key Vault 的访问令牌并访问它。

参考:https ://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?context=azure%2Factive-directory%2Fmanaged-identities-azure-resources%2Fcontext%2Fmsi-context&tabs= dotnet#rest-protocol-examples

在 VM 中完成的示例请求:https ://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-nonaad#access-data


推荐阅读