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

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: Instalace požadavků

  1. Otevřete okno PowerShellu.

  2. Pomocí modulu Get-InstalledModule zkontrolujte verze nainstalovaných modulů.

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. V případě potřeby nainstalujte požadované verze modulů Az, Az.Resources a Az.Storage pomocí modulu Install-Module.

    Install-Module -Name Az -RequiredVersion 5.5.0
    Install-Module -Name Az.Resources -RequiredVersion 3.2.1
    Install-Module -Name Az.Storage -RequiredVersion 2.5.2-preview -AllowPrerelease
    
  4. Zavřete a znovu otevřete PowerShell, aby se aktualizovala relace.

Krok 2: Přihlášení k Azure

  1. Použijte příkaz Připojení-AzAccount a postupujte podle pokynů, které se zobrazí pro přihlášení k adresáři jako uživatelský přístup Správa istrator nebo vlastník.

    Connect-AzAccount
    
  2. Pomocí rutiny Get-AzSubscription můžete zobrazit seznam všech vašich předplatných.

    Get-AzSubscription
    
  3. Určete ID předplatného a inicializujete proměnnou.

    $subscriptionId = "<subscriptionId>"
    
  4. Nastavte předplatné jako aktivní předplatné.

    $context = Get-AzSubscription -SubscriptionId $subscriptionId
    Set-AzContext $context
    

Krok 3: Vytvoření uživatele

  1. Pomocí rutiny New-MgUser 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 4: Nastavení úložiště

  1. Pomocí rutiny New-AzStorageAccount 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í rutiny New-AzStorageContainer vytvořte nový kontejner objektů blob v rámci účtu úložiště a nastavte úroveň anonymního přístupu na Private (bez anonymního přístupu).

  3. K nahrání textového souboru do kontejneru použijte Set-AzStorageBlobContent .

  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 5: 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 vaše podmínka v PowerShellu obsahuje znak dolaru ($), musíte ho předponovat pomocí zpětného znaménka ('). Tato podmínka například používá znak dolaru k označení názvu klíče značky.

  4. Inicializace verze podmínky a popisu

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

    New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion
    

    Tady je příklad výstupu:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))
    

Krok 6: (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 7: Otestování podmínky

  1. Otevřete nové okno PowerShellu.

  2. Pomocí Připojení-AzAccount se přihlaste jako Chandra.

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

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Pomocí rutiny New-AzStorageContext vytvořte konkrétní kontext pro snadnější přístup k účtu úložiště.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. Pomocí rutiny Get-AzStorageBlob se pokuste přečíst soubor pro projekt Baker.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx 
    

    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.

    Get-AzStorageBlob : This request is not authorized to perform this operation using this permission. HTTP Status Code:
    403 - HTTP Error Message: This request is not authorized to perform this operation using this permission.
    ErrorCode: AuthorizationPermissionMismatch
    ErrorMessage: This request is not authorized to perform this operation using this permission.
    RequestId: <requestId>
    Time: Sat, 24 Apr 2021 13:26:25 GMT
    At line:1 char:1
    + Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Con ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : CloseError: (:) [Get-AzStorageBlob], StorageException
        + FullyQualifiedErrorId : StorageException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.GetAzureStorageBlob
       Command
    
  6. Přečtěte si soubor pro kaskádový projekt.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx 
    

    Tady je příklad výstupu. Všimněte si, že soubor můžete přečíst, protože obsahuje značku Project=Cascade.

       AccountName: <storageAccountName>, ContainerName: <containerName>
    
    Name                 BlobType  Length          ContentType                    LastModified         AccessTier SnapshotT
                                                                                                                  ime
    ----                 --------  ------          -----------                    ------------         ---------- ---------
    CascadeFile.txt      BlockBlob 7               text/plain                     2021-04-24 05:35:24Z Hot
    

Krok 8: (Volitelné) Úprava podmínky

  1. V druhém okně PowerShellu pomocí rutiny Get-AzRoleAssignment získejte přiřazení role, které jste přidali.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Upravte 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' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Baker'))"
    
  3. Inicializuje podmínku a popis.

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. K aktualizaci podmínky přiřazení role použijte Set-AzRoleAssignment .

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Tady je příklad výstupu:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade or Project=Baker
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.S
                         torage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
                         StringEquals 'Baker'))
    

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

  1. Pomocí remove-AzRoleAssignment odeberte přiřazení a podmínku role, kterou jste přidali.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Odstraňte účet úložiště, který jste vytvořili.

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

Další kroky