Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Note
Azure ABAC für Key Vault befindet sich in der Vorschau. Einige Aspekte können sich vor der allgemeinen Verfügbarkeit ändern. Informationen zu Vorschaubedingungen finden Sie in den ergänzenden Nutzungsbedingungen.
In den meisten Fällen gewährt eine Azure-Rollenzuweisung die Berechtigungen, die Sie für Azure-Ressourcen benötigen. In einigen Fällen möchten Sie möglicherweise eine genauere Zugriffssteuerung, indem Sie eine Rollenzuweisungsbedingung hinzufügen.
In diesem Artikel wird erläutert, wie Sie die Azure CLI verwenden, um einer Key Vault-Rollenzuweisung eine Bedingung für die Azure-Attributbasierte Zugriffssteuerung (Azure ABAC) hinzuzufügen, sodass ein Prinzipal nur Geheimnisse lesen kann, deren Namen mit einem bestimmten Präfix beginnen.
Den vollständigen Satz unterstützter Aktionen und Attribute finden Sie unter "Aktionen und Attribute" für Azure Key Vault ABAC-Bedingungen (Vorschau).
Important
ABAC-Bedingungen funktionieren nur, wenn das Berechtigungsmodell des Key Vaults auf rollenbasierte Azure-Zugriffssteuerung festgelegt ist. Legacyzugriffsrichtlinien für Tresore unterstützen keine Bedingungen.
Voraussetzungen
- Informationen zu den Voraussetzungen für das Hinzufügen oder Bearbeiten von Rollenzuweisungsbedingungen finden Sie unter Voraussetzungen für Bedingungen.
- Der Ziel-Key Vault muss als Berechtigungsmodell rollenbasierte Azure-Zugriffssteuerung verwenden.
- Azure CLI lokal installiert oder Azure Cloud Shell verwenden.
Zustand
In diesem Artikel beschränken Sie den Zugriff auf Geheimnisse, deren Namen mit test-app beginnen. Wenn der Benutzer versucht, einen geheimen Schlüssel ohne das test-app Namenspräfix zu lesen, ist der Zugriff nicht zulässig.
Die Bedingung sieht folgendermaßen aus:
(
(
!(ActionMatches{'Microsoft.KeyVault/vaults/secrets/getSecret/action'})
)
OR
(
@Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'test-app'
)
)
Schritt 1: Anmelden bei Azure
Verwenden Sie az login , und folgen Sie den Anweisungen, um sich als Benutzerzugriffsadministrator oder -besitzer anzumelden.
az loginVerwenden Sie az account show , um Ihre Abonnement-ID abzurufen.
az account showInitialisieren Sie eine Variable mit Ihrer Abonnement-ID.
subscriptionId="<subscriptionId>"
Schritt 2: Erstellen eines Benutzers
Verwenden Sie az ad user create , um einen Benutzer zu erstellen oder einen vorhandenen Benutzer zu finden. In diesem Artikel wird User1 als Beispiel verwendet.
Initialisieren Sie eine Variable mit der Objekt-ID des Benutzers.
userObjectId="<userObjectId>"
Schritt 3: Einrichten des Schlüsseltresors
Note
Die Befehle in diesem Artikel verwenden bash-Syntax (variable="value" und $variable). Wenn Sie sie aus Windows PowerShell oder PowerShell 7 ausführen, verwenden Sie stattdessen die PowerShell-Variablensyntax ($variable = "value") und ignorieren Sie die Bash-Verlaufserweiterungsnotiz in Schritt 4. Die az Befehle selbst sind in beiden Shells identisch.
Verwenden Sie az keyvault create, um einen Schlüsseltresor zu erstellen, der Azure RBAC als Berechtigungsmodell verwendet.
az keyvault create --name "<keyVaultName>" --resource-group "<resourceGroup>" --location "<location>" --enable-rbac-authorization trueWeisen Sie sich eine Key Vault-Datenebenenrolle zu, damit Sie Geheimnisse erstellen können. Wenn ein Tresor Azure RBAC verwendet, gewähren Steuerebenenrollen wie Besitzer oder Mitwirkender keinen Zugriff auf geheime Werte. Ohne eine Rolle auf Datenebene schlägt
az keyvault secret setbei der Aktion(Forbidden) Caller is not authorized to perform action on resourcemit dem FehlerMicrosoft.KeyVault/vaults/secrets/setSecret/actionfehl.myObjectId=$(az ad signed-in-user show --query id -o tsv) vaultScope="/subscriptions/$subscriptionId/resourceGroups/<resourceGroup>/providers/Microsoft.KeyVault/vaults/<keyVaultName>" az role assignment create --assignee-object-id $myObjectId --assignee-principal-type User --role "Key Vault Secrets Officer" --scope $vaultScopeNote
Verwenden Sie Key Vault Secret Officer, um geheime Werte zu erstellen und zu verwalten, oder Key Vault Administrator für den vollständigen Datenebenenzugriff. Key Vault-Geheimnisbenutzer ist schreibgeschützt. Warten Sie nach dem Zuweisen einer Rolle 1 bis 5 Minuten auf die Verteilung, bevor Sie den nächsten Befehl ausführen. Ein
ForbiddenFehler unmittelbar nach der Zuweisung bedeutet in der Regel, dass die Rolle noch nicht weitergegeben wurde.Verwenden Sie az keyvault secret set , um einen geheimen Namen
test-app-secret1zu erstellen.az keyvault secret set --vault-name "<keyVaultName>" --name "test-app-secret1" --value "<secretValue>"Note
Der geheime Name ist das Ressourcenattribut, das von der Bedingung ausgewertet wird. Wählen Sie Namen aus, die das Präfix widerspiegeln, auf das Sie den Zugriff einschränken möchten.
Erstellen Sie einen zweiten geheimen Schlüssel mit dem Namen
test-db-password.az keyvault secret set --vault-name "<keyVaultName>" --name "test-db-password" --value "<secretValue>"Initialisieren Sie Variablen mit den Namen, die Sie verwendet haben.
resourceGroup="<resourceGroup>" keyVaultName="<keyVaultName>" secretNameAllowed="test-app-secret1" secretNameDenied="test-db-password"
Schritt 4: Zuweisen einer Rolle mit einer Bedingung
Initialisieren Sie die Rollenvariablen der Rolle Key Vault Secrets User.
roleDefinitionName="Key Vault Secrets User" roleDefinitionId="4633458b-17de-408a-b874-0445c86b69e6"Initialisieren Sie den Bereich für die Ressourcengruppe.
scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"Initialisieren Sie die Bedingung.
condition="((!(ActionMatches{'Microsoft.KeyVault/vaults/secrets/getSecret/action'})) OR (@Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'test-app'))"Für die Aktion
Get secreterlaubt diese Bedingung, ein Geheimnis nur dann zu lesen, wenn sein Name mittest-appbeginnt. Alle anderen Aktionen (Nicht-getSecret) bleiben unberührt.Note
Die Bedingung muss eine einzeilige Zeichenfolge sein. Mehrzeilige Bedingungen werden abgelehnt. Wenn Sie die Bedingung über mehrere Linien hinweg erstellen, vereinfachen Sie sie zuerst. Beispiel:
condition=$(echo "$condition" | tr -s ' \n' ' ')Wenn Verlaufserweiterung in Bash aktiviert ist, wird
bash: !: event not foundmöglicherweise aufgrund des Ausrufezeichens (!) in der Bedingung angezeigt. Deaktivieren Sie die Verlaufserweiterung mitset +Hund aktivieren Sie sie später mitset -Hwieder.Initialisieren Sie die Bedingungsversion und -beschreibung.
conditionVersion="2.0" description="Read access to secrets whose names start with test-app"Verwenden Sie az role assignment create, um dem Benutzer die Rolle Key Vault Secrets User mit einer Bedingung im Bereich der Ressourcengruppe zuzuweisen.
az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersionBeispielausgabe:
{ "canDelegate": null, "condition": "((!(ActionMatches{'Microsoft.KeyVault/vaults/secrets/getSecret/action'})) OR (@Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'test-app'))", "conditionVersion": "2.0", "description": "Read access to secrets whose names start with test-app", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalType": "User", "resourceGroup": "{resourceGroup}", "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/4633458b-17de-408a-b874-0445c86b69e6", "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}", "type": "Microsoft.Authorization/roleAssignments" }
Schritt 5: Testen der Bedingung
Öffnen Sie ein neues Befehlsfenster.
Verwenden Sie az login , um sich als Benutzer1 anzumelden.
az loginInitialisieren Sie die zuvor verwendeten Variablen.
keyVaultName="<keyVaultName>" secretNameAllowed="test-app-secret1" secretNameDenied="test-db-password"Verwenden Sie az keyvault secret show , um zu versuchen, den verweigerten geheimen Schlüssel zu lesen.
az keyvault secret show --vault-name $keyVaultName --name $secretNameDeniedBeispielausgabe. Beachten Sie, dass der Lesevorgang aufgrund der folgenden Bedingung fehlschlägt:
(Forbidden) Caller is not authorized to perform action on resource. If role assignments, deny assignments or role definitions changed recently, please observe propagation time. ... Code: ForbiddenByRbacLesen Sie das Geheimnis, dessen Name mit
test-appbeginnt.az keyvault secret show --vault-name $keyVaultName --name $secretNameAllowedBeispielausgabe. Beachten Sie, dass Sie das Geheimnis lesen können, weil sein Name mit
test-appbeginnt:{ "attributes": { }, "contentType": null, "id": "https://<keyVaultName>.vault.azure.net/secrets/test-app-secret1/<version>", "name": "test-app-secret1", "tags": {}, "value": "<secretValue>" }
Schritt 6: (Optional) Bearbeiten der Bedingung
Verwenden Sie im ursprünglichen Befehlsfenster az-Rollenzuweisungsliste , um die hinzugefügte Rollenzuweisung abzurufen.
az role assignment list --assignee $userObjectId --resource-group $resourceGroupErstellen Sie eine JSON-Datei mit folgendem Format, und aktualisieren Sie die Eigenschaften
conditionunddescription, um auch Geheimnisse zuzulassen, deren Namen mitapi-beginnen.{ "canDelegate": null, "condition": "((!(ActionMatches{'Microsoft.KeyVault/vaults/secrets/getSecret/action'})) OR (@Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'test-app' OR @Resource[Microsoft.KeyVault/vaults/secrets:name] StringStartsWith 'api-'))", "conditionVersion": "2.0", "description": "Read access to secrets whose names start with test-app or api-", "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}", "name": "{roleAssignmentId}", "principalId": "{userObjectId}", "principalName": "user1@contoso.com", "principalType": "User", "resourceGroup": "{resourceGroup}", "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/4633458b-17de-408a-b874-0445c86b69e6", "roleDefinitionName": "Key Vault Secrets User", "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}", "type": "Microsoft.Authorization/roleAssignments" }Verwenden Sie az Role Assignment Update , um die Bedingung zu aktualisieren.
az role assignment update --role-assignment "./path/roleassignment.json"
Schritt 7: Bereinigen der Ressourcen
Verwenden Sie " az role assignment delete ", um die Rollenzuweisung und -bedingung zu entfernen.
az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroupLöschen Sie den von Ihnen erstellten Schlüsseltresor.
Löschen Sie den von Ihnen erstellten Benutzer.