KeyVaultClient方法GetSecret()是否安全?

问题描述 投票:0回答:1

我正在使用 Azure Key Vault,我正在测试 Azure Resource 的 "托管身份"。长话短说:有了这个功能,我们可以很容易地从(例如)虚拟机、应用程序服务中访问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;
    }

我就可以访问我的 "秘密" 未经任何形式的授权. 安全吗?我是不是错过了什么?看上去很奇怪,就这七行代码就能获取你所有的秘密。谢谢你的关注。

azure security azure-keyvault
1个回答
0
投票

如果您在一个具有系统分配的托管身份的服务上运行该功能,以下是实际发生的情况(App服务的例子,VM略有不同)。

  1. 您的应用程序读取IDENTITY_ENDPOINT和IDENTITY_HEADER环境变量。
  2. 使用IDENTITY_HEADER作为验证的HTTP调用IDENTITY_ENDPOINT。
    • 这个端点不能从外部调用,只能从实例内部调用。
    • 它的端口也是随机的
  3. 在调用中,您的应用程序指定它想要一个Key Vault的令牌(resource https:/vault.azure.net。)
  4. 管理的身份终端使用它创建的证书,通过客户端凭证流来验证Azure活动目录
  5. Azure AD 验证该请求并发出一个令牌
  6. 管理身份终端将令牌返回给您的应用程序。
  7. KeyVaultClient使用该令牌授权调用Key Vault。

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

最主要的是,在实例上运行的任何进程都能够从管理的身份中获取令牌,尽管如果你在实例上运行恶意代码,其他方法也会有麻烦:)

AzureServiceTokenProvider还尝试Visual Studio身份验证以及Azure CLI身份验证,所以如果你登录AZ CLI,它能够为你的用户获取Azure Key Vault的访问令牌并访问它。

参考文献。https:/docs.microsoft.comen-usazureapp-serviceoverview-managed-identity?context=azure%2Factive-directory%2Fmanaged-identities-azure-resources%2Fcontext%2Fmsi-context&tabs=dotnet#rest-protocol-examples。

在虚拟机中完成的示例请求。https:/docs.microsoft.comen-usazureactive-directorymanaged-identities-azureresourceestutorial-windows-vm-access-nonaad#access-data。

© www.soinside.com 2019 - 2024. All rights reserved.