Azure Blobストレージの任意のコンテナに対してアクセス制限をかける例を記載する。
※基本的に全てCLIで行う。
AzureのBlobストレージは以下の通り構成される。
+ ストレージアカウント + ストレージコンテナ + Blobファイル
尚、この記事では下図の通り、特定のストレージコンテナに対して参照権限のみを有するユーザ用の環境を構築する。
+ ストレージアカウントA + ストレージコンテナ1 + ファイル1 + ファイル2 + ストレージコンテナ2 + ファイル1 + ファイル2
┐ | この範囲の参照のみ可能 ┘
Storage Explorer から Blobストレージにアクセスする場合、以下の方法でアクセス方法を追加する事ができるが、当記事では (1) (2) を使用して前述のアクセス制限を実現する環境を構築する。
No | アクセス方法 | 説明 |
1 | Azureアカウントを追加する | Azureアカウント情報を使用して参照/更新可能なストレージアカウントやコンテナを参照する方式 |
2 | AD(Active Directory)を使用してリソースを追加する | 1とほぼ同じだが、特定のコンテナのみをアタッチする事ができる |
3 | 接続文字列を使用する | ストレージアカウントの作成時に生成される接続文字列(ストレージアカウント及びキー)を使用して操作可能なリソースを参照/更新する方式 この方式の場合、ストレージアカウント配下の全てのリソースが参照/変更となる。 |
4 | Shared Access Signature(SAS) URI を使用する | TODO: |
5 | ストレージアカウント名とキーを使用する | 3と同じ |
6 | ローカルエミュレータにアタッチする | ローカルで起動しているストレージエミュレータにアタッチする |
az login
Azure CLI を使用して以下の通りリソースを作成する。
# リージョン region=japanwest # 各リソース名の接頭文字(少なくともストレージアカウント名は世界でユニークなIDになる必要あり) prefix=XXXXXX resourceGroup=${prefix}resourcegroup storageAccountName=${prefix}straccount1 storageContainer1=${prefix}strcontainer1 storageContainer2=${prefix}strcontainer2 storageSku=Standard_LRS # リソースグループの作成 echo "az group create ( $resourceGroup ) " az group create \ --name $resourceGroup \ --location $region # ストレージアカウントの作成 echo "az storage account create ( $storageAccountName )" az storage account create \ --name $storageAccountName \ --location $region \ --resource-group $resourceGroup \ --sku $storageSku # Storageコンテナ1の作成 echo "az storage container create ( $storageContainer1 )" az storage container create \ --name $storageContainer1 \ --resource-group $resourceGroup \ --account-name $storageAccountName # Storageコンテナ2の作成 echo "az storage container create ( $storageContainer2 )" az storage container create \ --name $storageContainer2 \ --resource-group $resourceGroup \ --account-name $storageAccountName # コンテナにファイルを追加 for ((i=1; i<=2; i++)); do echo "no: ${i}" cat <<_EOF1_ > sample${i}.txt sample${i} line1 sample${i} line2 _EOF1_ # コンテナ1に追加 echo "az storage blob upload ( sample${i}.txt -> $storageContainer1 )" az storage blob upload --account-name $storageAccountName -f sample${i}.txt -c $storageContainer1 -n sample${i}.txt # コンテナ2に追加 echo "az storage blob upload ( sample${i}.txt -> $storageContainer2 )" az storage blob upload --account-name $storageAccountName -f sample${i}.txt -c $storageContainer2 -n sample${i}.txt done
subscriptionId=XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXXX prefix=XXXXXX resourceGroup=${prefix}resourcegroup storageAccountName=${prefix}straccount1 storageContainer2=${prefix}strcontainer2 # ユーザの作成 userSp=sampleuser@devmagata.onmicrosoft.com az ad user create --display-name "sampleuser" --password "samplepw!" --user-principal-name $userSp # 作成したユーザにコンテナ2への参照権限を付与 echo "role create" az role assignment create \ --role "Storage Blob Data Reader" \ --assignee $userSp \ --scope "/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.Storage/storageAccounts/${storageAccountName}/blobServices/default/containers/$storageContainer2" # コンテナのURLを表示 echo "Container URL: https://${storageAccountName}.blob.core.windows.net/$storageContainer2"
ちなみに割り当てられるロールの一覧は以下のコマンドで確認できる。
az role definition list --out table
スコープについては https://docs.microsoft.com/ja-jp/azure/storage/common/storage-auth-aad-rbac-cli を参照。
ここまでの操作で対象のアカウントが追加されている事が確認できる。
引き続いてこのアカウント情報を利用してコンテナ2のみをアタッチしていく。
※権限の割当時に表示されたコンテナURLを入力する。
コンテナ2のみがアタッチされている事が確認できる。
ちなみに以下のコマンドでストレージアカウント自体の閲覧権限を付与すると、ストレージアカウント配下のコンテナ一覧も確認する事ができるようになる。
az role assignment create \ --role "Reader" \ --assignee $userSp \ --scope "/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
ただし、コンテナ1の方はBlobの閲覧権限を付与していないので、配下のデータを見ることはできない。