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 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 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ě indexové značky blobu

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

Takto vypadá podmínka 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 pro aktualizaci session.

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

  1. Použijte příkaz Connect-AzAccount 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.

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

    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é podle názvů, které jste použili.

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

Krok 5: 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 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á znaky dolaru k odlišení názvu klíče značky.

  4. Inicializujte verzi podmínky a popis.

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. Pomocí příkazu New-AzRoleAssignment přiřaďte roli Čtenář dat objektů blob služby Storage s podmínkou uživateli v rámci 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 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 7: Otestování podmínky

  1. Otevřete nové okno PowerShellu.

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

    Connect-AzAccount
    
  3. Inicializujte následující proměnné podle názvů, 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 projekt Cascade.

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