應用程式、API 金鑰和 Azure 金鑰保存庫 秘密
Azure 金鑰保存庫 是保護密碼編譯密鑰、秘密和憑證的 Azure 服務。 它針對 API 金鑰等敏感性資訊,提供集中式、安全且高可用性的存放庫。 避免直接在應用程式原始碼中內嵌 API 金鑰不安全的做法之一,就是將應用程式設定為安全地與儲存在 Azure 金鑰保存庫 中的 API 密鑰互動。
在本文中,您將瞭解如何建立 金鑰保存庫 實例、將 API 金鑰新增為此金鑰保存庫的秘密,然後使用最佳做法設定金鑰保存庫。 這些最佳做法包括使用角色型訪問控制(RBAC)、啟用監視和限制網路存取。
建立和保護 Azure 金鑰保存庫 實例
Azure 金鑰保存庫 可讓您安全地儲存密碼編譯密鑰、秘密和憑證。 您應該為不同的環境部署個別的金鑰保存庫(開發、預備、生產環境)和應用程式。
建立資源群組和金鑰保存庫實例
若要建立密鑰保存庫實例,您可以從 Azure CLI 或 Azure Cloud Shell 使用下列命令:
請使用
az group create
命令以建立資源群組:az group create --name myResourceGroup --location eastus
您也可以將 "eastus" 變更為更接近您的位置。
使用
az keyvault create
建立金鑰保存庫:az keyvault create --name <your-unique-keyvault-name> --resource-group myResourceGroup
以 Azure 中的唯一名稱取代
<your-unique-keyvault-name>
。 您通常會使用個人或公司名稱,以及其他數字和識別碼。
將 API 金鑰新增至 Azure 金鑰保存庫 作為秘密
建立 Azure 金鑰保存庫 實體之後,您可以將 API 金鑰新增為此 Azure 金鑰保存庫 實例的秘密。
下列使用 Azure CLI az keyvault secret set 命令,將名為 MyApiKey 的秘密新增至 keyvault,並將秘密設定為在 180 天后到期:
az keyvault secret set \
--vault-name "<YourKeyVaultName>" \
--name "MyApiKey" \
--value "<YourSecretValue>"
--expires "$(date -u -d '+180 days' +'%Y-%m-%dT%H:%M:%SZ')"
您應該的目標是定期輪替 API 金鑰。 視組織的安全性需求而定,您可以選擇比每 180 天輪替密鑰的頻率更高或更少。 您可以將 「SecretNearExpiry」 事件的事件方格訂用帳戶設定為接收有關過期 API 金鑰秘密之通知的方法。
使用 RBAC 限制對 金鑰保存庫 的存取
您可以限制對 Azure 金鑰保存庫 實例的存取,讓只有應用程式的身分識別可以存取 Azure 金鑰保存庫。
若要使用 Azure CLI az role assignment create 命令來設定角色型 存取控制 (RBAC) 角色:
az role assignment create --role "Key Vault Secrets User" \
--assignee <object-id-of-app-or-user> \
--scope /subscriptions/<subscription-id>/resourcegroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<key-vault-name>
啟用 金鑰保存庫 記錄和警示
您應該在 金鑰保存庫 實例上啟用記錄和警示,做為偵測潛在可疑活動的方法。
若要啟用 Azure 金鑰保存庫 記錄和警示,請使用 Azure CLI az monitor diagnostic-settings create 命令:
az monitor diagnostic-settings create \
--name myDiagnosticSettings \
--resource {key-vault-resource-id} \
--logs '[{"category": "AuditEvent","enabled": true}]' \
--workspace {log-analytics-workspace-id}
此命令會建立名為 myDiagnosticSettings
的診斷設定,將它設定為指定的 Azure 金鑰保存庫、啟用AuditEvent
記錄類別,以追蹤安全性和存取相關事件,並將記錄傳送至指定的 Log Analytics 工作區以進行監視、分析和警示。 這可讓您監視存取模式、偵測未經授權的存取嘗試,以及設定重大安全性事件的警示(例如,有人嘗試在沒有適當許可權的情況下存取秘密)。
您可以執行 Azure CLI az monitor scheduled-query create 命令來監視指定 Log Analytics 工作區中的記錄,以嘗試未經授權存取 Azure 金鑰保存庫 秘密,並在偵測到任何相符的未經授權存取嘗試時觸發警示:
az monitor scheduled-query create \
--name "Suspicious Access Alert" \
--resource-group myResourceGroup \
--scopes {log-analytics-workspace-resource-id} \
--condition "AzureDiagnostics | where ResourceType == 'VAULTS' | where OperationName == 'SecretGet' | where ResultSignature == 'Unauthorized'"
限制網路存取 金鑰保存庫
您應該限制對 Azure 金鑰保存庫 的網路存取,讓保存庫只接受來自已知網路位置的要求。 有兩種一般方法可用來執行這項作:
- Azure Private Link。 這會在虛擬網路內建立私人端點,讓您的應用程式不需要周遊公用因特網,即可聯機到 Azure 金鑰保存庫。 此選項最安全,因為流量會保留在您的網路內,但需要建立私人端點並設定 DNS。
- 防火牆規則。 您可以使用允許的IP範圍清單,設定位於 [網络] 底下的 Azure 金鑰保存庫 防火牆設定。 您也可以使用此方法來允許存取現有的虛擬網路,但這需要您在選取的子網上啟用 Microsoft.KeyVault 的服務端點。
您可以使用 Azure CLI az network private-endpoint create 命令來建立私人端點:
az network private-endpoint create \
--name myPrivateEndpoint \
--resource-group myResourceGroup \
--vnet-name myVNet \
--subnet mySubnet \
--private-connection-resource-id /subscriptions/{subscription}/resourceGroups/{rg}/providers/Microsoft.KeyVault/vaults/{key-vault-name} \
--group-id vault \
--connection-name myConnection
You can create firewall rules on the Azure Key Vault instance using the Azure CLI [az keyvault network-rule add](/cli/azure/keyvault/network-rule#az-keyvault-network-rule-add) command, substituting the appropriate key vault names, resource groups, subnet, and subnet mask information:
```azurecli
az keyvault network-rule add \
--name {key-vault-name} \
--resource-group myResourceGroup \
--ip-address {trusted-ip-address}/32
Azure 金鑰保存庫 會針對所有通訊強制執行 HTTPS。 這可確保您的 API 金鑰和其他敏感數據會在傳輸中加密,防止它們遭到竊聽和中間人攻擊。
使用 Python 與 Azure 金鑰保存庫 互動
若要使用 Python 與 Azure 金鑰保存庫 互動,請安裝適用於 Microsoft Entra ID 和 Azure 金鑰保存庫 秘密連結庫的 Azure 身分識別庫:
pip install azure-identity
pip install azure-keyvault-secrets
您可以使用 Azure 身分識別和 Azure 金鑰保存庫 秘密客戶端連結庫,以程式設計方式管理秘密:
from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential
key_vault_name = "<your-key-vault-name>"
KVUri = f"https://{key_vault_name}.vault.azure.net"
secret_name = "<your-secret-name>"
credential = DefaultAzureCredential()
client = SecretClient(vault_url=KVUri, credential=credential)
retrieved_secret = client.get_secret(secret_name)
# Now you can use the API key:
api_key = retrieved_secret.value
print(f"The API key is: {api_key}")
在這裡範例程式代碼中:
- DefaultAzureCredential:此類別會嘗試使用各種方法進行驗證(環境變數、受控識別等),使其適用於不同的 Azure 環境。
- SecretClient:這個類別提供在 金鑰保存庫 中與秘密互動的方法。
- get_secret(): 從 金鑰保存庫 擷取秘密。