Öğretici: Azure CLI kullanarak bloblara erişimi kısıtlamak için rol atama koşulu ekleme

Çoğu durumda rol ataması, Azure kaynaklarına ihtiyacınız olan izinleri verir. Ancak bazı durumlarda rol atama koşulu ekleyerek daha ayrıntılı erişim denetimi sağlamak isteyebilirsiniz.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Rol atamasına koşul ekleme
  • Blob dizin etiketine göre bloblara erişimi kısıtlama

Önemli

Azure öznitelik tabanlı erişim denetimi (Azure ABAC), hem standart hem de premium depolama hesabı performans katmanlarında request, resource, environment ve principal özniteliklerini kullanarak Azure Blob Depolama, Azure Data Lake Storage 2. Nesil ve Azure Kuyruklarına erişimi denetlemek için genel kullanıma sunulmuştur (GA). Şu anda liste blobu istek özniteliğini içerir ve hiyerarşik ad alanı için anlık görüntü isteği özniteliği ÖNİzLEME aşamasındadır. Azure Depolama için ABAC'nin tam özellik durumu bilgileri için Azure Depolama'daki koşul özelliklerinin durumu başlıklı bölüme bakın.

Beta veya önizleme aşamasında olan ya da başka bir şekilde henüz genel kullanıma sunulmamış olan Azure özelliklerinde geçerli olan yasal koşullar için bkz. Microsoft Azure Önizlemeleri için Ek Kullanım Koşulları.

Önkoşullar

Rol atama koşullarını ekleme veya düzenleme önkoşulları hakkında bilgi için bkz . Koşullar önkoşulları.

Koşul

Bu öğreticide, belirli bir etikete sahip bloblara erişimi kısıtlaacaksınız. Örneğin, Chandra'nın yalnızca Project=Cascade etiketine sahip dosyaları okuyabilmesi için rol atamasına bir koşul eklersiniz.

Bir koşulla rol atama diyagramı.

Chandra, Project=Cascade etiketi olmayan bir blobu okumaya çalışırsa erişime izin verilmez.

Project=Cascade etiketiyle bloblara okuma erişimini gösteren diyagram.

Koşul kodda şöyle görünür:

(
    (
        !(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'
    )
)

1. Adım: Azure'da oturum açma

  1. az login komutunu kullanın ve dizininizde Kullanıcı Erişimi Yöneticisi veya Sahip olarak oturum açarken görünen yönergeleri izleyin.

    az login
    
  2. Aboneliklerinizin kimliğini almak için az account show komutunu kullanın.

    az account show
    
  3. Abonelik kimliğini belirleyin ve değişkeni başlatın.

    subscriptionId="<subscriptionId>"
    

2. Adım: Kullanıcı oluşturma

  1. Kullanıcı oluşturmak veya var olan bir kullanıcıyı bulmak için az ad user create komutunu kullanın. Bu öğreticide örnek olarak Chandra kullanılır.

  2. Kullanıcının nesne kimliği için değişkeni başlatın.

    userObjectId="<userObjectId>"
    

3. Adım: Depolamayı ayarlama

Azure CLI'dan Blob depolamaya erişimi Microsoft Entra kimlik bilgileriyle veya depolama hesabı erişim anahtarını kullanarak yetkileyebilirsiniz. Bu makalede, Microsoft Entra Id kullanarak Blob depolama işlemlerini yetkilendirme işlemi gösterilmektedir. Daha fazla bilgi için bkz . Hızlı Başlangıç: Azure CLI ile blob oluşturma, indirme ve listeleme

  1. Blob dizini özelliğiyle uyumlu bir depolama hesabı oluşturmak için az storage account komutunu kullanın. Daha fazla bilgi için Blob dizini etiketleriyle Azure Blob verilerini yönetme ve bulma bölümüne bakın.

  2. Az storage container komutunu kullanarak depolama hesabında yeni bir blob kapsayıcısı oluşturun ve anonim erişim düzeyini Özel (anonim erişim yok) olarak ayarlayın.

  3. Kapsayıcıya bir metin dosyası yüklemek için az storage blob upload komutunu kullanın.

  4. Metin dosyasına aşağıdaki blob dizin etiketini ekleyin. Daha fazla bilgi için bkz. Azure Blob Depolama'da verileri yönetmek ve bulmak için blob dizini etiketlerini kullanma.

    Uyarı

    Bloblar ayrıca rastgele kullanıcı tanımlı anahtar-değer meta verilerini depolama özelliğini de destekler. Meta veriler blob dizin etiketlerine benzer olsa da, blob dizin etiketlerini koşullarla birlikte kullanmanız gerekir.

    Anahtar Değer
    Proje Şelale
  5. Kapsayıcıya ikinci bir metin dosyası yükleyin.

  6. aşağıdaki blob dizin etiketini ikinci metin dosyasına ekleyin.

    Anahtar Değer
    Proje Fırıncı
  7. Kullandığınız adlarla aşağıdaki değişkenleri başlatın.

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

4. Adım: Koşulu olan bir rol atama

  1. Depolama Blobu Veri Okuyucusu rol değişkenlerini başlatın.

    roleDefinitionName="Storage Blob Data Reader"
    roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Kaynak grubunun kapsamını başlatın.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Durumu başlatın.

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

    Bash'te geçmiş genişletmesi etkinleştirildiyse ünlem işareti (!) nedeniyle iletiyi bash: !: event not found görebilirsiniz. Bu durumda, komutuyla set +Hgeçmiş genişletmeyi devre dışı bırakabilirsiniz. Geçmiş genişletmeyi yeniden etkinleştirmek için set -H kullanın.

    Bash'te dolar işaretinin ($) genişleme için özel bir anlamı vardır. Koşulunuzda dolar işareti ($) varsa, önüne ters eğik çizgi (\) eklemeniz gerekebilir. Örneğin, bu koşul etiket anahtarı adını çizmek için dolar işaretlerini kullanır. Bash'te tırnak işareti kuralları hakkında daha fazla bilgi için bkz. Çift Tırnaklar.

  4. Koşul sürümünü ve açıklamasını hazırlayın.

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Depolama Blobu Veri Okuyucusu rolünü bir kaynak grubu kapsamındaki kullanıcıya bir koşulla atamak için az role assignment create komutunu kullanın.

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

    Çıktının bir örneği aşağıda verilmişti:

    {
      "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"
    }
    

5. Adım: (İsteğe bağlı) Koşulu Azure portalında görüntüleme

  1. Azure portalında kaynak grubunu açın.

  2. Erişim denetimi (IAM) öğesini seçin.

  3. Rol atamaları sekmesinde rol atamasını bulun.

  4. Koşulu görüntülemek için Koşul sütununda Görüntüle/Düzenle'yi seçin.

Azure portalında Rol ataması koşulu ekleme işleminin ekran görüntüsü.

6. Adım: Koşulu test edin

  1. Yeni bir komut penceresi açın.

  2. Chandra olarak oturum açmak için az login komutunu kullanın.

    az login
    
  3. Kullandığınız adlarla aşağıdaki değişkenleri başlatın.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Baker projesinin dosyasının özelliklerini okumayı denemek için az storage blob show komutunu kullanın.

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

    Çıktının bir örneği aşağıda verilmişti. Eklediğiniz koşul nedeniyle dosyayı okuyamadığınıza dikkat edin.

    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. Cascade projesi için dosyanın özelliklerini okuyun.

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

    Çıktının bir örneği aşağıda verilmişti. Project=Cascade etiketine sahip olduğundan dosyanın özelliklerini okuyabileceğinize dikkat edin.

    {
      "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,
    
      ...
    
    }
    

7. Adım: (İsteğe bağlı) Koşulu düzenleme

  1. Diğer komut penceresinde, az role assignment list komutunu kullanarak eklediğiniz rol atamasını alın.

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

    Çıkış aşağıdakine benzer:

    [
      {
        "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. Aşağıdaki biçime sahip bir JSON dosyası oluşturun ve condition ile description özelliklerini güncelleyin.

    {
        "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. Rol atamasının koşulunu güncelleştirmek için az role assignment update komutunu kullanın.

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

8. Adım: Kaynakları temizleme

  1. Eklediğiniz rol atamasını ve koşulu kaldırmak için az role assignment delete komutunu kullanın.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Oluşturduğunuz depolama hesabını silin.

  3. Oluşturduğunuz kullanıcıyı silin.

Sonraki adımlar