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 得要先做好哦.