在ASP.Net Core和Java中配置金鑰

微軟技術棧發表於2022-01-09

大家好,我是本期的微軟MVP實驗室研究員——張安忠。今天我將通過實驗和完整的操作過程,向大家介紹如何使用在ASP.NET Core和Java專案中整合Azure Key Vault功能。
image.png

思路淺析

在軟體開發中,專案安全是重中之重,特別是在多部門或者開源專案中,如何儲存我們的金鑰,但又不影響本地的開發,是我們開發者需要考慮的問題。這裡簡單的列舉了下平時開發中我們做的方案:

  • 本地直接採用localhost的形式開發。無論是DB還是ES/Redis/MQ,或者是其他的,都一股腦用本地的引數,然後部署到K8s的時候,使用Configmap的形式掛載。也是一種方案,但是會使dev和prod之間隔離的比較厲害
  • 使用遠端配置中心來統一處理本地和生產直接的資料。比如常見的就是Apollo,Azure的Key Vault技術等等。推薦的方式
  • 每次上線都手動修改。這顯然是不合理

PS:本文采用的都是世紀互聯的azure.cn的。

前期準備賬號

首先,需要註冊一個Azure賬號。

其次,需要註冊一個應用程式,註冊的時候,填寫Client密碼,密碼要好好儲存喲,以後會多次使用。

搜尋app registration,註冊一個賬號:

64e411d32d04d47f771ecfe4a7ad6cb1.png

輸入應用名稱,其他的都預設即可:

6044177ca25b161f43ed87074549a358.png

接下來,在Certificates & secrets中,新增Client secrets:

c2c896a4a4bd9dbe4312383189fdbe0b.png

有了應用,就可以在應用內設定金鑰了。

這個時候我們已經有兩個引數了,分別是ClientId和ClientSecret

配置key vault

步驟 1 - 新增Key vault服務

繼續在頂部搜尋Key vault關鍵字:

cf8d971e115c4841e7546f6cc3515a0e.png

建立一個全新的key vault服務,選擇自己的訂閱和資源組,設定下名稱:

d11882e98e27bf61943780da79468627.png

建立完成後,就可以在key vault的overview頁,看到另外兩個引數了:

b601947545ab4dff6d63aed5af7c3cce.png

另外兩個引數,一個是vault的uri,一個是tenantid也準備好了

到這裡四個引數都已經準備好了。

步驟 2 - 引數設定

點選settings下面的secrets選項,建立或匯入配置:

c493acdb8af3f890d4939ededde60e2f.png

在彈出的新頁面中,選擇Manual方式,輸入name和value,配置資料庫的使用者名稱:

5a73c4551cfd0fe96141f29f92acff36.png

然後就建立完成了,可以仿照的把sqlserver的密碼也配置一下:

bc173006bac7c01fc0db30ad5648ceb8.png

步驟 3 - 訪問策略設定

建立完成後,點選轉到該資源進行配置訪問策略,”Settings=》Access policies“,點選 ”Add Access Policy“ 建立新的訪問策略。

首先選擇配置模板 Configure from template(optional):"Secret Management"。

f487d636707cd813b34ae778ca83bd80.png

點選 “Nono select” 進行先選擇服務主體,輸入 “自己的服務賬號名” ,如laozhang.keyvault.demo,進行選擇,點選 “Select”,儲存一下即可。

到這裡Azure相關的配置已經完成,開始寫程式碼吧。

新建一個Core專案

步驟 1 - 建立一個ASP.Net Core5.0 API專案

過程很簡單,就不多說了,建立好後,新增nuget包:

<PackageReference Include="Microsoft.Extensions.Configuration.AzureKeyVault" Version="3.1.21" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.9" />

然後,將上邊四個變數放到環境變數裡,本地開發可以在launchSettings.json裡:

 "IIS Express": {
   "commandName": "IISExpress",
   "launchBrowser": true,
   "launchUrl": "swagger",
   "environmentVariables": {
     "ASPNETCORE_ENVIRONMENT": "Development",
     "AZURE_TENANT_ID": "你的tenantid",
     "AZURE_CLIENT_ID": "你的客戶端id",
     "AZURE_CLIENT_SECRET": "你的客戶端金鑰",
     "AZURE_KEY_VAULT_URI": "https://blog-core-keyvault.vault.azure.cn/"
   }
 }

步驟 2 - 配置Program,連線配置中心

在Program.cs裡配置:

Host.CreateDefaultBuilder(args)
     .ConfigureAppConfiguration((hostingContext, config) =>
     {
         var env = hostingContext.HostingEnvironment;
         var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
         var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
         var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
         config
          .AddJsonFile("appsettings.json", true)
          .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
          .AddEnvironmentVariables();

         string vaultUri = "https://blog-core-keyvault.vault.azure.cn/";
         config.AddAzureKeyVault(vaultUri, clientId, clientSecret);
     })
     .ConfigureWebHostDefaults(webBuilder =>
     {
         webBuilder.UseStartup<Startup>();
     });

如果這個時候,啟動應用沒有報錯的話,那恭喜你,已經連線成功了,接下來就是獲取指定的引數了。

步驟 3 - 任何地方獲取Key Vault的值

這裡使用方法就是和普通的appsettings.json裡的一模一樣了,注入configuration即可:

_configuration.GetValue<string>("MSSQL-USER-PASSWORD");

好啦,在ASP.NET Core應用中,連線Azure Key Vault已經說完了,看看Java如何操作吧。

新建一個Java專案

步驟 1 - 建立一個Sring Boot專案

過程也是很簡單,可以用Idea建立,也可以使用官方的模板來建立,就不多說了,建立好後,新增pom包:

<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>azure-spring-boot-starter-keyvault-secrets</artifactId>
</dependency

然後,將上邊四個變數放到配置檔案裡,

azure.keyvault.enabled=true
azure.keyvault.uri=https://blog-core-keyvault.vault.azure.cn/
azure.keyvault.client-id=你的應用id
azure.keyvault.client-key=你的應用金鑰
azure.keyvault.tenant-id=你的tenantid
azure.keyvault.authority-host=https://login.chinacloudapi.cn

注意最後一個配置很重要,需要指定host地址,因為預設的是Azure.com的,如果你是Azure.com的可以不用指定。

步驟 2 - 任何地方獲取Key Vault的值

這裡使用方法就是和普通的yml裡的一模一樣了,配置變數,打上@value註解即可:

@SpringBootApplication
public class KeyvaultApplication implements CommandLineRunner {

  @Value("${MSSQL-USER-NAME}")
  private String mySecretProperty;

  public static void main(String[] args) {
    SpringApplication.run(KeyvaultApplication.class, args);
  }

  @Override
  public void run(String... args) {
    System.out.println("property your-property-name value is: " + mySecretProperty);
  }
}

好啦,在Java應用中,連線Azure Key Vault也說完了,大家可以嘗試動手聯絡一下喲。

總結

本文以ASP.NET Core和Java為例講解了如何在Azure中連線Key Vault配置,整體流程簡單方便,文件特別清晰,再一次為微軟Docs文件而歡呼。


微軟最有價值專家(MVP)

bc93fde364ea9dd3d9106b58e805b770.png

微軟最有價值專家是微軟公司授予第三方技術專業人士的一個全球獎項。28年來,世界各地的技術社群領導者,因其線上上和線下的技術社群中分享專業知識和經驗而獲得此獎項。

MVP是經過嚴格挑選的專家團隊,他們代表著技術最精湛且最具智慧的人,是對社群投入極大的熱情並樂於助人的專家。MVP致力於通過演講、論壇問答、建立網站、撰寫部落格、分享視訊、開源專案、組織會議等方式來幫助他人,並最大程度地幫助微軟技術社群使用者使用Microsoft技術。
更多詳情請登入官方網站:
https://mvp.microsoft.com/zh-cn

相關文章