#mynavi(Azureメモ)
#setlinebreak(on);

* 概要 [#m393c819]
#html(<div class="pl10">)
Azure Blobストレージの任意のコンテナに対してアクセス制限をかける例を記載する。
※基本的に全てCLIで行う。
#html(</div>)

* 目次 [#r88bfee2]
#contents
- 関連
-- [[Azureメモ]]
-- [[Azure CLI の操作]]
-- [[Azure FunctionsからVMにアクセスする]]
- 参照
-- [[Azure CLI を使用して、BLOB およびキュー データにアクセスするための RBAC ロールを割り当てる:https://docs.microsoft.com/ja-jp/azure/storage/common/storage-auth-aad-rbac-cli]]
-- [[Azure CLI を使用して Azure でのロールの割り当てを追加または削除する:https://docs.microsoft.com/ja-jp/azure/role-based-access-control/role-assignments-cli]]

* Blobストレージの構成 [#j6dcdeda]
#html(<div class="pl10">)

AzureのBlobストレージは以下の通り構成される。

#html(){{
<pre style="margin: 0; display: inline-block; font-size: 1rem; background: transparent; border: 1px solid #333;">
+ ストレージアカウント
    + ストレージコンテナ
        + Blobファイル
</pre>
}}

#html(</div>)
// Blobストレージの基本構成

* この記事で構成するアクセス制限 [#j885de86]
#html(<div class="pl10">)

尚、この記事では下図の通り、特定のストレージコンテナに対して参照権限のみを有するユーザ用の環境を構築する。
この記事では下図の通り、特定のストレージコンテナに対して参照権限のみを有するユーザ用の環境を構築する。
#html(){{
<div style="border: 1px solid #333; display: inline-block;">
<pre style="margin: 0; display: inline-block; font-size: 1rem; background: transparent; border: 0;">
+ ストレージアカウントA
    + ストレージコンテナ1
        + ファイル1
        + ファイル2
    + ストレージコンテナ2
        + ファイル1
        + ファイル2
</pre>
<pre style="margin: 0; display: inline-block; font-size: 1rem; background: transparent; border: 0;">
 
 
 

  
┐
| この範囲の参照のみ可能
┘
</pre>
</div>
}}

#html(</div>)
// この記事で構成するアクセス制限

* Blobストレージへのアクセス方法 [#nfc6d2f7]
#html(<div class="pl10">)

Storage Explorer から Blobストレージにアクセスする場合、以下の方法でアクセス方法を追加する事ができるが、当記事では (1) (2) を使用して前述のアクセス制限を実現する環境を構築する。

| No | アクセス方法 | 説明 |h
| 1 | Azureアカウントを追加する | Azureアカウント情報を使用して参照/更新可能なストレージアカウントやコンテナを参照する方式 |
| 2 | AD(Active Directory)を使用してリソースを追加する | 1とほぼ同じだが、特定のコンテナのみをアタッチする事ができる |
| 3 | 接続文字列を使用する | ストレージアカウントの作成時に生成される接続文字列(ストレージアカウント及びキー)を使用して操作可能なリソースを参照/更新する方式&br; この方式の場合、ストレージアカウント配下の全てのリソースが参照/変更となる。 |
| 4 | Shared Access Signature(SAS) URI を使用する | TODO:  |
| 5 |ストレージアカウント名とキーを使用する | 3と同じ |
| 6 | ローカルエミュレータにアタッチする | ローカルで起動しているストレージエミュレータにアタッチする |

#html(</div>)

* 環境構築 [#u42f6782]
#html(<div class="pl10">)

** ログイン [#b3a6d9ef]
#html(<div class="pl10">)
#myterm2(){{
az login
}}
#html(</div>)

** リソースの作成 [#b95f6ad0]
#html(<div class="pl10">)
Azure CLI を使用して以下の通りリソースを作成する。


#myterm2(){{

# リージョン
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
}}

#html(</div>)

** ユーザの作成 及び 権限の割当 [#bdfe1a3b]
#html(<div>)

#myterm2(){{
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"
}}

ちなみに割り当てられるロールの一覧は以下のコマンドで確認できる。
#myterm2(){{
az role definition list --out table
}}
スコープについては https://docs.microsoft.com/ja-jp/azure/storage/common/storage-auth-aad-rbac-cli を参照。

#html(</div>)


#html(</div>)

* Storage Explorer の設定 [#o2f95331]
#html(<div class="pl10">)

#html(){{
<style>
.strexp_images div { vertical-align: top; }
.strexp_images img { border: 1px solid #333; margin-right: 20px; }
</style>
}}

#html(<div class="strexp_images"><div class="ib">)
&ref(strex1.png,nolink);
#html(</div><div class="ib">)
&ref(strex2.png,nolink);
#html(</div><div class="ib">)
&ref(strex3.png,nolink);
#html(</div><div class="ib">)
作成したユーザのプリンシパル名を入力し Sign in。
&ref(strex4.png,nolink);
#html(</div><div class="ib">)
Next押下すると Microsoft Authenticator による認証を求められる。 ※skipも可能(14日間)
&ref(strex5.png,nolink);
#html(</div>)

ここまでの操作で対象のアカウントが追加されている事が確認できる。
#html(<div class="ib">)
&ref(strex6.png,nolink);
#html(</div>)

引き続いてこのアカウント情報を利用してコンテナ2のみをアタッチしていく。
#html(<div class="ib">)
&ref(strex1.png,nolink);
#html(</div><div class="ib">)
&ref(strex7.png,nolink);
#html(</div><div class="ib">)
&ref(strex8.png,nolink);
#html(</div><div class="ib">)
&ref(strex9.png,nolink);
※権限の割当時に表示されたコンテナURLを入力する。
#html(</div><div class="ib">)
&ref(strexA.png,nolink);
#html(</div>)
#html(<div>)
コンテナ2のみがアタッチされている事が確認できる。
&ref(strexB.png,nolink);
#html(</div></div>)

ちなみに以下のコマンドでストレージアカウント自体の閲覧権限を付与すると、ストレージアカウント配下のコンテナ一覧も確認する事ができるようになる。
#myterm2(){{
az role assignment create \
    --role "Reader" \
    --assignee $userSp \
    --scope "/subscriptions/${subscriptionId}/resourceGroups/${resourceGroup}/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
}}

#html(<div class="strexp_images">)
&ref(strexC.png,nolink);
#html(</div>)

#html(<div class="strexp_images">)
ただし、コンテナ1の方はBlobの閲覧権限を付与していないので、配下のデータを見ることはできない。
&ref(strexD.png,nolink);
#html(</div>)



#html(</div>)

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS