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 略有不同):
- 您的应用读取 IDENTITY_ENDPOINT 和 IDENTITY_HEADER 环境变量
- HTTP 调用 IDENTITY_ENDPOINT 使用 IDENTITY_HEADER 作为身份验证
- 无法从外部调用此端点,只能从实例内部调用。
- 它的端口也是随机的
- 在调用中,您的应用指定它需要 Key Vault 的令牌(资源 https://vault.azure.net)
- 托管身份端点使用它创建的证书通过客户端凭据流向 Azure Active Directory 进行身份验证
- Azure AD 验证请求并颁发令牌
- 托管身份端点returns您应用程序的令牌
- KeyVaultClient 使用令牌授权对 Key Vault 的调用
在虚拟机上,实例元数据服务用于获取令牌。
要了解的主要事情是实例上的任何进程 运行ning 都能够从托管标识获取令牌。
尽管如果您要在您的实例上获得恶意代码 运行ning,
其他方法也可能遇到麻烦:)
如果您 运行 在本地编写该代码,它也可以工作。
AzureServiceTokenProvider 还尝试 Visual Studio 身份验证以及 Azure CLI 身份验证。
因此,如果您登录到例如AZ CLI,它能够为您的用户获取 Azure Key Vault 的访问令牌并访问它。
我正在使用 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 略有不同):
- 您的应用读取 IDENTITY_ENDPOINT 和 IDENTITY_HEADER 环境变量
- HTTP 调用 IDENTITY_ENDPOINT 使用 IDENTITY_HEADER 作为身份验证
- 无法从外部调用此端点,只能从实例内部调用。
- 它的端口也是随机的
- 在调用中,您的应用指定它需要 Key Vault 的令牌(资源 https://vault.azure.net)
- 托管身份端点使用它创建的证书通过客户端凭据流向 Azure Active Directory 进行身份验证
- Azure AD 验证请求并颁发令牌
- 托管身份端点returns您应用程序的令牌
- KeyVaultClient 使用令牌授权对 Key Vault 的调用
在虚拟机上,实例元数据服务用于获取令牌。
要了解的主要事情是实例上的任何进程 运行ning 都能够从托管标识获取令牌。 尽管如果您要在您的实例上获得恶意代码 运行ning, 其他方法也可能遇到麻烦:)
如果您 运行 在本地编写该代码,它也可以工作。 AzureServiceTokenProvider 还尝试 Visual Studio 身份验证以及 Azure CLI 身份验证。 因此,如果您登录到例如AZ CLI,它能够为您的用户获取 Azure Key Vault 的访问令牌并访问它。