很多时候管理Azure的存储账号我们都需要通过下面的界面管理访问密钥,大部分情况下通过密钥的轮替使用更新就可以做到安全管理了。
但是很多时候存储账号的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页,选择当前订阅所使用的目录
创建一个新的Web应用程序
在这个应用的配置页里面我们可以获取到这个应用的ID,同时你可以在这里创建一个应用的访问密钥
有了这个客户端ID,之后我们就可以授权这个应用来访问密钥库了
Set-AzureRmKeyVaultAccessPolicy -VaultName kvstorage -ServicePrincipalName d7cb4add-5b31-44cc-9b25-4009d538f58f -PermissionsToSecrets get
点击管理界面下面的“查看端点”,在这里你可以获取一个非常重要的信息,也就是这个应用的oAuth2.0的获取Token的Endpoint:
这时候你就已经准备好了下面几个信息:
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
请求里面的Header:
Accept: Application/json
Content-Type: application/x-www-form-urlencoded
点击Execute之后就Post了一个Http请求到AAD里面去认证了,这时候我们就可以通过Fiddler拿到返回的Token信息
有了请求KeyVault的Token信息之后,我们就可以找回放置在密钥库中的存储账号的AccessKey了。
首先我们可以通过PowerShell获取到这个密钥的Uri的
有了这个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
点击Execute之后,我们就可以从结果页里面获取到之前存入的AccessKey了。
如果你还希望你的Storage AccessKey是定时动态生成的,你可以结合Azure Automation,自动生成新的Access Key,然后写到密钥库中,这样就可以让你的AccessKey更加安全了。
详细的做法可以参考下面这个英文的博客: