使用Azure Logic app定時更換Azure Openai的金鑰

在雲端應用程式開發中,API 金鑰的安全性是至關重要的一環。寫死在程式碼或設定檔中的金鑰,不僅管理不易,更隱藏著外洩的風險。為了遵循最佳安全實踐,我們應該定期輪換 (Rotate) API 金鑰。然而,手動輪換不僅耗時,也容易因人為疏忽而產生漏洞。

本篇文章將詳細介紹如何利用 Azure Logic Apps 這項強大的自動化服務,打造一個無需人工介入、定時自動輪換 Azure OpenAI 金鑰的解決方案。這不僅能大幅提升您服務的安全性,更能將您從繁瑣的手動操作中解放出來。

我們的目標是建立一個 Logic App,它會依據我們設定的排程(例如每天一次),自動呼叫 Azure Resource Manager (ARM) 的 API 來為指定的 Azure OpenAI 服務產生新的金鑰。接著,它會解析 API 回傳的結果,取得新的金鑰,並可將其安全地儲存到如 Azure Key Vault 等服務中,供應用程式動態讀取。

整個過程中最關鍵的一步,是授權 Logic App 擁有足夠的權限來管理 Azure OpenAI 資源。我們將採用 Azure 推薦的最佳實踐——受控識別 (Managed Identity) 來實現安全、無密碼的驗證。

整體的流程:
建立 Logic App:
在 Azure Portal 中,建立一個新的 Logic App (Consumption) 資源。Consumption Plan (耗用量方案) 對於這種輕量級的定時任務來說,成本效益最高。
並設定一個每 24 小時觸發一次的排程。
通過有權限的操作去和Azure OpenAI 資源互動,理論有兩個方式
一、啟用受控識別 (Managed Identity):賦予 Logic App 權限,讓它有權限去管理您的 Azure OpenAI 資源,在訂閱層或者是資源群組層授予這個受控識別Cognitive Services Contributor (認知服務參與者),使用 HTTP 動作來呼叫 ARM 的 REST API,以執行重置金鑰的命令。
這個的優勢是受控識別可以長期有效,限制是Logic App和openai 資源在同一個組用戶裏面

二、使用Entra ID應用程式,在要管理Azure OpenAI 資源所在的租用戶建立一個應用程式,在訂閱層或者是資源群組層授予這個應用程式Cognitive Services Contributor (認知服務參與者)權限,使用 HTTP 動作來呼叫 ARM 的 REST API,以執行重置金鑰的命令。
這個的優勢是可以跨組用戶管理,限制是應用程式的密碼預設最久是2年有效,雖然可以用指令建立長期的,但通過portal上最久是2年,需要定期更新密碼。

重置金鑰後,可以將這個新金鑰儲存到 Azure Key Vault 中,以便其他應用程式可以安全地讀取。當然也可以根據使用者的需要比如將KEY從Logic app中直接寫入到SQL database或者Mysql等資料庫當中。

Logic App 建立後,在左側選單的「設定」區塊中找到「身分識別」(Identity)。在此頁面,將「系統指派」(System assigned) 的狀態切換為「開啟」(On),然後點擊「儲存」。

專業說明:啟用受控識別後,Azure 會在 Entra ID (原 Azure AD) 中為這個 Logic App 建立一個對應的服務主體 (Service Principal)。我們可以把這個身分想像成是 Logic App 在 Azure 世界中的「身分證」,讓它能以自己的名義去存取其他受保護的 Azure 資源,而無需我們手動管理任何密碼或憑證。


點擊「是」


點擊「Azure角色指派」,根據需要選擇範圍,在角色列表中,搜尋並選擇「認知服務參與者 (Cognitive Services Contributor)」。這個角色提供了管理認知服務(包含 OpenAI)的完整權限,其中就包括了重新產生金鑰的能力。
https://learn.microsoft.com/zh-tw/azure/role-based-access-control/built-in-roles/ai-machine-learning#cognitive-services-contributor


指派完畢後,此時logica app就有權限去更換範圍的認知服務的KEY
然後開始編寫程式,新增觸發程式,比如1天運行一次





設定好排程後,點擊下面的加號,新增動作,開始重置KEY的動作

選擇HTTP



接下來要用POST的方式,

這是最核心的步驟。我們將使用 HTTP 動作來呼叫 Azure Resource Manager 的 API 來執行 regenerateKey 操作。

方法 (Method): POST

URI: 這裡需要填入一個特定格式的 URL。要找到這個 URL,最簡單的方法是:

手動在 Azure Portal 的 OpenAI 服務頁面點擊一次「重新產生金鑰」。

在瀏覽器中按下 F12 打開開發人員工具,切換到「網路 (Network)」分頁。

找到名稱包含 regenerateKey 的請求,從中複製完整的 Request URL。
它看起來會像這樣:https://management.azure.com/subscriptions/{您的訂閱ID}/resourceGroups/{您的資源群組名稱}/providers/Microsoft.CognitiveServices/accounts/{您的OpenAI服務名稱}/regenerateKey?api-version=2023-05-01


本文 (Body): 同樣地,從開發人員工具的網路請求中,找到 Payload 或 Request Body,並將其複製過來。它會是一個 JSON 物件,指定要重設哪一把金鑰(key1 或 key2)。

也可以看到回應

在URL中貼上portal中複製到的連接,POST類型,body里也填寫瀏覽器中複製的,底部的進階參數中的驗證要勾選


這裏也可以用AAD程式驗證,但因爲我們是使用受控識別。

驗證 (Authentication):

點擊「新增參數」並勾選「驗證」。

驗證類型:選擇「受控識別 (Managed Identity)」。

對象 (Audience):填入 https://management.azure.com/。這是在告訴 Azure,我們的 Logic App 想要取得一個用來存取 ARM API 的權杖 (Token)。

解析 API 回應 (Parse JSON):
成功呼叫 API 後,它會回傳一個包含新金鑰的 JSON 物件。我們需要使用「剖析 JSON (Parse JSON)」動作來提取這個新金鑰。

內容 (Content): 選擇前面 HTTP 步驟的「本文 (Body)」。

結構描述 (Schema): 點擊「使用範例承載產生結構描述」,然後貼上一次成功手動操作時,API 回應的 JSON 內容。這會讓 Logic App 了解回應的資料結構。


這裏點擊閃電的符號,也就是數據是從前面的步驟產生的

這裏選擇http返回的Body資料

json的格式可以填寫



這個時候可以看到body key2就是我們要的資料了。

但如果需要單獨放到一個變量里也是可以的,我們可以新增動作,建立一個變數


選擇「初始化變數」Initialize variables

其值點擊閃電,是從前面的步驟來的

選擇body key2

這個時候,運行logic app後,body key2就是有效的key,而腳本並不會去更改key1的內容,如果需要,可以修改提交post裏面的body內容。
後續可以根據自己的需要看如何使用這個key

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料