Azure 標準型或進階型的 「金鑰保險箱 (Key Vault)」

直接輸入Azure Key Vault 只看的到高級的版本:

受控 HSM (Managed HSM) 與一般的 金鑰保險箱 (Key Vault) 在 Azure 中是兩個不同的資源類型:

  1. 如果您本來就打算使用最高安全層級、完全專屬的硬體裝置: 那沒錯,就是這裡!因為您目前帳號下還沒有建立任何受控 HSM,請直接點擊畫面中央或右下角的 「藍色 + 建立」 按鈕,來建立一個全新的受控 HSM 執行個體。建立完成後,才能進入內部設定金鑰與權限。
  2. 如果您之前已經有建立過金鑰儲存資源,但在這個畫面看不到: 那代表您之前建立的是標準型或進階型的 「金鑰保險箱 (Key Vault)」,而不是受控 HSM。
    • 如何切換: 請看您截圖的最右上方,有一個長條形的「搜尋資源、服務及文件 (G+/)」 搜尋列。請直接在裡面輸入您的金鑰儲存庫名稱,或是輸入 金鑰保險箱 (Key vaults),就能找到正確的資源頁面。

要找到標準型(Standard)或進階型(Premium)的 「金鑰保險箱 (Key Vault)」,操作非常簡單。

請看您剛才搜尋畫面的同一個搜尋列,依照以下步驟輸入:

步驟一:在搜尋列輸入正確關鍵字

請在最上方的藍色搜尋列中,清除原本的字,改輸入以下其中一個關鍵字:

  • 中文:金鑰保險箱
  • 英文:Key vaults (注意:後面不要加上「受控 HSM」)

步驟二:認明正確的圖示與服務

當您輸入後,下方會出現搜尋結果。請認明以下圖示與文字:

  1. 圖示(Icon): 是一個「綠色的鑰匙,背景是一個抽屜/保險箱」的圖案(如下圖所示)。
  2. 文字: 服務名稱只會寫 「金鑰保險箱」「Key vaults」

步驟三:進入並點擊建立

  1. 點擊該「金鑰保險箱」服務進入。
  2. 進入後,點擊畫面左上角的 「+ 建立」(或 Create)。
  3. 在建立的設定畫面中,有一欄叫做「定價層 (Pricing tier)」,您就可以在該處下拉選單自由選擇:
    • 標準 (Standard): 使用軟體保護金鑰。
    • 進階 (Premium): 使用符合 FIPS 140 的 HSM(硬體安全模組)保護金鑰。

這兩者都支援您一開始提到的資料庫欄位加密(例如 Always Encrypted 的主金鑰 CMK 管理),且功能與設定介面完全一樣,您可以依預算與合規需求選擇!


在 Azure Key Vault 的語境中,「祕密 (Secrets)」「金鑰 (Keys)」是兩種完全不同的資源類型,其核心加密機制與背後使用的硬體基礎也有很大的差異。

以下為您詳細解析兩者的差異、使用時機,以及針對您要存放 Database Column AES Key(資料庫欄位加密金鑰) 該如何選擇。

一、 「祕密 (Secrets)」 vs 「金鑰 (Keys)」 的核心差異

特性祕密 (Secrets) 🔒金鑰 (Keys) 🔑
本質是什麼純文字字串(Data 內容)。長度上限為 25KB,您可以把任何文字(如密碼、連接字串、API Key)塞進去。密碼編譯金鑰(Cryptographic Key)。由特定演算法(如 RSA、EC)產生的非對稱金鑰。
運作機制當應用程式跟 Key Vault 要祕密時,Key Vault 會把明文字串直接回傳給應用程式,由應用程式自己拿去用。金鑰永遠不會離開 Key Vault(特別是 HSM 保護的金鑰)。加解密運算是在 Key Vault 內部(或 HSM 內)完成,再將結果回傳。
主要功能純粹的安全儲存與讀取(Get/List)。密碼編譯操作(Sign/Verify, Wrap/Unwrap, Encrypt/Decrypt)。
硬體防護 (HSM)僅能由軟體提供安全防護與加密。在「進階層」或「受控 HSM」中,金鑰生成與運算完全在 HSM 硬體內進行,連 Azure 系統管理員也無法導出。

二、 什麼時候用「祕密」?什麼時候用「金鑰」?

💡 使用「祕密 (Secrets)」的時機:

  • 存放資料庫連接字串(Connection String,例如:Server=tcp:sqlserver...;User ID=myadmin;Password=...)。
  • 存放第三方 API Token 或認證私鑰(如 SendGrid API Key、LINE Bot Token)。
  • 存放一般的帳號密碼。

💡 使用「金鑰 (Keys)」的時機:

  • 用於資料磁盘加密(Azure Disk Encryption)或儲存體加密(BYOK – Bring Your Own Key)。
  • 需要高規格的密碼學合規需求(如 FIPS 140 驗證)。
  • 用於保護、加密其他資料加密金鑰(如金鑰信封機制 Envelope Encryption)。

三、 結論:要存放 Database Column AES Key,該選哪一個?

針對您提到的 Database Column AES Key(對稱式加解密金鑰),選擇的關鍵取決於您的加密實作架構

方案 A:如果您使用的是資料庫內建的 Always Encrypted(始終加密)功能(強烈推薦 ⭐)

  • 請選擇 ➔ 金鑰 (Keys)
  • 原因: 在 Azure SQL / SQL Server 的 Always Encrypted 機制中,欄位是用 DEK(資料加密金鑰,一組 AES-256 金鑰) 加密的。而這把 DEK 必須由一把 CMK(主加密金鑰) 來進行保護(Wrap/Unwrap)。
  • 如何實作: 您應該在 Azure Key Vault 的 「金鑰 (Keys)」 中建立一把 RSA 金鑰作為 CMK。SQL Server 驅動程式會自動呼叫 Key Vault 的金鑰來解密 DEK,整個過程中,應用程式和工程師都碰不到最核心的主金鑰。

方案 B:如果是您自己的應用程式(程式碼)要自行實作 AES-256 加解密

  • 請選擇 ➔ 祕密 (Secrets)
  • 原因: 因為 Azure Key Vault 的「金鑰 (Keys)」目前原生只提供非對稱式金鑰(如 RSA、EC),並不直接提供純對稱式 AES 金鑰的儲存與應用程式端直接讀取。
  • 如何實作: 您在自己的電腦或程式中產生一組 AES-256 的 Key(通常是一串 Base64 編碼的字串),然後將這串字串當作文字,存入 Azure Key Vault 的 「祕密 (Secrets)」 中。當程式需要加解密欄位時,先去 Key Vault 把這個「祕密」抓回到應用程式的記憶體中,再在程式碼裡用 AES 演算法去解密資料庫欄位。

總結建議

  1. 如果可以,請採用 Azure SQL / SQL Server 的 Always Encrypted 機制,並在 Azure Key Vault 中建立 「金鑰 (Keys)」 來當作主金鑰。這是業界最標準且最安全的資料庫欄位加密做法。
  2. 如果是傳統程式碼(例如自寫的 Python/C# Encrypt class)需要一把固定密碼來做 AES 欄位加解密,請將該密碼存入 「祕密 (Secrets)」

這裡為您提供一份 Python 腳本。這個腳本會示範如何遵循資訊安全最佳實踐,產生一組安全的 AES-256 金鑰(使用加密等級的隨機亂數,而非一般隨機),並將其轉換為最適合存入 Azure Key Vault「祕密 (Secrets)」的 Base64 編碼字串

此外,腳本中也附帶了如何使用這把金鑰進行欄位加解密的範例。

事前準備

在執行腳本前,請確保您的環境已安裝 cryptography 套件(這是目前 Python 最推薦、最安全的密碼學函式庫):

Bash

pip install cryptography

Python 實作腳本

Python

import base64
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

def generate_aes_256_key_for_azure_secret():
    """
    產生一組符合 AES-256 要求(32 位元組 / 256 位元)的安全隨機金鑰,
    並將其編碼為 Base64 字串,方便複製並貼上到 Azure Key Vault 的「祕密」中。
    """
    # 1. 使用作業系統等級的安全隨機來源產生 32 bytes (256 bits) 的密鑰資料
    raw_key = os.urandom(32)
    
    # 2. 轉換為 Base64 編碼的文字字串,這樣才能以「純文字」存入 Azure Secret
    base64_encoded_key = base64.b64encode(raw_key).decode('utf-8')
    
    return base64_encoded_key


# ==========================================
# 示範:如何使用這把金鑰在程式中加解密資料庫欄位
# ==========================================
def encrypt_column_data(plain_text: str, base64_key: str) -> str:
    """使用 AES-GCM 演算法加密資料庫欄位 (安全且含完整性校驗)"""
    # 從 Base64 還原回原始的 bytes 金鑰
    key_bytes = base64.b64decode(base64_key.encode('utf-8'))
    aesgcm = AESGCM(key_bytes)
    
    # 產生一個唯一的 nonce (初始化向量),每次加密都必須不同
    nonce = os.urandom(12) 
    
    # 加密資料
    encrypted_bytes = aesgcm.encrypt(nonce, plain_text.encode('utf-8'), None)
    
    # 將 nonce 和加密後的資料組合,並轉為 Base64 方便存入資料庫的 VARCHAR 或 TEXT 欄位
    final_data = nonce + encrypted_bytes
    return base64.b64encode(final_data).decode('utf-8')


def decrypt_column_data(cipher_text: str, base64_key: str) -> str:
    """解密資料庫欄位"""
    key_bytes = base64.b64decode(base64_key.encode('utf-8'))
    aesgcm = AESGCM(key_bytes)
    
    # 還原資料庫中的密文
    raw_data = base64.b64decode(cipher_text.encode('utf-8'))
    
    # 拆分出前 12 位元組的 nonce 和後面的密文
    nonce = raw_data[:12]
    encrypted_bytes = raw_data[12:]
    
    # 解密
    decrypted_bytes = aesgcm.decrypt(nonce, encrypted_bytes, None)
    return decrypted_bytes.decode('utf-8')


# --- 執行測試 ---
if __name__ == "__main__":
    print("--- 1. 開始產生 AES-256 金鑰 ---")
    my_secret_key = generate_aes_256_key_for_azure_secret()
    
    print(f"【請複製以下這串文字,存入 Azure Key Vault 的『祕密』中】:")
    print(f"==> {my_secret_key}\n")
    
    print("--- 2. 模擬資料庫欄位加解密測試 ---")
    sensitive_data = "850101-1234567" # 假設這是敏感的身分證字號或信用卡號
    print(f"原始欄位明文: {sensitive_data}")
    
    # 加密
    encrypted_db_column = encrypt_column_data(sensitive_data, my_secret_key)
    print(f"寫入資料庫的加密密文: {encrypted_db_column}")
    
    # 解密
    decrypted_db_column = decrypt_column_data(encrypted_db_column, my_secret_key)
    print(f"從資料庫取出並解密後的明文: {decrypted_db_column}")

💡 接下來在 Azure 的實際操作流程

  1. 執行上方腳本,終端機會印出一串類似 rXg7B...=Base64 字串
  2. 登入 Azure Portal,進入您的 金鑰保險箱 (Key Vault)
  3. 在左側選單中點選 「祕密 (Secrets)」 ➔ 點擊上方的 「+ 產生/匯入」
  4. 設定參數:
    • 上傳選項: 手動
    • 名稱: 例如 DbColumnEncryptionKey
    • 祕密值: 把剛剛 Python 產生的那串 Base64 字串貼進來
  5. 點擊建立。之後您的應用程式(例如部署在 Azure App Service 或 VM 上)只要透過受控識別(Managed Identity)去撈取這個名為 DbColumnEncryptionKey 的祕密,就能直接套用在程式中的加解密邏輯了。

是的,非常正確!強烈建議將這把金鑰放入 Azure Key Vault。

如果把 AES_KEY 寫死在程式碼、或是以明文寫在伺服器上的 .env 檔案中,一旦伺服器被駭、程式碼上傳到公開的 GitHub、或是離職員工外洩,資料庫的所有加密欄位就會被全部看光。此外,伺服器硬碟損壞也可能導致 .env 檔案永久遺失。

將金鑰放入 Azure Key Vault (AKV) 可以同時解決「安全保護」「防止遺失」兩大問題。以下為您說明為什麼該放,以及最安全、最標準的架構該怎麼做:

1. 放在 Key Vault 為什麼能「防遺失」?

在 Azure Key Vault 中,您可以開啟以下兩個核心安全開關(通常在建立 Key Vault 時就預設開啟了):

  • 軟刪除 (Soft-delete): 就算有人(或您自己)不小心點到刪除金鑰,金鑰不會立刻消失,而是會進入資源回收桶,在保留期內(預設 90 天)都可以一鍵復原。
  • 清除保護 (Purge Protection): 開啟後,任何人(包括最高管理員)都無法強行永久刪除回收桶裡的金鑰,必須等到保留天數過期,這能徹底防範惡意員工報復性刪除金鑰。

2. 進階安全做法:Go 語言 Container 該如何安全讀取 Key Vault?

既然要把金鑰放進 Key Vault,您的 Container 程式就不應該在啟動時透過 .env 檔案傳入金鑰,因為那樣只是把風險轉移到 .env 檔案上。

最標準的雲端安全架構流程如下:

[Azure Container / 您的程式]
       │
       ├─ 1. 使用「受控識別 (Managed Identity)」向 Azure 證明自己是合法會程式
       │
       ├─ 2. 透過 Azure SDK 直接呼叫 Key Vault 
       ▼
[Azure Key Vault] ──(確認權限)──> 3. 將金鑰安全地回傳到 Go 程式的記憶體中

實作步驟:

步驟一:在 Go 程式中引入 Azure SDK

Go 語言有官方維護的 Azure SDK,可以讓程式直接安全地跟 Key Vault 溝通:

Bash

go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
go get github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets
步驟二:Go 程式碼範例

您的 Go 語言程式可以直接改寫成這樣,在啟動時自動去 Key Vault 抓取變數:

Go

package main

import (
	"context"
	"fmt"
	"log"
	"os"

	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets"
)

func main() {
	// 1. 設定您的 Key Vault 網址 (這可以放在環境變數中,這個網址公開也沒關係)
	vaultURL := "https://kv-pr-stg-jpe-001.vault.azure.net/"

	// 2. 使用 DefaultAzureCredential
	// 它會自動偵測環境。在本地會讀您的 Azure CLI 登入身分;在雲端會自動使用 Container 的 Managed Identity
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	if err != nil {
		log.Fatalf("無法取得憑證: %v", err)
	}

	// 3. 建立 Key Vault 祕密用戶端
	client, err := azsecrets.NewClient(vaultURL, cred, nil)
	if err != nil {
		log.Fatalf("無法建立 Key Vault 用戶端: %v", err)
	}

	// 4. 從 Key Vault 撈取您的 AES 金鑰
	secretName := "policyhub-database-column-aes-key"
	resp, err := client.GetSecret(context.TODO(), secretName, "", nil)
	if err != nil {
		log.Fatalf("撈取祕密失敗 (請檢查上一輪的 IAM 權限是否指派正確): %v", err)
	}

	// 5. 這就是您的 AES-256 金鑰(Base64 字串)
	aesKey := *resp.Value
	fmt.Printf("成功安全地下載金鑰!長度為: %d\n", len(aesKey))

	// 接下來就可以拿這把 aesKey 去做資料庫欄位加解密了...
}

總結

  1. 立刻把金鑰放到 Key Vault 的「祕密 (Secrets)」中。
  2. 確保在 Key Vault 的「存取設定」中開啟了 軟刪除清除保護
  3. 容器(Container)內不需要存任何 .env 金鑰檔案,改用 Azure SDK (DefaultAzureCredential) 讓程式在啟動時動態去 Key Vault 撈取。

這樣做,您的金鑰就絕對不會遺失,也達到了企業級的資安標準!


這裡為您提供 Python 版本的腳本。這個腳本遵循與前面相同的安全架構:

容器(Container)內完全不需要攜帶任何 .env 檔案。Python 程式在啟動時,會透過 Azure 官方 SDK 搭配 受控識別 (Managed Identity),自動且安全地向 kv-pr-stg-jpe-001 撈取金鑰並直接載入記憶體中使用。

🐍 事前準備

在您的 Dockerfile 或本地環境中,請安裝 Azure Key Vault 與身分驗證所需的官方套件:

Bash

pip install azure-identity azure-keyvault-secrets cryptography

Python 實作腳本

Python

import base64
import os
import sys
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

def fetch_aes_key_from_key_vault():
    """
    使用 Azure SDK 安全地從 Key Vault 撈取儲存的 AES-256 金鑰 (Base64 字串)
    """
    # 1. 定閱您的 Key Vault 網址 (這個網址公開在程式碼裡是安全的)
    vault_url = "https://kv-pr-stg-jpe-001.vault.azure.net/"
    
    # 2. 使用 DefaultAzureCredential 
    # 本地開發時:會自動讀取您電腦上 Azure CLI 登入的身分
    # 雲端 Container 環境:會自動使用該容器配給的 Managed Identity 身分
    credential = DefaultAzureCredential()
    
    try:
        # 3. 建立 Key Vault 祕密用戶端
        client = SecretClient(vault_url=vault_url, credential=credential)
        
        # 4. 撈取您在上一階段設定的祕密
        secret_name = "policyhub-database-column-aes-key"
        retrieved_secret = client.get_secret(secret_name)
        
        print("Successfully connected to Azure Key Vault.")
        return retrieved_secret.value

    except Exception as e:
        print(f"Error fetching secret from Key Vault: {e}", file=sys.stderr)
        print("請檢查您上一輪在 Key Vault 的 IAM 權限中,是否有正確將 'Key Vault Secrets Officer' 指派給該身分。", file=sys.stderr)
        sys.exit(1)


# ==========================================
# 密碼學核心:使用撈取到的金鑰進行加解密
# ==========================================
def encrypt_column_data(plain_text: str, base64_key: str) -> str:
    """使用 AES-GCM 演算法加密資料庫欄位"""
    # 還原原始 bytes 金鑰
    key_bytes = base64.b64decode(base64_key.encode('utf-8'))
    aesgcm = AESGCM(key_bytes)
    
    # 產生唯一的隨機 12-byte nonce
    nonce = os.urandom(12) 
    
    # 加密
    encrypted_bytes = aesgcm.encrypt(nonce, plain_text.encode('utf-8'), None)
    
    # 組合並轉為 Base64 字串以存入資料庫
    final_data = nonce + encrypted_bytes
    return base64.b64encode(final_data).decode('utf-8')


def decrypt_column_data(cipher_text: str, base64_key: str) -> str:
    """解密從資料庫取出的密文欄位"""
    key_bytes = base64.b64decode(base64_key.encode('utf-8'))
    aesgcm = AESGCM(key_bytes)
    
    # 解開資料庫的 Base64 密文
    raw_data = base64.b64decode(cipher_text.encode('utf-8'))
    
    # 拆分前 12 bytes 的 nonce 與後續密文
    nonce = raw_data[:12]
    encrypted_bytes = raw_data[12:]
    
    # 解密
    decrypted_bytes = aesgcm.decrypt(nonce, encrypted_bytes, None)
    return decrypted_bytes.decode('utf-8')


# --- 程式進入點 ---
if __name__ == "__main__":
    print("=== [1] 正在向 Azure Key Vault 請求 AES 金鑰... ===")
    # 動態從雲端撈取金鑰,不留任何痕跡在實體硬碟上
    db_aes_key = fetch_aes_key_from_key_vault()
    print(f"【成功】已將金鑰安全載入記憶體。金鑰長度為: {len(db_aes_key)} 字元\n")
    
    print("=== [2] 模擬資料庫欄位加解密測試 ===")
    sensitive_data = "policyhub-user-ssn-123456"
    print(f"原始敏感資料: {sensitive_data}")
    
    # 測試加密
    encrypted_column = encrypt_column_data(sensitive_data, db_aes_key)
    print(f"準備寫入 DB 的加密密文: {encrypted_column}")
    
    # 測試解密
    decrypted_column = decrypt_column_data(encrypted_column, db_aes_key)
    print(f"從 DB 取出並成功解密明文: {decrypted_column}")

🐳 如何在 Docker 環境中執行它?

  1. 本地測試:在您的個人電腦上,只要確保您的終端機已經執行過 az login 登入,這個 Python 腳本就能直接在本地執行,它會利用您的個人憑證去 Key Vault 撈取金鑰。
  2. 部署到 Azure Container 環境(如 App Service / Container Apps):
    • 您不需要在容器內設定環境變數 policyhub-database-column-aes-key
    • 您只需要在 Azure 控制台上,為該容器服務開啟 「受控識別 (Managed Identity)」
    • 回到 Key Vault 資源中,將 「Key Vault Secrets Officer」「Key Vault Secrets User」 的角色指派給該容器的身分。
    • 容器啟動後,官方 SDK (DefaultAzureCredential) 會自動完成所有驗證,無縫接軌!

要在您位於日本東部的金鑰保險箱 kv-pr-stg-jpe-001 設定 Container(容器)的白名單,標準的做法是透過 Azure Key Vault 的「網路安全性 (Networking)」 功能。

這樣可以確保只有來自您指定 Container 所在網路的流量才能存取這台 Key Vault,其他網際網路上的存取(即使有正確的帳號密碼或認證)都會被直接封鎖。

設定方式取決於您的 Container 是部署在 Azure 的哪種服務中。以下為您說明兩種最常見情境的設定步驟:

情境 A:您的 Container 部署在 Azure 虛擬網路 (VNet) 內

適用於:Azure Container Apps、AKS (Kubernetes)、Azure App Service (已啟用 VNet 整合) 或 Azure VM 上的 Docker。

這是最安全的作法,將 Key Vault 的存取權限制在特定的虛擬網路子網(Subnet)中:

步驟 1:前往網路設定頁面

  1. 在 Azure Portal 進入您的金鑰保險箱 kv-pr-stg-jpe-001
  2. 在左側選單中,找到「設定」分類下的 「網路功能 (Networking)」

步驟 2:切換為允許選取的網路

  1. 在「防火牆與虛擬網路」標籤頁中,將「允許自以下位置存取:」從「所有網路」改選為 「選取的網路 (Selected networks)」

步驟 3:加您的 Container 子網路加入白名單

  1. 在下方的「虛擬網路」區塊中,點擊 「+ 新增現有的虛擬網路 (Add existing virtual network)」
  2. 選擇您的 Container 所在的 訂閱虛擬網路 (VNet) 以及特定的 子網路 (Subnet)
  3. 點擊頁面最下方的 「儲存 (Save)」

情境 B:您的 Container 具有固定的公用 IP (Public IP)

適用於:您的 Container 部署在公司地端機房、其他雲端(如 AWS),或是 Azure 上帶有固定輸出的公用 IP 服務。

如果 Container 無法直接透過 Azure 內網連接,就必須透過公用 IP 防火牆白名單來管控:

步驟 1 與 2:同上

進入 kv-pr-stg-jpe-001「網路功能」 ➔ 改選為 「選取的網路」

步驟 2:填入防火牆 IP 白名單

  1. 在下方的 「防火牆 (Firewall)」 區塊中。
  2. 在「位址或位址範圍」欄位,輸入您 Container 伺服器的對外公用 IP 位址(例如:210.61.xx.xx 或以 CIDR 格式表示如 210.61.xx.xx/32)。
  3. 點擊頁面最下方的 「儲存 (Save)」

⚠️ 極度重要的資安注意事項與陷阱

  1. 不要勾選「允許受信任的 Microsoft 服務…」嗎?在網路安全性頁面的最下方,通常有一個「例外狀況」勾選框:「允許受信任的 Microsoft 服務略過此防火牆」
    • 強烈建議勾選。 如果您未來有使用 Azure 內建的備份、Azure Monitor 診斷日誌,或是其他 Azure 核心服務要存取這台 Key Vault,勾選此項可以確保這些微軟內部信任的流量不會被硬生生擋掉。
  2. 本地開發電腦會斷線:當您一旦將網路改為「選取的網路」後,您自己的電腦也會立刻無法存取這台 Key Vault 的祕密(您在 Portal 網頁上看祕密會顯示拒絕存取,本地執行 Python 測試也會報錯)。
    • 解決方法: 在設定 Container 白名單的同時,記得在「防火牆」區塊中,勾選 「新增您的目前用戶端 IP 位址」,把您當下辦公室或家里的對外 IP 也一起暫時加進白名單,這樣您才能繼續進行開發與測試。

看到您的截圖了!您的 Key Vault 目前選用的是 「Azure 角色型存取控制 (Azure RBAC)」 權限模型(畫面上藍色勾選的推薦項目)。

使用”推薦項目”似乎會一直卡關, 建議使用第二個選項 “保存庫存取原則”.

在這個畫面上,您不需要勾選任何下方的「資源存取」選項(那些是給特定虛擬機器部署或磁碟加密用的,與您的資料庫欄位加密無關)。

請直接點擊畫面中央那顆藍色的按鈕:「前往存取控制 (IAM)」,進去裡面指派角色。

以下是點擊進去後的詳細操作步驟

步驟 1:新增角色指派

進入「存取控制 (IAM)」頁面後,點擊畫面上方的 「+ 新增 (Add)」 ➔ 選擇 「新增角色指派 (Add role assignment)」

步驟 2:選擇「祕密主管」角色

在角色清單中,因為您要上傳(Set)AES 金鑰到「祕密」分類中,請搜尋並勾選以下角色:

  • Key Vault Secrets Officer(中文顯示為:金鑰保險箱祕密主管
  • (注意:不要選到 Key Vault Secrets User,因為 User 只有讀取權限,無法執行寫入/SetSecret)
  • 選好後點擊 「下一步」

步驟 3:選取您的應用程式身分 (Object ID)

  1. 在「成員 (Members)」標籤頁中,將「指派存取權給」保持為 「使用者、群組或服務主體」
  2. 點擊藍色的 「+ 選取成員 (+ Select members)」
  3. 在右側跳出的搜尋欄中,直接黏貼您之前錯誤訊息中的 Object ID:7a85725f-a661-4489-baed-944f1ff241ca
  4. 點擊下方搜尋出來的應用程式,讓它顯示在「選取的成員」列表中,然後點擊「選取」。

步驟 4:檢閱並指派

一路點擊 「下一步」 直到最後一頁,點擊 「檢閱並指派 (Review + assign)」


是的,存取 Azure Key Vault 需要花費費用。 不過別擔心,Key Vault 的計費方式非常特別,它是「以量計價」,而且價格極其便宜。對於一般中小型應用程式或資料庫欄位加解密來說,每個月的花費通常不到幾塊錢台幣(甚至不到 1 元)

當您使用剛才設定的「標準型/進階型金鑰保險箱」來存放 AES 金鑰(祕密)時,費用主要由以下兩個部分組成:

1. 交易費用(操作次數計費)—— 主要花費來源

只要您的 Python 或 Go 程式呼叫一次 SDK 去撈取、寫入金鑰,或是進行加解密,就散算一次「交易 (Operations)」。

  • 祕密作業(讀取/寫入像您的 AES Key):每 10,000 次存取,大約只要 $0.03 美元(折合台幣約 $1 元)。
  • 金鑰作業(如果您是用進階層的 RSA 金鑰,讓 HSM 幫您做運算):標準金鑰每 10,000 次約 $0.03 美元;如果是進階層的 HSM 金鑰,每 10,000 次約 $1 美元(約台幣 $32 元)。

💡 為什麼您的程式不會花大錢?(省錢關鍵技巧)

您的 Container 程式應該只有在**「啟動時」**去 Key Vault 撈取一次 AES 金鑰,並將它常駐在記憶體中。後續資料庫欄位加解密,都是在 Container 內部用記憶體裡的金鑰做運算,並不會每次解密都去跑一次 Key Vault 連線

因此,即使您的資料庫每天有幾百萬筆資料在加解密,您對 Key Vault 的存取次數可能一天也只有幾次(當容器重啟時),費用近乎為零。

2. 續存費用(放著不動的租金)

這是指您在 Key Vault 裡面建立金鑰後,每個月放在裡面的保管費。

  • 祕密 (Secrets): 儲存祕密(如您的 AES Base64 字串)是完全免費的!微軟不收儲存費,只收上面的存取次數費。
  • 金鑰 (Keys) —— 僅限進階層的 HSM 金鑰: 如果您在進階層裡建立了一把受硬體保護的 RSA 金鑰,每把金鑰每個月會收取 $1.00 美元(約台幣 $32 元)的保管費。

3. 網路流量費用 (頻寬費用)

  • 如果您的 Container 部署在 Azure 同一個區域(例如您剛剛截圖中的 japaneast 日本東部),Container 存取同區域的 Key Vault,網路流量是完全免費的
  • 如果您的 Container 在地端機房,每天無休止地拼命讀取 Azure Key Vault,才會收取微乎其微的 Azure 資料外流(Egress)費用。

💰 總結:您大約會花多少錢?

假設您使用的是標準型金鑰保險箱,並將 AES 金鑰存放在「祕密」中:

  • 金鑰租金: $0 元(祕密免租金)。
  • 存取費用: 假設您的容器因為自動擴展、更新,一個月重啟並存取了 Key Vault 1,000 次。
  • 每月總帳單: $0.003 美元(不到台幣 0.1 元)。

因此,把金鑰放進 Key Vault 換取極高的安全性與防遺失保護,是非常划算且必須的投資!

發佈留言

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