Поделиться через


Приложения, ключи API и секреты Azure Key Vault

Azure Key Vault — это служба Azure, которая защищает криптографические ключи, секреты и сертификаты. Он предоставляет централизованный, безопасный и высокодоступный репозиторий для конфиденциальных данных, таких как ключи API. Одним из способов предотвращения небезопасной практики внедрения ключей API непосредственно в исходный код приложения является настройка приложения для безопасного взаимодействия с ключами API, хранящимися в Azure Key Vault.

В этой статье вы узнаете, как создать экземпляр Key Vault, добавить ключ API в качестве секрета в это хранилище ключей, а затем настроить хранилище ключей с помощью рекомендаций. Эти рекомендации включают ограничение доступа с помощью управления доступом на основе ролей (RBAC), включения мониторинга и ограничения сетевого доступа.

Создание и защита экземпляра Azure Key Vault

Azure Key Vault позволяет безопасно хранить криптографические ключи, секреты и сертификаты. Необходимо развернуть отдельные хранилища ключей для разных сред (разработки, промежуточного хранения, рабочей среды) и приложений.

Создание экземпляра группы ресурсов и хранилища ключей

Чтобы создать экземпляр хранилища ключей, можно использовать следующую команду из Azure CLI или Azure Cloud Shell:

  1. Для создания группы ресурсов используйте команду az group create:

    az group create --name myResourceGroup --location eastus
    

    При необходимости вы можете изменить расположение eastus на ближайшее к вам.

  2. Для создания хранилища ключей используйте 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.

Ограничение доступа к Key Vault с помощью RBAC

Вы можете ограничить доступ к экземпляру Azure Key Vault, чтобы только удостоверение приложения удостоверяло доступ к Azure Key Vault.

Для этого настройте роль на основе ролей контроль доступа (RBAC) с помощью команды создания назначения ролей Azure CLI:

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, используйте команду create azure CLI az monitor diagnostic-settings:

az monitor diagnostic-settings create \
    --name myDiagnosticSettings \
    --resource {key-vault-resource-id} \
    --logs '[{"category": "AuditEvent","enabled": true}]' \
    --workspace {log-analytics-workspace-id}

Эта команда создает параметр диагностики с именем myDiagnosticSettings, настраивает AuditEvent его для указанного Azure Key Vault, включает категорию журналов, которая отслеживает события безопасности и доступа и отправляет журналы в указанную рабочую область 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. Это создает частную конечную точку в виртуальной сети, позволяя приложению подключаться к Azure Key Vault без обхода общедоступного Интернета. Этот параметр является наиболее безопасным, так как трафик остается в сети, но требует создания частной конечной точки и настройки DNS.
  • "Правила брандмауэра". Параметры брандмауэра Azure Key Vault, расположенные в разделе "Сети", можно настроить со списком разрешенных диапазонов IP-адресов. Этот метод также можно использовать для разрешения доступа к существующим виртуальным сетям, но для этого требуется включить конечную точку службы для Microsoft.KeyVault в выбранной подсети.

Вы можете создать частную конечную точку с помощью команды 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 и другие конфиденциальные данные шифруются во время передачи, обеспечивая защиту от перехвата и атак с помощью злоумышленника в середине.

Взаимодействие с Azure Key Vault с помощью Python

Чтобы взаимодействовать с Azure Key Vault с помощью Python, установите библиотеку удостоверений Azure для идентификатора Microsoft Entra и библиотеку секретов Azure Key Vault:

pip install azure-identity
pip install azure-keyvault-secrets

Вы можете использовать клиентская библиотека секретов Azure Identity и Azure Key Vault для программного управления секретами:

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.

Следующие шаги