安全地访问 Key Vault 机密

MAK*_*MAK 2 security powershell azure-keyvault azure-function-app

我在 Powershell 中编写了一个程序,该程序在 Azure Functions 应用程序中按计划运行。为了避免硬编码凭据,我创建了一个 Azure Key Vault 来存储机密。我在 Azure Function 中创建了一个托管标识,在 Azure Key Vault 中创建了机密,然后在 Azure Function 中创建了应用程序设置,使用 URL 指向 Azure Key Vault 中的机密。该程序引用应用程序机密 (APPSETTING) 并按预期运行:

    $uSecret = $ENV:APPSETTING_SecretUsername 
    $pSecret = $ENV:APPSETTING_SecretPassword 
    $sasSecret = $ENV:APPSETTING_SecretSAS
    $securePassword = ConvertTo-SecureString -String $pSecret -AsPlainText -Force
    $UserCredential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $uSecret, $securePassword
    
    $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Run Code Online (Sandbox Code Playgroud)

但是我注意到,如果我通过 Windows Powershell(以管理员身份运行)在我的本地计算机上运行相同的程序,并按如下方式修改上述行,程序运行良好 - 这意味着它可以访问 Office 365 和数据湖存储:

    $uSecret = (Get-AzKeyVaultSecret -VaultName 'auditkeyvault' -Name 'SecretUsername').SecretValueText 
    $pSecret = (Get-AzKeyVaultSecret -VaultName 'auditkeyvault' -Name 'SecretPassword').SecretValueText 
    $sasSecret = (Get-AzKeyVaultSecret -VaultName 'auditkeyvault' -Name 'SecretSAS').SecretValueText 
    $securePassword = ConvertTo-SecureString -String $pSecret -AsPlainText -Force
    $UserCredential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $uSecret, $securePassword
    
    $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Run Code Online (Sandbox Code Playgroud)

为什么我可以在我的计算机上本地运行它?我原本希望只有 Azure Functions 应用程序能够从 Azure Key Vault 检索机密,并且会阻止任何其他资源(例如我的本地计算机)?

使用特定 URL 为 Azure 函数创建托管标识,以便它可以将自己标识为访问密钥的经过身份验证/授权的资源,这难道不是全部目的吗?然而,当我在上面使用 本地运行程序时(Get-AzKeyVaultSecret -VaultName 'auditkeyvault' -Name 'SecretUsername').SecretValueText,我的程序仍然能够检索密钥并运行!

在此处输入图片说明

有人可以解释一下为什么会发生这种情况,或者我是否误解了什么?

非常感谢!

(PS。这都是在带有样本数据的试验实例上运行的,因此目前没有真实数据受到损害)

Sag*_*pre 5

密钥保管库的目的是安全地保护您的秘密。

任何授权凭证(通过 Keyvault 访问策略)都可以通过 REST api 访问这些机密。

要访问机密,您需要:

  • 密钥库中的访问策略允许您进行足够的访问
  • 使用授权帐户进行身份验证

Get-AzKeyVaultSecret 只是另一种检索秘密的方法。

它可以在您的计算机上运行,​​因为您的会话仍然经过身份验证,并且您的 AzureAd 帐户具有对该密钥保管库机密的读取访问权限。

您可以有效地使用任何Az命令,而无需每次都重新进行身份验证。调用Get-AzContext以获取当前上下文详细信息。

Connect-AzAccount 在以下位置自动使用时,请保存您的访问令牌和其他相关信息: C:\Users\MAK\.Azure\AzureRmContext.json

如果您先断开连接Disconnect-AzAccount并尝试在不重新进行身份验证的情况下再次获取秘密,那么它就会失败。

注意 如果您Az对在磁盘上保存令牌的模块不满意,您可以通过以下方式禁用默认行为Disable-AzContextAutosave