Tip. 테스트를 위한 준비 작업은 이전 포스팅에 기재되어 있습니다.
Storage Account: AzCopy 인증 방식 및 사용법 알아 보기 #1
Agenda
- 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
- Microsoft Entra ID 인증 방식
Authorize a service principal
이전 포스팅에서 분량 문제로 다루지 못했던 서비스 주체 (Service Principal) 인증 방식에 대해서 알아 본다.
서비스 주체를 이용한 인증 방식은 Azure Entra ID (=이전 Azure Active Directory) 내에서 앱 또는 서비스가 사용자의 상호 작용 없이 Azure 리소스에 접근할 수 있도록 Key, Secret 또는 인증서를 포함할 수 있다.
위의 인증 방식은 자동화와 통합에서 주로 사용되며, SMI (System Managed Identity)
와 같이 사용자의 개입 없이도 Azuer 리소스를 관리하고 조작할 수 있도록 지원한다.
서비스 주체 인증을 사용하는 경우
Microsoft 문서에서 언급된 경고는 서비스 주체를 사용할 때 방생할 수 있는 보안 문제에 대해서 주의하고 있다.
서비스 주체를 생성하고, 이 과정에서 생성되는 인증 정보 (Credential) 는 안전하게 관리되어야 한다. Managed ID를 사용할 수 있는 경우라면 서비스 주체를 사용하지 않는 것이 보안적인 측면에서는 효율적이다. 하지만, 어쩔 수 없이 서비스 주체를 사용하여 인증 정보를 관리 할 필요가 있는 경우가 존재한다.
- Azure 외부 시스템과의 통합: Azure 리소스에 자동 인증을 제공하는 Managed ID 는 모든 환경에서 사용할 수 있는 것이 아니다. 예를 들어, 옛날 서비스나 외부 시스템과의 통합에서는 Managed ID를 사용할 수 없는 경우가 있다. 이러한 경우 서비스 주체를 사용하여 인증을 수행해야 한다.
ex) Azure 외부에서 호스팅되는 앱이 Azure 서비스에 데이터를 저장하거나 검색이 필요한 경우. - 자동화 요구 사항: CI/CD 파이프 라인과 같은 자동화된 환경에서는 서비스 주체를 사용하여 Azure 리소스에 프로그래밍 방식으로 접근할 필요가 있다. 이러한 경우, 스크립트나 앱 코드 내에서 Azure 리소스를 관리할 수 있도록 서비스 주체를 사용할 필요가 있다.
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. 서비스 주체 생성 명령어를 다시 실행할 경우, 시크릿 값이 변경되므로 주의한다.
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
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
azcopy list
를 실행하여 Storage Account 참조가 가능한지 확인한다.
azcopy list $STORAGE_ACCOUNT_BLOB_ENDPOINT