Sdílet prostřednictvím


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 návodu se naučíte, jak:

  • Přidání podmínky k přiřazení role
  • Omezení přístupu k blobům na základě značky indexu 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í atributů request, resource, environment a principal v úrovních výkonu standardních a prémiových účtů služby Azure Storage. Objekt blob seznamu v současné době obsahuje atribut požadavku a atribut požadavku snímku pro hierarchický obor názvů ve verzi PREVIEW. Úplné informace o stavu funkcí ABAC pro Azure Storage najdete v tématu Stav funkcí podmínky ve službě Azure Storage.

Podívejte se na doplňkové podmínky užívání služby Microsoft Azure Preview pro právní podmínky, které se vztahují na funkce Azure, jež jsou ve verzi beta, Preview nebo jinak ještě nejsou obecně dostupné.

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, 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 správce uživatelských přístupů nebo vlastníka.

    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 naleznete v článku Správa a vyhledávání dat Azure Blob 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.

    Klíč Hodnota
    Projekt Kaskáda
  5. Nahrajte do kontejneru druhý textový soubor.

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

    Klíč Hodnota
    Projekt Pekař
  7. Inicializujte 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. Inicializovat proměnné role Storage Blob Data Reader.

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

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Inicializujte 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. Chcete-li znovu povolit 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á znaky dolaru k odlišení názvu klíče značky. Další informace o pravidlech pro uvozovky v Bash naleznete v části Dvojité uvozovky.

  4. Inicializujte verzi podmínky a popis.

    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 záložce 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í az login se přihlaste jako Chandra.

    az login
    
  3. Inicializujte následující proměnné podle názvů, 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ě použijte az role assignment list k získání přiřazení role, kterou jste přidali.

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

    Výstup je podobný následujícímu:

    [
      {
        "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 vlastnosti condition a 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