我用Powershell编写了一个程序,该程序按计划在Azure Functions应用程序中运行。为避免使用硬编码的凭据,我创建了一个Azure密钥保管库来存储机密。我在Azure函数中创建了一个托管身份,在Azure Key Vault中创建了机密,然后在URL指向Azure Azure Vault中的机密的Azure函数中创建了应用程序设置。该程序引用了应用程序的机密(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
但是我注意到,如果我通过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
为什么我可以在计算机上本地运行它?我希望只有Azure Functions应用程序能够从Azure Key Vault检索机密,并且会阻止其他任何资源(例如本地计算机)?
使用特定的URL为Azure功能创建托管身份的全部目的不是,以便它可以将自己标识为访问密钥的经过身份验证/授权的资源吗?但是,当我使用(Get-AzKeyVaultSecret -VaultName 'auditkeyvault' -Name 'SecretUsername').SecretValueText
在本地上方运行程序时,我的程序仍然能够检索密钥并运行!
有人可以说明为什么会发生这种情况,或者如果我误解了什么吗?
非常感谢!
(PS。所有这些都在带有样本数据的试验实例上运行,因此目前没有破坏任何真实数据)
答案 0 :(得分:4)
密钥库的目的是安全地保护您的秘密。
任何授权的凭据(通过Keyvault访问策略)都可以通过REST API访问这些机密。
要访问机密,您需要:
Get-AzKeyVaultSecret
只是检索秘密的另一种方法。
它可以在您的计算机上运行,因为您的会话仍在进行身份验证,并且您的AzureAd帐户具有对该密钥库机密的读取权限。
您可以有效地使用任何Az
命令,而无需每次都重新进行身份验证。
调用Get-AzContext
以获取当前上下文的详细信息。
Connect-AzAccount
会在以下位置自动使用时保存您的访问令牌和其他相关信息:C:\Users\MAK\.Azure\AzureRmContext.json
如果您要先断开Disconnect-AzAccount
的连接,然后尝试在没有重新认证的情况下再次获取机密,那么它将失败。
注意
如果您不满意Az
模块在磁盘上保存令牌的情况,可以通过Disable-AzContextAutosave