다음을 통해 공유


자습서: Azure CLI를 사용하여 Blob에 대한 액세스를 제한하는 역할 할당 조건 추가

대부분의 경우 역할 할당은 Azure 리소스에 필요한 사용 권한을 부여합니다. 그러나 경우에 따라 역할 할당 조건을 추가하여 보다 세분화된 액세스 제어를 제공하는 것이 좋습니다.

이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.

  • 역할 할당에 조건 추가
  • BLOB 인덱스 태그를 기반으로 BLOB에 대한 액세스 제한

Important

Azure ABAC(Azure 특성 기반 액세스 제어)는 표준 및 프리미엄 스토리지 계정 성능 계층 모두에서 request, resource, environmentprincipal 특성을 사용하여 Azure Blob Storage, Azure Data Lake Storage Gen2 및 Azure 큐에 대한 액세스만 제어하기 위한 GA(일반 공급)입니다. 현재 컨테이너 메타데이터 리소스 특성과 Blob 나열 포함 요청 특성은 미리 보기에 있습니다. Azure Storage용 ABAC의 전체 기능 상태 정보는 Azure Storage의 조건 기능 상태를 참조하세요.

베타, 미리 보기로 제공되거나 아직 일반 공급으로 릴리스되지 않은 Azure 기능에 적용되는 약관은 Microsoft Azure 미리 보기에 대한 추가 사용 약관을 참조하세요.

필수 조건

역할 할당 조건을 추가하거나 편집하기 위한 사전 요구 사항은 조건 및 사전 요구 사항을 참조하세요.

조건

이 자습서에서는 특정 태그를 사용하여 BLOB에 대한 액세스를 제한합니다. 예를 들어 Chandra에서 Project=Cascade 태그가 있는 파일만 읽을 수 있도록 역할 할당에 조건을 추가합니다.

조건이 있는 역할 할당의 다이어그램

Chandra가 Project=Cascade 태그 없이 BLOB을 읽으려고 하면 액세스가 허용되지 않습니다.

Project=Cascade 태그를 사용한 Blob의 읽기 권한을 보여주는 다이어그램.

코드에서 조건은 다음과 같습니다.

(
    (
        !(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단계: Azure에 로그인

  1. az login 명령을 사용하여 사용자 액세스 관리자 또는 소유자로 디렉터리에 로그인하기 위해 표시되는 지침을 따릅니다.

    az login
    
  2. az account show를 사용하여 구독 ID를 가져옵니다.

    az account show
    
  3. 구독 ID를 확인하고 변수를 초기화합니다.

    subscriptionId="<subscriptionId>"
    

2단계: 사용자 만들기

  1. az ad user create를 사용하여 사용자를 만들거나 기존 사용자를 찾습니다. 이 자습서에서는 Chandra를 예제로 사용합니다.

  2. 사용자의 개체 ID에 대한 변수를 초기화합니다.

    userObjectId="<userObjectId>"
    

3단계: 스토리지 설정

Microsoft Entra 자격 증명을 사용하거나 스토리지 계정 액세스 키를 사용하여 Azure CLI에서 Blob 스토리지에 대한 액세스 권한을 부여할 수 있습니다. 이 문서에서는 Microsoft Entra ID를 사용하여 Blob 스토리지 작업에 권한을 부여하는 방법을 보여 줍니다. Azure Storage에 대한 자세한 내용은 빠른 시작: Azure CLI를 사용하여 Blob 만들기, 다운로드, 나열하기를 참조하세요.

  1. az storage account를 사용하여 Blob 인덱스 기능과 호환되는 스토리지 계정을 만듭니다. 자세한 내용은 Blob 인덱스 태그를 사용하여 Azure Blob 데이터 관리 및 찾기를 참조하세요.

  2. az storage 컨테이너를 사용하여 스토리지 계정에서 새 Blob 컨테이너를 만들고 익명 액세스 수준을 프라이빗(익명 액세스 차단)으로 설정합니다.

  3. az storage blob upload를 사용하여 텍스트 파일을 컨테이너에 업로드합니다.

  4. 텍스트 파일에 다음 Blob 인덱스 태그를 추가합니다. 자세한 내용은 Blob 인덱스 태그를 사용하여 Azure Blob Storage 데이터 관리 및 찾기를 참조하세요.

    참고 항목

    Blob은 임의의 사용자 정의 키- 메타데이터를 저장하는 기능을 지원합니다. 메타데이터는 BLOB 인덱스 태그와 유사하지만 조건으로 BLOB 인덱스 태그를 사용해야 합니다.

    프로젝트 Cascade
  5. 두 번째 텍스트 파일을 컨테이너에 업로드합니다.

  6. 다음 BLOB 인덱스 태그를 두 번째 텍스트 파일에 추가합니다.

    프로젝트 Baker
  7. 사용한 이름으로 다음 변수를 초기화합니다.

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

4단계: 조건이 있는 역할 할당

  1. Storage Blob Data Reader 역할 변수를 초기화합니다.

    roleDefinitionName="Storage Blob Data Reader"
    roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. 리소스 그룹의 범위를 초기화합니다.

    scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. 조건을 초기화합니다.

    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에서 기록 확장을 사용하는 경우 느낌표(!)로 인해 메시지 bash: !: event not found가 표시될 수 있습니다. 이 경우 명령 set +H를 통해 기록 확장을 사용하지 않도록 설정할 수 있습니다. 기록 확장을 다시 사용하도록 설정하려면 set -H를 사용합니다.

    Bash에서 달러 기호($)는 확장에 특별한 의미가 있습니다. 조건에 달러 기호($)가 포함된 경우 백슬래시(\)를 접두사로 사용해야 할 수 있습니다. 예를 들어 이 조건은 달러 기호를 사용하여 태그 키 이름을 표시합니다. Bash의 따옴표 규칙에 대한 자세한 내용은 큰따옴표를 참조하세요.

  4. 조건 버전 및 설명을 초기화합니다.

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. az role assignment create를 사용하여 리소스 그룹 범위에서 사용자에게 조건과 함께 Storage Blob Data Reader 역할을 할당합니다.

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

    출력 예는 다음과 같습니다.

    {
      "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단계: (선택 사항)Azure Portal에서 조건 보기

  1. Azure Portal에서 리소스 그룹을 엽니다.

  2. 액세스 제어(IAM) 를 선택합니다.

  3. 역할 할당 탭에서 역할 할당을 찾습니다.

  4. 조건 열에서 보기/편집을 클릭하여 조건을 확인합니다.

Azure Portal에서 역할 할당 조건을 추가하는 스크린샷

6단계: 조건 테스트

  1. 새 명령 창을 엽니다.

  2. az login을 사용하여 Chandra로 로그인합니다.

    az login
    
  3. 사용한 이름으로 다음 변수를 초기화합니다.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. az storage blob show를 사용하여 Baker 프로젝트에 대한 파일의 속성을 읽으려고 합니다.

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

    다음은 출력 예제입니다. 추가한 조건으로 인해 파일을 읽을 수 없습니다.

    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 프로젝트에 대한 파일의 속성을 읽습니다.

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

    다음은 출력 예제입니다. 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,
    
      ...
    
    }
    

7단계: (선택 사항)조건 편집

  1. 다른 명령 창에서 az role assignment list를 사용하여 추가한 역할 할당을 가져옵니다.

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

    다음과 유사하게 출력됩니다.

    [
      {
        "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. 다음 형식으로 JSON 파일을 만들고 conditiondescription 속성을 업데이트합니다.

    {
        "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. az role assignment update를 사용하여 역할 할당에 대한 조건을 업데이트합니다.

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

8단계: 리소스 정리

  1. az role assignment delete를 사용하여 추가한 역할 할당 및 조건을 제거합니다.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. 만든 스토리지 계정을 삭제합니다.

  3. 만든 사용자를 삭제합니다.

다음 단계