Kurz: Přidání podmínky přiřazení role pro omezení přístupu k objektům blob pomocí Azure CLI

Ve většině případů přiřazení role uděluje oprávnění, která potřebujete k prostředkům Azure. V některých případech ale můžete chtít poskytnout podrobnější řízení přístupu přidáním podmínky přiřazení role.

V tomto kurzu se naučíte:

  • Přidání podmínky k přiřazení role
  • Omezení přístupu k objektům blob na základě značky indexu objektů blob

Důležité

Řízení přístupu na základě atributů Azure (Azure ABAC) je obecně dostupné (GA) pro řízení přístupu ke službě Azure Blob Storage, Azure Data Lake Storage Gen2 a Frontám Azure pomocí requestresourceenvironment, a atributů v úrovních výkonu účtu služby Azure Storage úrovně Standard i principal Premium Storage. Atribut prostředku metadat kontejneru a objekt blob seznamu obsahují atribut požadavku v náhledu. Úplné informace o stavu funkcí ABAC pro Azure Storage najdete v tématu Stav funkcí podmínky ve službě Azure Storage.

Právní podmínky, které platí pro funkce Azure, které jsou ve verzi beta, verzi Preview nebo které zatím nejsou veřejně dostupné, najdete v Dodatečných podmínkách použití pro Microsoft Azure verze Preview.

Požadavky

Informace o požadavcích pro přidání nebo úpravu podmínek přiřazení role naleznete v tématu Požadavky na podmínky.

Podmínka

V tomto kurzu omezíte přístup k objektům blob s konkrétní značkou. Například přidáte podmínku k přiřazení role, aby Chandra mohl číst pouze soubory se značkou Project=Cascade.

Diagram přiřazení role s podmínkou

Pokud se Chandra pokusí přečíst objekt blob bez značky Project=Cascade, přístup není povolený.

Diagram znázorňující přístup pro čtení k objektům blob pomocí značky Project=Cascade

Tady je postup, jak podmínka vypadá v kódu:

(
    (
        !(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: Přihlášení k Azure

  1. Použijte příkaz az login a postupujte podle pokynů, které se zobrazí pro přihlášení k adresáři jako user Access Správa istrator nebo Owner.

    az login
    
  2. Pomocí příkazu az account show získejte ID vašich předplatných.

    az account show
    
  3. Určete ID předplatného a inicializujete proměnnou.

    subscriptionId="<subscriptionId>"
    

Krok 2: Vytvoření uživatele

  1. Pomocí příkazu az ad user create vytvořte uživatele nebo vyhledejte existujícího uživatele. V tomto kurzu se jako příklad používá Chandra.

  2. Inicializuje proměnnou pro ID objektu uživatele.

    userObjectId="<userObjectId>"
    

Krok 3: Nastavení úložiště

Přístup k úložišti objektů blob můžete autorizovat z Azure CLI pomocí přihlašovacích údajů Microsoft Entra nebo pomocí přístupového klíče účtu úložiště. Tento článek ukazuje, jak autorizovat operace úložiště objektů blob pomocí ID Microsoft Entra. Další informace najdete v tématu Rychlý start: Vytvoření, stažení a výpis objektů blob pomocí Azure CLI

  1. Pomocí příkazu az storage account vytvořte účet úložiště, který je kompatibilní s funkcí indexu objektů blob. Další informace najdete v tématu Správa a vyhledání dat objektů blob Azure pomocí značek indexu objektů blob.

  2. Pomocí příkazu az storage container vytvořte nový kontejner objektů blob v rámci účtu úložiště a nastavte úroveň anonymního přístupu na Privátní (bez anonymního přístupu).

  3. K nahrání textového souboru do kontejneru použijte příkaz az storage blob upload .

  4. Do textového souboru přidejte následující značku indexu objektu blob. Další informace najdete v tématu Použití značek indexu objektů blob ke správě a hledání dat ve službě Azure Blob Storage.

    Poznámka:

    Objekty blob také podporují možnost ukládat libovolná uživatelsky definovaná metadata klíč-hodnota. I když jsou metadata podobná značkě indexu objektů blob, musíte použít značky indexu objektů blob s podmínkami.

    Key Hodnota
    Projekt Cascade
  5. Nahrajte do kontejneru druhý textový soubor.

  6. Do druhého textového souboru přidejte následující značku indexu objektu blob.

    Key Hodnota
    Projekt Baker
  7. Inicializovat následující proměnné s názvy, které jste použili.

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

Krok 4: Přiřazení role s podmínkou

  1. Inicializuje proměnné role Čtenář dat v objektu blob služby Storage.

    roleDefinitionName="Storage Blob Data Reader"
    roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Inicializuje obor pro skupinu prostředků.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Inicializuje podmínku.

    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'))"
    

    Pokud je v Bash povolené rozšíření historie, může se zpráva bash: !: event not found zobrazit kvůli vykřičníku (!). V tomto případě můžete zakázat rozšíření historie pomocí příkazu set +H. K opětovnému povolení rozšíření historie použijte set -H.

    V Bash má znak dolaru ($) zvláštní význam pro rozšíření. Pokud vaše podmínka obsahuje znak dolaru ($), možná ho budete muset předponovat zpětným lomítkem (\). Tato podmínka například používá znak dolaru k označení názvu klíče značky. Další informace opravidlech

  4. Inicializace verze podmínky a popisu

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Pomocí příkazu az role assignment create přiřaďte uživateli roli Čtenář dat objektů blob služby Storage s podmínkou v oboru skupiny prostředků.

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

    Tady je příklad výstupu:

    {
      "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: (Volitelné) Zobrazení podmínky na webu Azure Portal

  1. Na webu Azure Portal otevřete skupinu prostředků.

  2. Vyberte Řízení přístupu (IAM) .

  3. Na kartě Přiřazení rolí vyhledejte přiřazení role.

  4. Ve sloupci Podmínka vyberte Zobrazit/Upravit a zobrazte podmínku.

Snímek obrazovky s možností Přidat podmínku přiřazení role na webu Azure Portal

Krok 6: Otestování podmínky

  1. Otevřete nové příkazové okno.

  2. Pomocí příkazu az login se přihlaste jako Chandra.

    az login
    
  3. Inicializovat následující proměnné s názvy, které jste použili.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Pomocí příkazu az storage blob show se pokuste přečíst vlastnosti souboru pro projekt Baker.

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

    Tady je příklad výstupu. Všimněte si, že soubor nemůžete přečíst z důvodu podmínky, kterou jste přidali.

    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. Přečtěte si vlastnosti souboru pro kaskádový projekt.

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

    Tady je příklad výstupu. Všimněte si, že můžete číst vlastnosti souboru, protože má značku 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: (Volitelné) Úprava podmínky

  1. V druhém příkazovém okně získejte přiřazení role, které jste přidali, pomocí příkazu az role assignment list .

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

    Výstup je podobný tomuto:

    [
      {
        "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. Vytvořte soubor JSON s následujícím formátem a aktualizujte condition vlastnosti.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. Pomocí příkazu az role assignment update aktualizujte podmínku přiřazení role.

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

Krok 8: Vyčištění prostředků

  1. Pomocí příkazu az role assignment delete odeberte přiřazení role a podmínku, kterou jste přidali.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Odstraňte účet úložiště, který jste vytvořili.

  3. Odstraňte uživatele, který jste vytvořili.

Další kroky