Azure Storage Accounts는 Microsoft Azure의 기본 서비스로, 다양한 데이터 유형에 대한 확장 가능하고 안전하며 고가용성의 클라우드 스토리지를 제공합니다, 여기에는 blobs(이진 대용량 객체), 파일, 큐 및 테이블이 포함됩니다. 이들은 이러한 다양한 스토리지 서비스를 단일 네임스페이스 아래에서 쉽게 관리할 수 있도록 그룹화하는 컨테이너 역할을 합니다.
주요 구성 옵션:
모든 스토리지 계정은 Azure 전역에서 유일한 이름을 가져야 합니다.
모든 스토리지 계정은 지역 또는 Azure 확장 영역에 배포됩니다.
더 나은 성능을 위해 스토리지 계정의 프리미엄 버전을 선택할 수 있습니다.
랙, 드라이브 및 데이터 센터의 장애로부터 보호하기 위해 4가지 유형의 중복성 중에서 선택할 수 있습니다.
보안 구성 옵션:
REST API 작업에 대한 보안 전송 요구: 스토리지와의 모든 통신에서 TLS 요구
개별 컨테이너에서 익명 액세스 허용: 그렇지 않으면 향후 익명 액세스를 활성화할 수 없습니다.
스토리지 계정 키 액세스 활성화: 그렇지 않으면 공유 키로의 액세스가 금지됩니다.
최소 TLS 버전
복사 작업에 대한 허용 범위: 모든 스토리지 계정, 동일한 Entra 테넌트의 모든 스토리지 계정 또는 동일한 가상 네트워크의 개인 엔드포인트가 있는 스토리지 계정에서 허용합니다.
Blob Storage 옵션:
크로스 테넌트 복제 허용
액세스 계층: 핫(자주 액세스되는 데이터), 쿨 및 콜드(드물게 액세스되는 데이터)
네트워킹 옵션:
네트워크 액세스:
모든 네트워크에서 허용
선택된 가상 네트워크 및 IP 주소에서 허용
공용 액세스를 비활성화하고 개인 액세스를 사용
개인 엔드포인트: 가상 네트워크에서 스토리지 계정으로의 개인 연결을 허용합니다.
데이터 보호 옵션:
컨테이너에 대한 시점 복원: 컨테이너를 이전 상태로 복원할 수 있습니다.
버전 관리, 변경 피드 및 blob 소프트 삭제가 활성화되어야 합니다.
blob에 대한 소프트 삭제 활성화: 삭제된 blob(덮어쓴 경우에도)에 대한 보존 기간을 일수로 설정합니다.
컨테이너에 대한 소프트 삭제 활성화: 삭제된 컨테이너에 대한 보존 기간을 일수로 설정합니다.
파일 공유에 대한 소프트 삭제 활성화: 삭제된 파일 공유에 대한 보존 기간을 일수로 설정합니다.
blob에 대한 버전 관리 활성화: 이전 버전의 blob을 유지합니다.
blob 변경 피드 활성화: blob의 생성, 수정 및 삭제 변경 사항을 기록합니다.
버전 수준 불변성 지원 활성화: 모든 blob 버전에 적용될 계정 수준의 시간 기반 보존 정책을 설정할 수 있습니다.
버전 수준 불변성 지원과 컨테이너에 대한 시점 복원은 동시에 활성화할 수 없습니다.
암호화 구성 옵션:
암호화 유형: Microsoft 관리 키(MMK) 또는 고객 관리 키(CMK)를 사용할 수 있습니다.
공유 액세스 서명(SAS)은 Azure Storage 계정의 리소스에 대한 특정 권한을 부여하는 안전하고 시간 제한된 URL로, 계정의 액세스 키를 노출하지 않습니다. 액세스 키는 모든 리소스에 대한 전체 관리 액세스를 제공하는 반면, SAS는 권한(읽기 또는 쓰기와 같은)을 지정하고 만료 시간을 정의하여 세분화된 제어를 허용합니다.
SAS 유형
사용자 위임 SAS: 이는 Entra ID 주체에서 생성되며, SAS에 서명하고 사용자로부터 SAS로 권한을 위임합니다. Blob 및 데이터 레이크 스토리지와 함께 사용될 수 있습니다 (docs). 생성된 모든 사용자 위임 SAS를 철회할 수 있습니다.
사용자가 가진 것보다 "더 많은" 권한으로 위임 SAS를 생성하는 것이 가능하지만, 주체가 해당 권한을 가지지 않으면 작동하지 않습니다(권한 상승 없음).
서비스 SAS: 이는 스토리지 계정의 액세스 키 중 하나를 사용하여 서명됩니다. 단일 스토리지 서비스의 특정 리소스에 대한 액세스를 부여하는 데 사용할 수 있습니다. 키가 갱신되면 SAS는 작동을 멈춥니다.
계정 SAS: 이는 스토리지 계정의 액세스 키 중 하나로 서명됩니다. 스토리지 계정 서비스(Blob, Queue, Table, File) 전반에 걸쳐 리소스에 대한 액세스를 부여하며 서비스 수준 작업을 포함할 수 있습니다.
Azure Blob Storage는 이제 SSH 파일 전송 프로토콜(SFTP)을 지원하여 사용자 정의 솔루션이나 타사 제품 없이 Blob Storage에 직접 안전한 파일 전송 및 관리를 가능하게 합니다.
주요 기능
프로토콜 지원: SFTP는 계층적 네임스페이스(HNS)로 구성된 Blob Storage 계정과 함께 작동합니다. 이는 블롭을 디렉터리 및 하위 디렉터리로 구성하여 탐색을 용이하게 합니다.
보안: SFTP는 인증을 위해 로컬 사용자 신원을 사용하며 RBAC 또는 ABAC와 통합되지 않습니다. 각 로컬 사용자는 다음을 통해 인증할 수 있습니다:
Azure에서 생성된 비밀번호
공개-개인 SSH 키 쌍
세분화된 권한: 읽기, 쓰기, 삭제 및 목록과 같은 권한을 최대 100개의 컨테이너에 대해 로컬 사용자에게 할당할 수 있습니다.
네트워킹 고려 사항: SFTP 연결은 포트 22를 통해 이루어집니다. Azure는 SFTP 트래픽을 보호하기 위해 방화벽, 개인 엔드포인트 또는 가상 네트워크와 같은 네트워크 구성을 지원합니다.
설정 요구 사항
계층적 네임스페이스: 스토리지 계정을 생성할 때 HNS를 활성화해야 합니다.
지원되는 암호화: Microsoft 보안 개발 수명 주기(SDL) 승인 암호화 알고리즘(예: rsa-sha2-256, ecdsa-sha2-nistp256)이 필요합니다.
SFTP 구성:
스토리지 계정에서 SFTP를 활성화합니다.
적절한 권한을 가진 로컬 사용자 신원을 생성합니다.
사용자의 시작 위치를 정의하기 위해 사용자에 대한 홈 디렉터리를 구성합니다.
권한
권한
기호
설명
읽기
r
파일 내용을 읽습니다.
쓰기
w
파일을 업로드하고 디렉터리를 생성합니다.
목록
l
디렉터리의 내용을 나열합니다.
삭제
d
파일 또는 디렉터리를 삭제합니다.
생성
c
파일 또는 디렉터리를 생성합니다.
소유권 수정
o
소유 사용자 또는 그룹을 변경합니다.
권한 수정
p
파일 또는 디렉터리의 ACL을 변경합니다.
열거
# Get storage accountsazstorageaccountlist#Get the account name from here# BLOB STORAGE## List containersazstoragecontainerlist--account-name<name>## Check if public access is allowedazstoragecontainershow-permission \--account-name <acc-name> \-n <container-name>## Make a container publicazstoragecontainerset-permission \--public-access container \--account-name <acc-name> \-n <container-name>## List blobs in a containerazstoragebloblist \--container-name <containername> \--account-name <accountname>## Download blobazstorageblobdownload \--account-name <accountname> \--container-name <containername> \--name <blobname> \--file </path/to/local/file>## Create container policyazstoragecontainerpolicycreate \--account-name mystorageaccount \--container-name mycontainer \--name fullaccesspolicy \--permissions racwdl \--start 2023-11-22T00:00Z \--expiry 2024-11-22T00:00Z# QUEUEazstoragequeuelist--account-name<name>azstoragemessagepeek--account-name<name>--queue-name<queue-name># ACCESS KEYSazstorageaccountkeyslist--account-name<name>## Check key policies (expiration time?)azstorageaccountshow-n<name>--query"{KeyPolicy:keyPolicy}"## Once having the key, it's possible to use it with the argument --account-key## Enum blobs with account keyazstoragebloblist \--container-name <containername> \--account-name <accountname> \--account-key "ZrF40pkVKvWPUr[...]v7LZw=="## Download a file using an account keyazstorageblobdownload \--account-name <accountname> \--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \--container-name <containername> \--name <blobname> \--file </path/to/local/file>## Upload a file using an account keyazstorageblobupload \--account-name <accountname> \--account-key "ZrF40pkVKvWPUr[...]v7LZw==" \--container-name <containername> \--file </path/to/local/file># SAS## List access policiesazstorage<container|queue|share|table> policylist \--account-name <accname> \--container-name <containername>## Generate SAS with all permissions using an access keyazstorage<container|queue|share|table|blob> generate-sas \--permissions acdefilmrtwxy \--expiry 2024-12-31T23:59:00Z \--account-name <acc-name> \-n <container-name>## Generate SAS with all permissions using via user delegationazstorage<container|queue|share|table|blob> generate-sas \--permissions acdefilmrtwxy \--expiry 2024-12-31T23:59:00Z \--account-name <acc-name> \--as-user --auth-modelogin \-n <container-name>## Generate account SASazstorageaccountgenerate-sas \--expiry 2024-12-31T23:59:00Z \--account-name <acc-name> \--services qt \--resource-types sco \--permissions acdfilrtuwxy## Use the returned SAS key with the param --sas-token## e.g.azstorageblobshow \--account-name <accountname> \--container-name <containername> \--sas-token 'se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D' \--name 'asd.txt'#Local-Users## List usersazstorageaccountlocal-userlist \--account-name <storage-account-name> \--resource-group <resource-group-name>## Get userazstorageaccountlocal-usershow \--account-name <storage-account-name> \--resource-group <resource-group-name> \--name <local-user-name>## List keysazstorageaccountlocal-userlist \--account-name <storage-account-name> \--resource-group <resource-group-name>
# Get storage accountsGet-AzStorageAccount| fl# Get rules to access the storage accountGet-AzStorageAccount| select -ExpandProperty NetworkRuleSet# Get IPs(Get-AzStorageAccount| select -ExpandProperty NetworkRuleSet).IPRules# Get containers of a storage accountGet-AzStorageContainer-Context (Get-AzStorageAccount-name <NAME>-ResourceGroupName <NAME>).context# Get blobs inside containerGet-AzStorageBlob-Container epbackup-planetary -Context (Get-AzStorageAccount-name <name>-ResourceGroupName <name>).context# Get a blob from a containerGet-AzStorageBlobContent-Container <NAME>-Context (Get-AzStorageAccount-name <NAME>-ResourceGroupName <NAME>).context -Blob <blob_name>-Destination .\Desktop\filename.txt# Create a Container PolicyNew-AzStorageContainerStoredAccessPolicy`-Context (Get-AzStorageAccount-Name <NAME>-ResourceGroupName <NAME>).Context `-Container <container-name>`-Policy <policy-name>`-Permission racwdl `-StartTime (Get-Date"2023-11-22T00:00Z") `-ExpiryTime (Get-Date"2024-11-22T00:00Z")#Get Container policyGet-AzStorageContainerStoredAccessPolicy`-Context (Get-AzStorageAccount-Name <NAME>-ResourceGroupName <NAME>).Context `-Container "storageaccount1994container"# Queue ManagementGet-AzStorageQueue-Context (Get-AzStorageAccount-Name <NAME>-ResourceGroupName <NAME>).Context(Get-AzStorageQueue-Name <NAME>-Context (Get-AzStorageAccount-name <NAME>-ResourceGroupName <NAME>).Context).QueueClient.PeekMessage().Value#Blob ContainerGet-AzStorageBlob-Container <container-name>-Context $(Get-AzStorageAccount-name "teststorageaccount1998az"-ResourceGroupName "testStorageGroup").ContextGet-AzStorageBlobContent`-Container <container-name>`-Blob <blob-name>`-Destination <local-path>`-Context $(Get-AzStorageAccount-name "teststorageaccount1998az"-ResourceGroupName "testStorageGroup").ContextSet-AzStorageBlobContent`-Container <container-name>`-File <local-file-path>`-Blob <blob-name>`-Context $(Get-AzStorageAccount-name "teststorageaccount1998az"-ResourceGroupName "testStorageGroup").Context# Shared Access Signatures (SAS)Get-AzStorageContainerAcl`-Container <container-name>`-Context (Get-AzStorageAccount-Name <NAME>-ResourceGroupName <NAME>).ContextNew-AzStorageBlobSASToken`-Context $ctx `-Container <container-name>`-Blob <blob-name>`-Permission racwdl `-ExpiryTime (Get-Date"2024-12-31T23:59:00Z")