Storage Account: AzCopy 인증 방식 및 사용법 알아 보기 #2

Tip. 테스트를 위한 준비 작업은 이전 포스팅에 기재되어 있습니다.

Storage Account: AzCopy 인증 방식 및 사용법 알아 보기 #1

Agenda

  1. AzCopy 인증 방식 알아 보기
    • Microsoft Entra ID 인증 방식
      • Authorize a user identity # Skip
      • Authorize a managed identity # Skip
      • Authorize by using a system-wide managed identity # Skip
      • Authorize by using a user-assigned managed identity # Skip
      • Authorize a service principal
    • Storage Account SAS Token 인증 방식 # Skip

Authorize a service principal

이전 포스팅에서 분량 문제로 다루지 못했던 서비스 주체 (Service Principal) 인증 방식에 대해서 알아 본다.

서비스 주체를 이용한 인증 방식은 Azure Entra ID (=이전 Azure Active Directory) 내에서 앱 또는 서비스가 사용자의 상호 작용 없이 Azure 리소스에 접근할 수 있도록 Key, Secret 또는 인증서를 포함할 수 있다.

위의 인증 방식은 자동화와 통합에서 주로 사용되며, SMI (System Managed Identity)와 같이 사용자의 개입 없이도 Azuer 리소스를 관리하고 조작할 수 있도록 지원한다.

서비스 주체 인증을 사용하는 경우

Microsoft 주의 사항

Microsoft 문서에서 언급된 경고는 서비스 주체를 사용할 때 방생할 수 있는 보안 문제에 대해서 주의하고 있다.

서비스 주체를 생성하고, 이 과정에서 생성되는 인증 정보 (Credential) 는 안전하게 관리되어야 한다. Managed ID를 사용할 수 있는 경우라면 서비스 주체를 사용하지 않는 것이 보안적인 측면에서는 효율적이다. 하지만, 어쩔 수 없이 서비스 주체를 사용하여 인증 정보를 관리 할 필요가 있는 경우가 존재한다.

  1. Azure 외부 시스템과의 통합: Azure 리소스에 자동 인증을 제공하는 Managed ID 는 모든 환경에서 사용할 수 있는 것이 아니다. 예를 들어, 옛날 서비스나 외부 시스템과의 통합에서는 Managed ID를 사용할 수 없는 경우가 있다. 이러한 경우 서비스 주체를 사용하여 인증을 수행해야 한다.

    ex) Azure 외부에서 호스팅되는 앱이 Azure 서비스에 데이터를 저장하거나 검색이 필요한 경우.
  2. 자동화 요구 사항: CI/CD 파이프 라인과 같은 자동화된 환경에서는 서비스 주체를 사용하여 Azure 리소스에 프로그래밍 방식으로 접근할 필요가 있다. 이러한 경우, 스크립트나 앱 코드 내에서 Azure 리소스를 관리할 수 있도록 서비스 주체를 사용할 필요가 있다.
(1) SPN 인증 다이어그램

Commands

시행착오를 거치면서, 서비스 주체 생성 및 RBAC 역할 할당 테스트에 사용한 명령어 최종본입니다.

# Variables
$TENANT_ID=(az account show | convertfrom-json).tenantId
$RESOURCE_GROUP_NAME="YourResourceGroupName"
$RESOURCE_GROUP_SCOPE=(az group show -n $RESOURCE_GROUP_NAME | convertfrom-json).id
$STORAGE_ACCOUNT_NAME="YourStorageAccountName"
$STORAGE_ACCOUNT_INFO=az storage account show -g $RESOURCE_GROUP_NAME -n $STORAGE_ACCOUNT_NAME | ConvertFrom-Json
$STORAGE_ACCOUNT_SCOPE=$STORAGE_ACCOUNT_INFO.id
$STORAGE_ACCOUNT_BLOB_ENDPOINT=$STORAGE_ACCOUNT_INFO.primaryEndpoints.blob
$BLOB_DATA_ROLE="Storage Blob Data Contributor"
$SPN_NAME="YourServicePrincipalName"
$SPN_ROLE="Contributor"

# Create a service principal and set environment variables
$SPN_INFO=az ad sp create-for-rbac `
--name $SPN_NAME `
--role $SPN_ROLE `
--scopes $RESOURCE_GROUP_SCOPE | convertfrom-json

# Set environment variables and assign roles after creating the service principal
$env:AZCOPY_SPA_CLIENT_SECRET=$SPN_INFO.password
$SPN_ID=$SPN_INFO.appId

# Create a role assignment for the service principal to access the storage account
az role assignment create `
--assignee $SPN_ID `
--role $BLOB_DATA_ROLE `
--scope $STORAGE_ACCOUNT_SCOPE

# Optional: Login to Azure CLI using the service principal
az login --service-principal `
-u $SPN_ID `
-p $env:AZCOPY_SPA_CLIENT_SECRET `
--tenant $TENANT_ID

# Login to AzCopy using the service principal
azcopy login --service-principal `
--application-id $SPN_ID `
--tenant-id $TENANT_ID

# Run AzCopy List
azcopy list $STORAGE_ACCOUNT_BLOB_ENDPOINT

서비스 주체 만들기

Create an Azure service principal with Azure CLI

아래의 명령어로 테스트용 SPN을 작성하고 리소스 그룹 범위를 지정하여 Contributor 역할을 할당한다.

# Variables
$TENANT_ID=(az account show | convertfrom-json).tenantId
$RESOURCE_GROUP_NAME="YourResourceGroupName"
$RESOURCE_GROUP_SCOPE=(az group show -n $RESOURCE_GROUP_NAME | convertfrom-json).id
$STORAGE_ACCOUNT_NAME="YourStorageAccountName"
$STORAGE_ACCOUNT_INFO=az storage account show -g $RESOURCE_GROUP_NAME -n $STORAGE_ACCOUNT_NAME | ConvertFrom-Json
$STORAGE_ACCOUNT_SCOPE=$STORAGE_ACCOUNT_INFO.id
$STORAGE_ACCOUNT_BLOB_ENDPOINT=$STORAGE_ACCOUNT_INFO.primaryEndpoints.blob
$BLOB_DATA_ROLE="Storage Blob Data Contributor"
$SPN_NAME="YourServicePrincipalName"
$SPN_ROLE="Contributor"

# Create a service principal and set environment variables
$SPN_INFO=az ad sp create-for-rbac `
--name $SPN_NAME `
--role $SPN_ROLE `
--scopes $RESOURCE_GROUP_SCOPE | convertfrom-json

# Set environment variables and assign roles after creating the service principal
$env:AZCOPY_SPA_CLIENT_SECRET=$SPN_INFO.password
$SPN_ID=$SPN_INFO.appId

서비스 주체를 생성하면 password 값이 표시된다. 한 번 생성된 시크릿 값은 이후 재확인이 불가능 하므로, 안전하게 보관하여 관리할 필요가 있다. 만약 시크릿 값을 분실한 경우 새로운 시크릿을 생성하여 각 앱 및 서비스에 재설정 해야하므로 주의한다.

Tip. 서비스 주체 생성 명령어를 다시 실행할 경우, 시크릿 값이 변경되므로 주의한다.

(2) SPN 비밀 정보
(3) Azure Portal SPN 비밀 정보 확인
(4) Azure Portal SPN 역할 할당 확인

Tip. 서비스 주체로 az login 이 가능하다.

# Azure CLI Login with service-principal (Optional)
az login --service-principal `
-u $SPN_ID `
-p $env:AZCOPY_SPA_CLIENT_SECRET `
--tenant $TENANT_ID
(1) 서비스 주체에 역할 할당 범위 안에서 조작이 가능해 진다.

AzCopy 서비스 주체 인증 사용법

Storage Account 리소스를 조작하기 위해서, 서비스 주체에 Storage Blob Data Contributor권한을 할당한다.

# Create a role assignment for the service principal to access the storage account
az role assignment create `
--assignee $SPN_ID `
--role $BLOB_DATA_ROLE `
--scope $STORAGE_ACCOUNT_SCOPE

서비스 주체 인증을 사용하여, azcopy login 명령어를 실행한다.

# Log out of the current AzCopy session to clear any existing login information.
azcopy logout

# AzCopy Login with service-principal
azcopy login --service-principal `
--application-id $SPN_ID `
--tenant-id $TENANT_ID
(1) 서비스 주체 인증 성공 확인

azcopy list 를 실행하여 Storage Account 참조가 가능한지 확인한다.

azcopy list $STORAGE_ACCOUNT_BLOB_ENDPOINT
(2) azcopy.txt 참조 확인