Applications, clés API et secrets Azure Key Vault
Azure Key Vault est un service Azure qui protège les clés de chiffrement, les secrets et les certificats. Il met à disposition un référentiel centralisé, sécurisé et hautement disponible pour les informations sensibles telles que les clés API. L’une des méthodes permettant d’éviter la pratique risquée qui consiste à incorporer des clés API directement dans le code source de votre application est de configurer celle-ci de sorte qu’elle interagisse en toute sécurité avec les clés API stockées dans Azure Key Vault.
Dans cet article, vous allez apprendre à créer une instance Key Vault, à ajouter une clé API en tant que secret à ce coffre de clés, puis à configurer le coffre de clés en suivant les meilleures pratiques. Ces meilleures pratiques incluent la restriction de l’accès à l’aide du contrôle d’accès en fonction du rôle (RBAC), l’activation de la surveillance et la restriction de l’accès réseau.
Création et sécurisation d’une instance Azure Key Vault
Azure Key Vault vous permet de stocker en toute sécurité les clés de chiffrement, les secrets et les certificats. Vous devez déployer des coffres de clés distincts pour différents environnements (développement, préproduction, production) et différentes applications.
Créer un groupe de ressources et une instance de coffre de clés
Pour créer une instance de coffre de clés, vous pouvez utiliser la commande suivante depuis l’interface Azure CLI ou Azure Cloud Shell :
Utilisez la commande
az group create
pour créer un groupe de ressources :az group create --name myResourceGroup --location eastus
Si vous préférez, vous pouvez remplacer « eastus » par un emplacement plus proche de vous.
Utilisez
az keyvault create
pour créer le coffre de clés :az keyvault create --name <your-unique-keyvault-name> --resource-group myResourceGroup
Remplacez
<your-unique-keyvault-name>
par un nom unique à l’échelle d’Azure. La pratique courante consiste à utiliser son nom ou le nom de son entreprise et à ajouter des chiffres ou des identificateurs.
Ajouter une clé API à Azure Key Vault en tant que secret
Une fois que vous avez créé l’instance Azure Key Vault, vous pouvez ajouter une clé API en tant que secret à cette instance Azure Key Vault.
Dans l’exemple suivant, la commande Azure CLI az keyvault secret set est utilisée pour ajouter un secret nommé MyApiKey au coffre de clés et définir son délai d’expiration à 180 jours :
az keyvault secret set \
--vault-name "<YourKeyVaultName>" \
--name "MyApiKey" \
--value "<YourSecretValue>"
--expires "$(date -u -d '+180 days' +'%Y-%m-%dT%H:%M:%SZ')"
Vous avez tout intérêt à procéder à une rotation régulière de vos clés API. Selon les besoins de sécurité de votre organisation, vous pouvez opter pour une fréquence de rotation des clés supérieure ou inférieure à 180 jours. Vous pouvez configurer un abonnement Event Grid pour l’événement « SecretNearExpiry » en tant que méthode de réception de notification concernant les secrets de clé API en passe d’expirer.
Restreindre l’accès à l’instance Key Vault à l’aide de RBAC
Vous pouvez restreindre l’accès à l’instance Azure Key Vault de sorte que seule l’identité de l’application ait accès à Azure Key Vault.
Pour ce faire, configurez un rôle de contrôle d’accès en fonction du rôle (RBAC) à l’aide de la commande Azure CLI az role assignment create :
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>
Activer la journalisation et les alertes Key Vault
Vous devez activer la journalisation et les alertes sur votre instance Key Vault en guise de méthode de détection des activités potentiellement suspectes.
Pour activer la journalisation et les alertes Azure Key Vault, utilisez la commande 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}
Cette commande crée un paramètre de diagnostic nommé myDiagnosticSettings
, le configure pour l’instance Azure Key Vault spécifiée, active la catégorie de journal AuditEvent
, qui suit les événements liés à la sécurité et aux accès et envoie les journaux à l’espace de travail Log Analytics spécifié à des fins de surveillance, d’analyse et d’alerte. Cela vous permet de surveiller les modèles d’accès, de détecter les tentatives d’accès non autorisées et de configurer des alertes pour les événements de sécurité critiques (par exemple, une personne qui tenterait d’accéder à un secret sans les autorisations appropriées).
Vous pouvez exécuter la commande Azure CLI az monitor scheduled-query create pour surveiller les journaux dans l’espace de travail Log Analytics spécifié pour les tentatives d’accès non autorisées aux secrets Azure Key Vault et déclencher une alerte si une tentative d’accès non autorisée correspondante est détectée :
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'"
Restreindre l’accès réseau à Key Vault
Vous avez tout intérêt à restreindre l’accès réseau à Azure Key Vault de telle sorte que le coffre n’accepte que les demandes provenant d’emplacements réseau connus. Pour ce faire, il existe deux méthodes générales :
- Azure Private Link. Ce service crée un point de terminaison privé au sein de votre réseau virtuel, ce qui permet à votre application de se connecter à Azure Key Vault sans passer par l’Internet public. Si cette option s’avère la plus sûre (le trafic reste à l’intérieur de votre réseau), elle nécessite cependant de créer un point de terminaison privé et de configurer DNS.
- Règles de pare-feu. Vous pouvez configurer les paramètres de pare-feu Azure Key Vault, situés sous Réseaux, avec une liste de plages d’adresses IP autorisées. Vous pouvez également utiliser cette méthode pour autoriser l’accès aux réseaux virtuels existants, mais cela nécessite d’activer un point de terminaison de service pour Microsoft.KeyVault sur le sous-réseau sélectionné.
Vous pouvez créer un point de terminaison privé à l’aide de la commande 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 met en œuvre HTTPS pour toutes les communications. Vos clés API et autres données sensibles sont ainsi assurées d’être chiffrées en transit, ce qui les protège contre les écoutes et les attaques d’intercepteurs.
Interagir avec Azure Key Vault en utilisant Python
Pour interagir avec Azure Key Vault en utilisant Python, installez la bibliothèque d’identités Azure pour Microsoft Entra ID et la bibliothèque de secrets Azure Key Vault :
pip install azure-identity
pip install azure-keyvault-secrets
Vous pouvez utiliser la bibliothèque de client Azure Identity et Azure Key Vault Secrets pour gérer les secrets par programmation :
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}")
Dans cet exemple de code :
- DefaultAzureCredential : cette classe tente de s’authentifier au moyen de différentes méthodes (variables d’environnement, identités managées, etc.). De ce fait, elle est adaptée à différents environnements Azure.
- SecretClient : cette classe propose des méthodes permettant d’interagir avec des secrets dans Key Vault.
- get_secret() : récupère le secret à partir de Key Vault.