Rollenzuweisungsbedingungen für Key Vault-Geheimnisse mithilfe der Azure CLI (Vorschau) hinzufügen

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

  1. Verwenden Sie az login , und folgen Sie den Anweisungen, um sich als Benutzerzugriffsadministrator oder -besitzer anzumelden.

    az login
    
  2. Verwenden Sie az account show , um Ihre Abonnement-ID abzurufen.

    az account show
    
  3. Initialisieren Sie eine Variable mit Ihrer Abonnement-ID.

    subscriptionId="<subscriptionId>"
    

Schritt 2: Erstellen eines Benutzers

  1. 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.

  2. 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.

  1. 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 true
    
  2. Weisen 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 set bei der Aktion (Forbidden) Caller is not authorized to perform action on resource mit dem Fehler Microsoft.KeyVault/vaults/secrets/setSecret/action fehl.

    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 $vaultScope
    

    Note

    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 Forbidden Fehler unmittelbar nach der Zuweisung bedeutet in der Regel, dass die Rolle noch nicht weitergegeben wurde.

  3. 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.

  4. 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>"
    
  5. 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

  1. Initialisieren Sie die Rollenvariablen der Rolle Key Vault Secrets User.

    roleDefinitionName="Key Vault Secrets User"
    roleDefinitionId="4633458b-17de-408a-b874-0445c86b69e6"
    
  2. Initialisieren Sie den Bereich für die Ressourcengruppe.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. 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 secret erlaubt diese Bedingung, ein Geheimnis nur dann zu lesen, wenn sein Name mit test-app beginnt. 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 found möglicherweise aufgrund des Ausrufezeichens (!) in der Bedingung angezeigt. Deaktivieren Sie die Verlaufserweiterung mit set +H und aktivieren Sie sie später mit set -H wieder.

  4. Initialisieren Sie die Bedingungsversion und -beschreibung.

    conditionVersion="2.0"
    description="Read access to secrets whose names start with test-app"
    
  5. 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 $conditionVersion
    

    Beispielausgabe:

    {
      "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

  1. Öffnen Sie ein neues Befehlsfenster.

  2. Verwenden Sie az login , um sich als Benutzer1 anzumelden.

    az login
    
  3. Initialisieren Sie die zuvor verwendeten Variablen.

    keyVaultName="<keyVaultName>"
    secretNameAllowed="test-app-secret1"
    secretNameDenied="test-db-password"
    
  4. Verwenden Sie az keyvault secret show , um zu versuchen, den verweigerten geheimen Schlüssel zu lesen.

    az keyvault secret show --vault-name $keyVaultName --name $secretNameDenied
    

    Beispielausgabe. 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: ForbiddenByRbac
    
  5. Lesen Sie das Geheimnis, dessen Name mit test-app beginnt.

    az keyvault secret show --vault-name $keyVaultName --name $secretNameAllowed
    

    Beispielausgabe. Beachten Sie, dass Sie das Geheimnis lesen können, weil sein Name mit test-app beginnt:

    {
      "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

  1. Verwenden Sie im ursprünglichen Befehlsfenster az-Rollenzuweisungsliste , um die hinzugefügte Rollenzuweisung abzurufen.

    az role assignment list --assignee $userObjectId --resource-group $resourceGroup
    
  2. Erstellen Sie eine JSON-Datei mit folgendem Format, und aktualisieren Sie die Eigenschaften condition und description, um auch Geheimnisse zuzulassen, deren Namen mit api- 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"
    }
    
  3. 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

  1. Verwenden Sie " az role assignment delete ", um die Rollenzuweisung und -bedingung zu entfernen.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Löschen Sie den von Ihnen erstellten Schlüsseltresor.

  3. Löschen Sie den von Ihnen erstellten Benutzer.