iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 26
0

Azure Key Vault 是可安全儲存及存取祕密的服務。

到 Azure Portal

  1. 建立資源
  2. 查詢 Key Vault
  3. 按下建立

填寫 Key Vault 的資訊

  1. Key Vault 名稱
  2. 選擇訂用帳戶
  3. 選擇資源群組
  4. 選擇位置
  5. 按下建立

以下是部署資訊

那麼這次我主要想要示範的是接續之前我 Azure Redis Cache 的那個示範,把 Redis 的金鑰交給 Key Valult 保護。

先到 Key Valult 設置我們的秘密

  1. 側欄選擇秘密
  2. 選擇產生/匯入

建立秘密

  1. 填寫祕密的名稱
  2. 填寫秘密,我這邊就是 Redis 的金鑰
  3. 這邊是設置起始日期,是選填的
  4. 按下建立

接著呢打開 Azure Cloud Shell 要下兩個指令去設置存取原則。

第一個指令是將 Azure Function 開啟 Managed Identity ,文件好像翻成受控識別。
他就會產生一組 principalId (每次指派移除後都不一樣)

az webapp identity assign --name "Azure Function 名稱" --resource-group "Azure Function 的資源群組名稱"

接著我們要下第二個指令是把剛剛 principalId 加入 Key Vault 存取規則。
後面的 --secret-permissions get list 是我允許他只有 get 跟 list 的權限。
指令下完之後,會出現一大串 json 表示完成了。

az keyvault set-policy --name 'Key Vault名稱' --object-id principalId  --secret-permissions get list

其實下完指令只後也可以到存取規則那邊看,會多一筆你剛剛下指令產生的規則。

Azure Function 中

先加入套件

Microsoft.Azure.Services.AppAuthentication
讓您輕鬆擷取 Service-to-Azure-Service 驗證案例的存取權杖。

Microsoft.Azure.KeyVault
包含與 Key Vault 互動的方法。

代碼

  1. 到我們的 RedisTrigger
  2. using 需要的命名空間
  3. Key Vault 的存取代碼
  4. 最後我們取到 RedisKey 給 Redit 的連接字串

#r "Newtonsoft.Json"

using System.Net;
using System.Net.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using StackExchange.Redis;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    string name = req.Query["name"];

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

    var azureServiceTokenProvider = new AzureServiceTokenProvider();
    var keyVaultClient = new KeyVaultClient(
            new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
    var redisKey = keyVaultClient.GetSecretAsync("https://keyvault名稱.vault.azure.net/", "秘密名稱").Result.Value;

    var connString = $"redis名稱.redis.cache.windows.net:6380,password={ redisKey },ssl=True,abortConnect=False";
    var redisConn = ConnectionMultiplexer.Connect(connString);
    var db = redisConn.GetDatabase();
    var value = db.StringGet("name");
    if(string.IsNullOrEmpty(value))
    {
        db.StringSet("name", name, TimeSpan.FromSeconds(20));
    }
    else
    {
        name = value;
    }
    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

Key Vault 加 Redis Cache 的範例:
Cache 20秒輸入進來的參數,第一次打進來的參數之後不管在怎麼打API 在 20秒內都不會改變。
(覺得這範例好爛 XDDD)


上一篇
Azure Runbook
下一篇
Azure Logic App
系列文
與 Azure 培養感情的 30 天,隨時會分手。30

尚未有邦友留言

立即登入留言