# Az - Key Vault
{{#include ../../../banners/hacktricks-training.md}}
## Grundinformationen
**Azure Key Vault** ist ein Cloud-Dienst von Microsoft Azure zum sicheren Speichern und Verwalten sensibler Informationen wie **Geheimnisse, Schlüssel, Zertifikate und Passwörter**. Es fungiert als zentrales Repository, das sicheren Zugriff und feingranulare Kontrolle über Azure Active Directory (Azure AD) bietet. Aus sicherheitstechnischer Sicht bietet Key Vault **Schutz durch Hardware-Sicherheitsmodule (HSM)** für kryptografische Schlüssel, stellt sicher, dass Geheimnisse sowohl im Ruhezustand als auch während der Übertragung verschlüsselt sind, und bietet robustes Zugriffsmanagement durch **rollenbasierte Zugriffskontrolle (RBAC)** und Richtlinien. Es verfügt auch über **Audit-Logging**, eine Integration mit Azure Monitor zur Verfolgung des Zugriffs und automatisierte Schlüsselrotation zur Reduzierung des Risikos durch längere Schlüsselexposition.
Siehe [Azure Key Vault REST API-Übersicht](https://learn.microsoft.com/en-us/azure/key-vault/general/about-keys-secrets-certificates) für vollständige Details.
Laut den [**Docs**](https://learn.microsoft.com/en-us/azure/key-vault/general/basic-concepts) unterstützen Tresore das Speichern von Software- und HSM-gestützten Schlüsseln, Geheimnissen und Zertifikaten. Verwaltete HSM-Pools unterstützen nur HSM-gestützte Schlüssel.
Das **URL-Format** für **Tresore** ist `https://{vault-name}.vault.azure.net/{object-type}/{object-name}/{object-version}` und für verwaltete HSM-Pools ist es: `https://{hsm-name}.managedhsm.azure.net/{object-type}/{object-name}/{object-version}`
Wo:
- `vault-name` ist der global **eindeutige** Name des Key Vault
- `object-type` kann "keys", "secrets" oder "certificates" sein
- `object-name` ist der **eindeutige** Name des Objekts innerhalb des Key Vault
- `object-version` wird systemgeneriert und optional verwendet, um eine **eindeutige Version eines Objekts** anzusprechen.
Um auf die im Tresor gespeicherten Geheimnisse zuzugreifen, ist es möglich, zwischen 2 Berechtigungsmodellen bei der Erstellung des Tresors zu wählen:
- **Zugriffsrichtlinie für den Tresor**
- **Azure RBAC** (am häufigsten und empfohlen)
- Sie finden alle unterstützten granularen Berechtigungen unter [https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/security#microsoftkeyvault](https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/security#microsoftkeyvault)
### Zugriffskontrolle
Der Zugriff auf eine Key Vault-Ressource wird durch zwei Ebenen gesteuert:
- Die **Management-Ebene**, deren Ziel [management.azure.com](http://management.azure.com/) ist.
- Sie wird verwendet, um den Key Vault und **Zugriffsrichtlinien** zu verwalten. Nur die rollenbasierte Zugriffskontrolle von Azure (**RBAC**) wird unterstützt.
- Die **Datenebene**, deren Ziel **`.vault.azure.com`** ist.
- Sie wird verwendet, um die **Daten** (Schlüssel, Geheimnisse und Zertifikate) **im Key Vault** zu verwalten und darauf zuzugreifen. Dies unterstützt **Zugriffsrichtlinien für den Tresor** oder Azure **RBAC**.
Eine Rolle wie **Contributor**, die Berechtigungen in der Management-Ebene hat, um Zugriffsrichtlinien zu verwalten, kann auf die Geheimnisse zugreifen, indem sie die Zugriffsrichtlinien ändert.
### Key Vault RBAC Eingebaute Rollen
### Netzwerkzugang
In Azure Key Vault können **Firewall**-Regeln eingerichtet werden, um **Datenebenenoperationen nur von bestimmten virtuellen Netzwerken oder IPv4-Adressbereichen zuzulassen**. Diese Einschränkung wirkt sich auch auf den Zugriff über das Azure-Verwaltungsportal aus; Benutzer können keine Schlüssel, Geheimnisse oder Zertifikate in einem Key Vault auflisten, wenn ihre Anmelde-IP-Adresse nicht im autorisierten Bereich liegt.
Zur Analyse und Verwaltung dieser Einstellungen können Sie die **Azure CLI** verwenden:
```bash
az keyvault show --name name-vault --query networkAcls
```
Der vorherige Befehl zeigt die **Firewall-Einstellungen von `name-vault`** an, einschließlich aktivierter IP-Bereiche und Richtlinien für abgelehnten Datenverkehr.
Darüber hinaus ist es möglich, einen **privaten Endpunkt** zu erstellen, um eine private Verbindung zu einem Tresor zu ermöglichen.
### Löschschutz
Wenn ein Schlüssel-Tresor erstellt wird, beträgt die Mindestanzahl an Tagen, die für die Löschung zulässig sind, 7. Das bedeutet, dass, wann immer Sie versuchen, diesen Schlüssel-Tresor zu löschen, **mindestens 7 Tage benötigt werden, um gelöscht zu werden**.
Es ist jedoch möglich, einen Tresor mit **deaktiviertem Löschschutz** zu erstellen, der es ermöglicht, Schlüssel-Tresore und Objekte während der Aufbewahrungsfrist zu löschen. Sobald dieser Schutz jedoch für einen Tresor aktiviert ist, kann er nicht mehr deaktiviert werden.
## Enumeration
{{#tabs }}
{{#tab name="az" }}
```bash
# List all Key Vaults in the subscription
az keyvault list
# List Key Vaults in a specific Resource Group
az keyvault list --resource-group
az keyvault list --query '[].{name:name}' -o tsv # Get just the names
# Show details of a specific Key Vault
az keyvault show --name # If accessPolicies, you can see them here
# List all keys in a Key Vault
az keyvault key list --vault-name
# List all secrets in a Key Vault
az keyvault secret list --vault-name
# Get versions of a secret
az keyvault secret list-versions --vault-name --name
# List all certificates in a Key Vault
az keyvault certificate list --vault-name
# List all deleted Key Vaults in the subscription
az keyvault list-deleted
# Get properties of a deleted Key Vault
az keyvault show-deleted --name
# Get assigned roles
az role assignment list --include-inherited --scope "/subscriptions//resourceGroups//providers/Microsoft.KeyVault/vaults/"
# Get secret value
az keyvault secret show --vault-name --name
# Get old versions secret value
az keyvault secret show --id https://.vault.azure.net/secrets//
# List deleted key vaults
az keyvault secret list-deleted --vault-name
```
{{#endtab }}
{{#tab name="Az Powershell" }}
```bash
# Get keyvault token
curl "$IDENTITY_ENDPOINT?resource=https://vault.azure.net&api-version=2017-09-01" -H secret:$IDENTITY_HEADER
# Connect with PS AzureAD
## $token from management API
Connect-AzAccount -AccessToken $token -AccountId 1937ea5938eb-10eb-a365-10abede52387 -KeyVaultAccessToken $keyvaulttoken
# Get details of a specific Key Vault
Get-AzKeyVault -VaultName
# List all keys in a Key Vault
Get-AzKeyVaultKey -VaultName
# List all secrets in a Key Vault
Get-AzKeyVaultSecret -VaultName
# List all certificates in a Key Vault
Get-AzKeyVaultCertificate -VaultName
# List all deleted Key Vaults in the subscription
Get-AzKeyVault -InRemovedState
# Get properties of a deleted Key Vault
Get-AzKeyVault -VaultName -InRemovedState
# Get secret values
Get-AzKeyVaultSecret -VaultName -Name -AsPlainText
```
{{#endtab }}
{{#tab name="az script" }}
```bash
#!/bin/bash
# Dump all keyvaults from the subscription
# Define Azure subscription ID
AZ_SUBSCRIPTION_ID="your-subscription-id"
# Specify the filename for output
CSV_OUTPUT="vault-names-list.csv"
# Login to Azure account
az login
# Select the desired subscription
az account set --subscription $AZ_SUBSCRIPTION_ID
# Retrieve all resource groups within the subscription
AZ_RESOURCE_GROUPS=$(az group list --query "[].name" -o tsv)
# Initialize the CSV file with headers
echo "Vault Name,Associated Resource Group" > $CSV_OUTPUT
# Iterate over each resource group
for GROUP in $AZ_RESOURCE_GROUPS
do
# Fetch key vaults within the current resource group
VAULT_LIST=$(az keyvault list --resource-group $GROUP --query "[].name" -o tsv)
# Process each key vault
for VAULT in $VAULT_LIST
do
# Extract the key vault's name
VAULT_NAME=$(az keyvault show --name $VAULT --resource-group $GROUP --query "name" -o tsv)
# Append the key vault name and its resource group to the file
echo "$VAULT_NAME,$GROUP" >> $CSV_OUTPUT
done
done
```
{{#endtab }}
{{#endtabs }}
## Privilegienerhöhung
{{#ref}}
../az-privilege-escalation/az-key-vault-privesc.md
{{#endref}}
## Nach der Ausnutzung
{{#ref}}
../az-post-exploitation/az-key-vault-post-exploitation.md
{{#endref}}
{{#include ../../../banners/hacktricks-training.md}}