KeyVaultClient 方法 GetSecret() 安全吗?

Is the KeyVaultClient method GetSecret() safe?

我正在使用 Azure Key Vault,我正在测试 Azure 资源的 "Managed Identities"。长话短说:有了这个功能,我们可以轻松地从(例如)虚拟机、应用程序服务访问 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;
    }

而且我可以访问我的 "Secret" ,无需任何类型的授权。安全吗?我错过了什么吗?看起来很奇怪,用这 7 行代码你就可以访问你所有的秘密。感谢您的关注。

如果您运行在具有系统分配的托管身份的服务上执行此操作,则实际发生的情况如下(应用服务示例,VM 略有不同):

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

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

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

如果您 运行 在本地编写该代码,它也可以工作。 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