Samouczek: dodawanie warunku przypisania roli w celu ograniczenia dostępu do obiektów blob przy użyciu interfejsu wiersza polecenia platformy Azure

W większości przypadków przypisanie roli przyznaje uprawnienia potrzebne do zasobów platformy Azure. Jednak w niektórych przypadkach możesz zapewnić bardziej szczegółową kontrolę dostępu, dodając warunek przypisania roli.

Z tego samouczka dowiesz się, jak wykonywać następujące czynności:

  • Dodawanie warunku do przypisania roli
  • Ograniczanie dostępu do obiektów blob na podstawie tagu indeksu obiektów blob

Ważne

Kontrola dostępu oparta na atrybutach platformy Azure (Azure ABAC) jest ogólnie dostępna do kontrolowania dostępu do usług Azure Blob Storage, Azure Data Lake Storage Gen2 i Azure Queues przy użyciu requestatrybutów , resource, environmenti principal zarówno w warstwach wydajności konta magazynu w warstwie Standardowa, jak i Premium Storage. Obecnie atrybut zasobu metadanych kontenera i lista obiektów blob dołączania atrybutu żądania są dostępne w wersji zapoznawczej. Aby uzyskać pełne informacje o stanie funkcji ABAC dla usługi Azure Storage, zobacz Stan funkcji warunku w usłudze Azure Storage.

Zobacz Dodatkowe warunki użytkowania wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta lub wersji zapoznawczej albo w inny sposób nie zostały jeszcze wydane jako ogólnie dostępne.

Wymagania wstępne

Aby uzyskać informacje o wymaganiach wstępnych dotyczących dodawania lub edytowania warunków przypisywania ról, zobacz Warunki wstępne.

Stan

W tym samouczku ograniczysz dostęp do obiektów blob za pomocą określonego tagu. Na przykład dodasz warunek do przypisania roli, aby usługa Chandra mogła odczytywać tylko pliki z tagiem Project=Cascade.

Diagram przypisania roli z warunkiem.

Jeśli Chandra próbuje odczytać obiekt blob bez tagu Project=Cascade, dostęp nie jest dozwolony.

Diagram przedstawiający dostęp do odczytu do obiektów blob za pomocą tagu Project=Cascade.

Oto jak wygląda warunek w kodzie:

(
    (
        !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}
        AND NOT
        SubOperationMatches{'Blob.List'})
    )
    OR
    (
        @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'
    )
)

Krok 1. Logowanie się do platformy Azure

  1. Użyj polecenia az login i postępuj zgodnie z instrukcjami wyświetlanymi, aby zalogować się do katalogu jako użytkownik access Administracja istrator lub właściciel.

    az login
    
  2. Użyj polecenia az account show , aby uzyskać identyfikator subskrypcji.

    az account show
    
  3. Określ identyfikator subskrypcji i zainicjuj zmienną.

    subscriptionId="<subscriptionId>"
    

Krok 2. Tworzenie użytkownika

  1. Użyj polecenia az ad user create , aby utworzyć użytkownika lub znaleźć istniejącego użytkownika. W tym samouczku użyto narzędzia Chandra jako przykładu.

  2. Zainicjuj zmienną identyfikatora obiektu użytkownika.

    userObjectId="<userObjectId>"
    

Krok 3. Konfigurowanie magazynu

Dostęp do usługi Blob Storage można autoryzować za pomocą interfejsu wiersza polecenia platformy Azure przy użyciu poświadczeń usługi Microsoft Entra lub klucza dostępu do konta magazynu. W tym artykule pokazano, jak autoryzować operacje magazynu obiektów blob przy użyciu identyfikatora Entra firmy Microsoft. Aby uzyskać więcej informacji, zobacz Szybki start: tworzenie, pobieranie i wyświetlanie listy obiektów blob za pomocą interfejsu wiersza polecenia platformy Azure

  1. Użyj polecenia az storage account , aby utworzyć konto magazynu zgodne z funkcją indeksu obiektów blob. Aby uzyskać więcej informacji, zobacz Zarządzanie danymi obiektów blob platformy Azure i znajdowanie ich za pomocą tagów indeksu obiektów blob.

  2. Użyj polecenia az storage container , aby utworzyć nowy kontener obiektów blob na koncie magazynu i ustawić poziom dostępu anonimowego na Prywatny (bez dostępu anonimowego).

  3. Użyj polecenia az storage blob upload , aby przekazać plik tekstowy do kontenera.

  4. Dodaj następujący tag indeksu obiektów blob do pliku tekstowego. Aby uzyskać więcej informacji, zobacz Use blob index tags to manage and find data on Azure Blob Storage (Używanie tagów indeksu obiektów blob do zarządzania danymi i znajdowania ich w usłudze Azure Blob Storage).

    Uwaga

    Obiekty blob obsługują również możliwość przechowywania dowolnych metadanych klucz-wartość zdefiniowanych przez użytkownika. Chociaż metadane są podobne do tagów indeksu obiektów blob, należy używać tagów indeksu obiektów blob z warunkami.

    Key Wartość
    Projekt Cascade
  5. Przekaż drugi plik tekstowy do kontenera.

  6. Dodaj następujący tag indeksu obiektów blob do drugiego pliku tekstowego.

    Key Wartość
    Projekt Baker
  7. Zainicjuj następujące zmienne przy użyciu użytych nazw.

    resourceGroup="<resourceGroup>"
    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameCascade="<blobNameCascade>"
    blobNameBaker="<blobNameBaker>"
    

Krok 4. Przypisywanie roli z warunkiem

  1. Zainicjuj zmienne roli Czytelnik danych obiektu blob usługi Storage.

    roleDefinitionName="Storage Blob Data Reader"
    roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Zainicjuj zakres grupy zasobów.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Zainicjuj warunek.

    condition="((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<\$key_case_sensitive\$>] StringEquals 'Cascade'))"
    

    W powłoce Bash, jeśli rozszerzenie historii jest włączone, może zostać wyświetlony komunikat bash: !: event not found z powodu wykrzyknika (!). W takim przypadku można wyłączyć rozszerzenie historii za pomocą polecenia set +H. Aby ponownie włączyć rozszerzenie historii, użyj polecenia set -H.

    W powłoce Bash znak dolara ($) ma specjalne znaczenie dla ekspansji. Jeśli warunek zawiera znak dolara ($), może być konieczne jego prefiks z ukośnikiem odwrotnym (\). Na przykład ten warunek używa znaków dolara, aby oznaczyć nazwę klucza tagu. Aby uzyskać więcej informacji na temat reguł cudzysłowów w powłoce Bash, zobacz Podwójne cudzysłowy.

  4. Zainicjuj wersję i opis warunku.

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Użyj polecenia az role assignment create , aby przypisać rolę Czytelnik danych obiektu blob usługi Storage z warunkiem do użytkownika w zakresie grupy zasobów.

    az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersion
    

    Poniżej przedstawiono przykładowe dane wyjściowe:

    {
      "canDelegate": null,
      "condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))",
      "conditionVersion": "2.0",
      "description": "Read access to blobs with the tag Project=Cascade",
      "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/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
      "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
      "type": "Microsoft.Authorization/roleAssignments"
    }
    

Krok 5. (Opcjonalnie) Wyświetlanie warunku w witrynie Azure Portal

  1. W witrynie Azure Portal otwórz grupę zasobów.

  2. Wybierz pozycję Kontrola dostępu (IAM) .

  3. Na karcie Przypisania ról znajdź przypisanie roli.

  4. W kolumnie Warunek wybierz pozycję Widok/Edytuj, aby wyświetlić warunek.

Zrzut ekranu przedstawiający dodawanie warunku przypisania roli w witrynie Azure Portal.

Krok 6. Testowanie warunku

  1. Otwórz nowe okno polecenia.

  2. Użyj polecenia az login , aby zalogować się jako Chandra.

    az login
    
  3. Zainicjuj następujące zmienne przy użyciu użytych nazw.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Użyj polecenia az storage blob show , aby spróbować odczytać właściwości pliku dla projektu Baker.

    az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameBaker --auth-mode login
    

    Oto przykład danych wyjściowych. Zwróć uwagę, że nie można odczytać pliku z powodu dodanego warunku.

    You do not have the required permissions needed to perform this operation.
    Depending on your operation, you may need to be assigned one of the following roles:
        "Storage Blob Data Contributor"
        "Storage Blob Data Reader"
        "Storage Queue Data Contributor"
        "Storage Queue Data Reader"
    
    If you want to use the old authentication method and allow querying for the right account key, please use the "--auth-mode" parameter and "key" value.
    
  5. Przeczytaj właściwości pliku dla projektu Kaskadowego.

    az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameCascade --auth-mode login 
    

    Oto przykład danych wyjściowych. Zwróć uwagę, że można odczytać właściwości pliku, ponieważ ma on tag Project=Cascade.

    {
      "container": "<containerName>",
      "content": "",
      "deleted": false,
      "encryptedMetadata": null,
      "encryptionKeySha256": null,
      "encryptionScope": null,
      "isAppendBlobSealed": null,
      "isCurrentVersion": null,
      "lastAccessedOn": null,
      "metadata": {},
      "name": "<blobNameCascade>",
      "objectReplicationDestinationPolicy": null,
      "objectReplicationSourceProperties": [],
      "properties": {
        "appendBlobCommittedBlockCount": null,
        "blobTier": "Hot",
        "blobTierChangeTime": null,
        "blobTierInferred": true,
        "blobType": "BlockBlob",
        "contentLength": 7,
        "contentRange": null,
    
      ...
    
    }
    

Krok 7. (Opcjonalnie) Edytowanie warunku

  1. W innym oknie polecenia użyj polecenia az role assignment list , aby uzyskać dodane przypisanie roli.

    az role assignment list --assignee $userObjectId --resource-group $resourceGroup
    

    Wynik jest podobny do następującego:

    [
      {
        "canDelegate": null,
        "condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))",
        "conditionVersion": "2.0",
        "description": "Read access to blobs with the tag Project=Cascade",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{userObjectId}",
        "principalName": "chandra@contoso.com",
        "principalType": "User",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
      }
    ]
    
  2. Utwórz plik JSON z następującym formatem i zaktualizuj condition właściwości i description .

    {
        "canDelegate": null,
        "condition": "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Baker'))",
        "conditionVersion": "2.0",
        "description": "Read access to blobs with the tag Project=Cascade or Project=Baker",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{userObjectId}",
        "principalName": "chandra@contoso.com",
        "principalType": "User",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
    }
    
  3. Użyj polecenia az role assignment update , aby zaktualizować warunek przypisania roli.

    az role assignment update --role-assignment "./path/roleassignment.json"
    

Krok 8. Czyszczenie zasobów

  1. Użyj polecenia az role assignment delete , aby usunąć dodane przypisanie i warunek roli.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Usuń utworzone konto magazynu.

  3. Usuń utworzonego użytkownika.

Następne kroki