Asp.net core 学习笔记 Secret 和 Data Protect Azure key-vault & Storage Account 第 2 篇

更新 30-04-2023

最新版本请看这 2 篇

ASP.NET Core – User Secret & Azure Key Vault

 

之前有写过 2 篇关于 key-vault 和 data protect 的, 但是最近发现之前的 dll 已经废弃了, 而且 Azure 有一点点更新了. 所以这些写多一篇

https://www.cnblogs.com/keatkeat/p/9313468.html (Azure key-vault 第一篇)

https://www.cnblogs.com/keatkeat/p/9316389.html (Data protect 第一篇)

 

参考: 

https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-5.0&tabs=windows

https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-5.0

https://docs.microsoft.com/en-us/azure/key-vault/secrets/quick-create-cli

https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/overview

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-5.0

https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-nonaad

https://docs.microsoft.com/en-us/azure/key-vault/general/tutorial-net-virtual-machine#:~:text=Azure%20Key%20Vault%20helps%20you,%2C%20services%2C%20and%20IT%20resources.&text=Create%20an%20Azure%20virtual%20machine,permissions%20to%20the%20VM%20identity.

 

先讲个 overview 

key vault 一样是去 azure 做就可以了, 只是现在比较流行用 azure cli 来做, 比较方便啦. 

从前 website 要访问 key vault 需要弄一个 app id 和 app secret 

现在改成 2 种方式, 

第一 AD Directory Id + AD Application Id + AD Cert Thumbprint 才可以访问 AD 就是 Azure Active Directory

cert 需要自己做, 然后 upload 到 AD 去. 然后 web server 也要 install. 由于 IIS 要访问 cert store 会遇到许多 permission 的限制, 所以如果你的网站是 host 在 azure 的话就选方案 2 吧.

第二 就简单多了, 不需要任何 APP, 但是需要 host in Azure. VM or App service 都可以.

 

data protect 方面几乎没有什么改动, 一样做 storage account, 一样做 key 在 key-vault.

唯一的区别是获取 key-vault 的 key 的时候也是用到了上面的第一或二方式. 

 

好现在 step by step 讲

https://docs.microsoft.com/en-us/azure/key-vault/secrets/quick-create-cli

install > login

az group create --name "klc-resource-group" --location "SoutheastAsia"

az keyvault create --name "klc-test-key-vault" --resource-group "klc-resource-group" --location "Southeast Asia"

az keyvault secret set --vault-name "klc-test-key-vault" --name "Password" --value "123456"

这样就把 secret 做好了

然后方案 1 的话就是要去弄 AD Application 等了

https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-5.0#use-application-id-and-x509-certificate-for-non-azure-hosted-apps

follow 这个 step 

 

 cert 的做法可以参考我这篇 

https://www.cnblogs.com/keatkeat/p/13412953.html

https://www.cnblogs.com/keatkeat/p/9326389.html

然后去 azure search Azure Active Directory > App registration > create app > 进入 app > Certificates & secrets > upload cert

然后把资料写入 appsetting https://github.com/dotnet/AspNetCore.Docs/blob/master/aspnetcore/security/key-vault-configuration/samples/3.x/SampleApp/appsettings.json

其余的 code 就招 sample 做就可以了. 

有了 app 就去 key-vault 里面 > Access policies >  Add Access Policy > Configure from template (optional) 选 key, secret, cert > Select principal 选刚才做好的 app 就可以了. 

ok 这个是第一种方案. 

第二种就更简单了.

去 vm > Identity > System assigned enable 打勾 > 去 key-vault > Access policies > 

Azure Virtual Machines for deplyment 打勾, 然后 Add Access Policy > Configure from template (optional) 选 key, secret, cert > Select principal 选刚才的 vm 就可以了 

Permission key 里面 Unwrap Key 和 Wrap Key 都要勾, 做 data protect 的时候会用到.

 

接下来讲一下 storage account

和之前是一样的, 只是我自己的改成了不需要 app id

services.AddDataProtection()
    .SetApplicationName(configuration["DataProtection:ApplicationName"])
    .PersistKeysToAzureBlobStorage(new Uri(configuration["DataProtection:CloudStorageUrl"]))
    //.PersistKeysToFileSystem(new System.IO.DirectoryInfo($@"{hostingEnvironment.ContentRootPath}\DataProtectXml")) // for 第一次 generate 然后 upload to Azure Blob
    .ProtectKeysWithAzureKeyVault(
        new Uri(configuration["DataProtection:CloudKeyUrl"]),
        new DefaultAzureCredential()
    );

for 第一次比较麻烦, 因为它需要你先做一个 xml 在 azure blob 才可以. 官网是有给出方案的. 但是需要比较多的权限, 不仅仅是 sas, 而是需要 storage account 的 connect string.

 具体做法就是把 sas 换成 connection string, container name, blob name 

blob name 就是 file name 比如 data-protection-key.xml 这样. 

有一点要注意的是, 它只会帮你做 blob, 而不是 container. 所以 container 得要先做好哦. 

 

 

 

 

 
 
 

 

posted @ 2021-02-11 00:52  兴杰  阅读(287)  评论(0编辑  收藏  举报