利用KeyVault来加强存储Azure Storage访问密钥管理

时间:2024-07-10 14:03:20

很多时候管理Azure的存储账号我们都需要通过下面的界面管理访问密钥,大部分情况下通过密钥的轮替使用更新就可以做到安全管理了。

利用KeyVault来加强存储Azure Storage访问密钥管理

但是很多时候存储账号的Key就会不小心分发到开人员、测试人员、和管理员手中。现在如果需要更加严格的管理这个存储账号的并且指定特定的应用程序才能访问这个存储账号的话,可以利用Azure Active Directory(AAD)和Key Vault(密钥管理库)来加强这个密钥管理

第一步:利用PowerShell生成一个新的密钥库

Add-AzureRmAccount -EnvironmentName "AzureChinaCloud"
New-AzureRMResourceGroup -Name kvstorage
New-AzureRmKeyVault -VaultName kvstorage -ResourceGroupName kvstorage

第二步:将Storage的Access Key放入密钥库中

假设我们这里拿到的AccessKey是:password123456789

$secValue=ConvertTo-SecureString 'password123456789' -AsPlainText -Force
Set-AzureKeyVaultSecret -VaultName kvstorage -Name storage -SecretValue $secValue

非常简单的已经讲一个Key放入了密钥库中了,那剩下就是需要授权应用来使用这个Key.

第三步:创建Azure AD Application

点击Azure 管理界面的Active Directory页,选择当前订阅所使用的目录

利用KeyVault来加强存储Azure Storage访问密钥管理

创建一个新的Web应用程序

利用KeyVault来加强存储Azure Storage访问密钥管理

在这个应用的配置页里面我们可以获取到这个应用的ID,同时你可以在这里创建一个应用的访问密钥

利用KeyVault来加强存储Azure Storage访问密钥管理

利用KeyVault来加强存储Azure Storage访问密钥管理

有了这个客户端ID,之后我们就可以授权这个应用来访问密钥库了

Set-AzureRmKeyVaultAccessPolicy -VaultName kvstorage -ServicePrincipalName d7cb4add-5b31-44cc-9b25-4009d538f58f  -PermissionsToSecrets get

利用KeyVault来加强存储Azure Storage访问密钥管理

点击管理界面下面的“查看端点”,在这里你可以获取一个非常重要的信息,也就是这个应用的oAuth2.0的获取Token的Endpoint:

利用KeyVault来加强存储Azure Storage访问密钥管理

利用KeyVault来加强存储Azure Storage访问密钥管理

这时候你就已经准备好了下面几个信息:

ClientID:{你的应用ID}

ClientSecret:{你的应用密钥}

OAuth EndPoint:https://login.chinacloudapi.cn/{你的目录ID}/oauth2/token

有了这些信息以后就可以通过Fiddler来模拟通过REST API来请求密钥库获取存储的AccessKey了,因为全部都是http请求,所以不关你是.NET还是java还是PHP都没关系。

首先我们通过oAuth 2.0的Endpoint获取应用访问密钥库的Bearer Token,我们需要模拟一个http form请求,所以Request Body里面要有

grant_type=client_credentials&client_id={你的应用ID}&client_secret={你的应用密钥}&resource=https%3a%2f%2fvault.azure.cn

注意你的应用密钥中的+号用%2B代替 =号用%3D代替 /号用%2F代替

例如:

glYO5dRztXLYyA+S7nxYclOzDBlmfh/F4KacfkIXgH8=

就是:

glYO5dRztXLYyA%2BS7nxYclOzDBlmfh%2FF4KacfkIXgH8%3D

请参考:https://blogs.msdn.microsoft.com/dsadsi/2013/08/12/using-fiddler-to-acquire-a-jwt-json-web-token-for-use-with-the-graph-api/

请求里面的Header:

Accept: Application/json

Content-Type: application/x-www-form-urlencoded

利用KeyVault来加强存储Azure Storage访问密钥管理

点击Execute之后就Post了一个Http请求到AAD里面去认证了,这时候我们就可以通过Fiddler拿到返回的Token信息

利用KeyVault来加强存储Azure Storage访问密钥管理

有了请求KeyVault的Token信息之后,我们就可以找回放置在密钥库中的存储账号的AccessKey了。

首先我们可以通过PowerShell获取到这个密钥的Uri的

利用KeyVault来加强存储Azure Storage访问密钥管理

有了这个Uri和Token之后之后我们只需要在通过Fiddler发送一个Http GET请求就能拿到密钥了

我们准一个Http 请求的Header:

Accept: Application/json

Authorization: Bearer {上一步获取到的Token}

请求的Url记得带上api-version信息,如:https://kvstorage.vault.azure.cn/secrets/storage?api-version=2015-06-01

利用KeyVault来加强存储Azure Storage访问密钥管理

点击Execute之后,我们就可以从结果页里面获取到之前存入的AccessKey了。

利用KeyVault来加强存储Azure Storage访问密钥管理

如果你还希望你的Storage AccessKey是定时动态生成的,你可以结合Azure Automation,自动生成新的Access Key,然后写到密钥库中,这样就可以让你的AccessKey更加安全了。

详细的做法可以参考下面这个英文的博客:

http://www.dushyantgill.com/blog/2015/04/26/say-goodbye-to-key-management-manage-access-to-azure-storage-data-using-azure-ad/