一,引言
Azure 金鑰保管庫用於儲存敏感資訊,例如連結字串,密碼,API 金鑰等。我們無法直接從Azure 金鑰庫中訪問機密!那麼我們如何才能訪問應用程式中的機密資訊?比如,在我們的實際專案中,對於資料庫連結字串或者一些加密用的Key配置在 AppSettings.json 檔案中,但是這個做的話,還是有很大的風險的,這些機密資訊都有可能會暴露出去。就拿我自己來說,我之前分享部落格內容裡面涉及到的一些機密配置,都直接放在了配置檔案中。
以此為戒啊,就算是私有的程式碼倉庫也是不行的,所以今天決定介紹一個新的 Azure 資源-----Azure Key Vault(金鑰保管庫),我們將機密資訊儲存在金鑰保管庫中,並嘗試通過.NET Console 訪問(獲取)它。
二,正文
1,註冊應用程式
轉到 portal.azure.com 登陸到我們自己的賬戶。點選 Azure Active Directory 進行註冊 “App registrations”,我們將能夠看到 “新註冊應用程式” 選項卡開啟。
Name 輸入:”Azure.KeyVault“。如下圖所示,將其選擇使用單個租戶選項,點選 ”Register“ 進行註冊操作。
接下來,我們需要給當前註冊的客戶端應用註冊 client secret(客戶端金鑰)
點選 "Manage=》Certificates & secrets"
Description 輸入:“Azure.KeyVault.ClientSecret”,過期時間選擇預設 ”In 1 year“,點選 ”Add“ 進行新增操作
接下來我們可以看到建立好的客戶端機密資訊,同時,我們點選圖中箭頭的位置,點選進行復制 機密資訊到我們工作的記事本中,稍後會用到此機密資訊。
(注意,一定要在建立好的時候複製此機密資訊,一旦我們離開此頁面,重新進入的話,我們將無法進行復制操作)
2,建立金鑰保管庫
搜尋關鍵詞 ”Key Vault“,
Resource group 選擇建立一個新的:”Web_Test_KV_RG“
Key vault name:”CNBATEBLOGWEB-KeyVault“
Region:”East Asia“
Pricing tier:”Standard“
點選 ”Review + create“ 進行建立預覽校驗。
檢驗完成後,點選 ”Create“ 進行建立
建立完成後,點選轉到該資源進行配置訪問策略,”Settings=》Access policies“,點選 ”Add Access Policy“ 建立新的訪問策略。
首先選擇配置模板 Configure from template(optional):"Secret Management"
Secret permissions(機密許可權):”Get“ (只執行獲取機密資訊)
點選 ”Nono select“ 進行先選擇服務主體,輸入 "Azure.KeyVault"進行選擇,點選 ”Select“
點選 ”Add“ 進行新增操作
點選 ”Save“,儲存一下
接下來就可以將我們應用程式專案中使用的一些機密資訊 ”生成/匯入“ 在金鑰保管庫中。點選 ”Setting=》Secrets“,點選 ”+ Generate/Import“ 我們嘗試
Upload options 選擇:”手動“
Name:”CNBATEBLOGWEB-DB-CONNECTIONSTRING“
Value 可以輸入機密資訊,我這邊輸入的是 ”SUCCESS“
可以看到 我們可以設定當前機密資訊的 "啟用日期",”到期日期“ ”是否啟用“
點選 ”Create“ 進行建立操作。
可以看到,當前的機密資訊已經建立好了。
3,通過控制檯程式碼程式獲取機密資訊
3.1 建立新的NET Core 控制檯程式,新增 KeyVault.Secrets 和 Identity Nuget 程式包
使用程式包管理器控制檯進行安裝。
Install-Package Azure.Security.KeyVault.Secrets -Version 4.1.0
Install-Package Azure.Identity -Version 1.2.3
程式碼部分
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 string vaultUri = "https://cnbateblogweb-keyvault.vault.azure.net/"; 6 7 var client = new SecretClient(vaultUri: new Uri(vaultUri), credential: new DefaultAzureCredential()); 8 9 // Create a new secret using the secret client. 10 var secretResult = client.GetSecretAsync("CNBATEBLOGWEB-DB-CONNECTIONSTRING"); 11 12 // Retrieve a secret using the secret client. 13 Console.WriteLine("azure key vault name of "+ secretResult.Result.Value.Name+ " is "+ secretResult.Result.Value.Value); 14 15 Console.ReadLine(); 16 } 17 }
注意 這裡需要配置金鑰保管庫的連結引數 vaultUri,複製圖中的連結
接下來,需要將之前在Azure上註冊的服務主體的 AZURE_CLIENT_ID(應用程式ID),AZURE_CLIENT_SECRET(客戶端密碼),AZURE_TENANT_ID(租戶ID)配置到系統的環境變數中去,或者是VS執行環境中,大家可以自行進行選擇,我這裡是直接配置在系統的環境變數中。
Azure Client ID 和 Azure Tenant ID 可以在Azure AD 註冊的應用程式中可以找到,Client Secret 就是上面建立的客戶端密碼
接下來通過配置,將這些資訊配置在系統環境變數中
接下來,我們直接執行程式碼,可以看到驗證通過,並且將機密資訊載入出來了。
OK,成功。這裡我就不在演示機密資訊的,新增,刪除等操作了,因為在剛開始在給服務主體配置訪問許可權的時候,只配置了 ”Get“ 許可權,大家可以自行在自己的環境中配置不同許可權進行操作。
*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。?????
三,結尾
ok,今天所演示的就是將一些機密資訊新增到Azure Key Vault 中,然後通過在Azure AD 中註冊應用程式,在Key Vault 中給不同的服務主體設定不同的訪問許可權,從而達到對機密進行保護的作用,在實際專案中,我們也避免掉把一些重要的機密資訊直接配置在系統的配置檔案中或者通過硬編碼的方式保留在系統中。
github:https://github.com/yunqian44/Azure.KeyVault.git
作者:Allen
版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。