你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
应用、API 密钥和 Azure Key Vault 机密
Azure Key Vault 是一项用于保护加密密钥、机密和证书的 Azure 服务。 它为 API 密钥等敏感信息提供了一个集中、安全且高度可用的存储库。 避免将 API 密钥直接嵌入应用程序源代码这一不安全做法的一种方法是,配置应用以安全地与存储在 Azure Key Vault 中的 API 密钥进行交互。
在本文中,你将了解如何创建一个 Key Vault 实例,将 API 密钥作为机密添加到该密钥保管库,然后使用最佳做法配置该密钥保管库。 这些最佳做法包括使用基于角色的访问控制 (RBAC) 限制访问、启用监视以及限制网络访问。
创建和保护 Azure Key Vault 实例
Azure Key Vault 支持安全地存储加密密钥、机密和证书。 你应针对不同环境(开发、暂存、生产)和应用程序部署单独的密钥保管库。
创建资源组和密钥保管库实例
若要创建密钥保管库实例,可以使用 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
将
<your-unique-keyvault-name>
替换为在整个 Azure 中均唯一的名称。 通常使用个人或公司名称以及其他数字和标识符。
将 API 密钥作为机密添加到 Azure Key Vault
创建 Azure Key Vault 实例后,可以将 API 密钥作为机密添加到此 Azure Key Vault 实例。
下面使用 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 限制对 Key Vault 的访问
你可以限制对 Azure Key Vault 实例的访问,使只有应用程序的标识能够访问 Azure Key Vault。
为此,使用 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>
启用 Key Vault 记录和警报
你应在 Key Vault 实例上启用记录和警报,以此作为检测潜在可疑活动的一种方法。
要启用 Azure Key Vault 记录和警报,请使用 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 Key Vault 配置该设置,启用 AuditEvent
日志类别(该类别用于跟踪安全和访问相关事件),并将日志发送到指定的 Log Analytics 工作区以进行监视、分析和发出警报。 这样一来,你便能监视访问模式,检测未经授权的访问尝试,并针对关键安全事件配置警报(例如,有人试图在无适当权限的情况下访问机密)。
你可以运行 Azure CLI az monitor scheduled-query create 命令,在指定的 Log Analytics 工作区中监视日志,以检测对 Azure Key Vault 机密的未经授权的访问尝试。如果检测到任何匹配的未经授权的访问尝试,将触发警报:
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'"
限制对 Key Vault 的网络访问
你应该限制对 Azure Key Vault 的网络访问,使保管库仅接受来自已知网络位置的请求。 有两种常规方法可用于实现此目的:
- Azure 专用链接。 这会在你的虚拟网络内创建一个专用终结点,让你的应用程序无需遍历公共 Internet 就能连接到 Azure Key Vault。 此选项安全性最高,因为流量始终在你的网络内部传输,但需要创建一个专用终结点并配置 DNS。
- “防火墙规则”的部分中进行介绍。 你可以在“网络”下配置 Azure Key Vault 防火墙设置,并添加允许的 IP 范围列表。 你还可以使用此方法允许对现有虚拟网络的访问,但这需要你在所选子网为 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 Key Vault 对所有通信实施 HTTPS。 这可确保你的 API 密钥及其他敏感数据在传输过程中得到加密,防范窃听和中间人攻击。
使用 Python 与 Azure Key Vault 交互
若要使用 Python 与 Azure Key Vault 进行交互,请安装用于 Microsoft Entra ID 的 Azure 标识库以及 Azure Key Vault 机密库:
pip install azure-identity
pip install azure-keyvault-secrets
你可以使用 Azure Identity 和 Azure Key Vault Secrets 客户端库以编程方式管理机密:
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:此类提供与 Key Vault 中的机密交互的方法。
- get_secret():从 Key Vault 检索机密。