Azure Files で構築したファイル共有の共有レベルのアクセス権設定をPowerShellで行う手順を紹介します。
共有のアクセス権設定といっても実態はロールの割り当てです。ロール割り当ての基本的な手順やコマンドは以下でも説明していますので、このエントリでは共有のアクセス権設定に特化した内容として備忘録を残しておきます。
-
【Azure】ロールの割り当ての設定。PowerShellでも可能!
Azure でロールの割り当てをPowerShellで行う方法ともうちょっと頑張れば自動化できるようになるところまでを備忘録として記録します。 前置きですが、これに至る経緯として 今回 仮想デスクトッ ...
前提事項
前提として、ストレージアカウントをADDS認証、AzureADDS認証を有効化している前提です。有効化していない場合、アクセス制御はできません。
まだAD認証を有効化していない場合は、以下を参照してAD認証を有効化しておきましょう。
-
【Azure Files】ファイル共有をAD認証を有効化してアクセス権管理
Azure Files をファイルサーバ(ファイル共有)として利用する場合、アクセス権管理のためにAD(ADDS)認証、またはAzureADDS認証を利用することになると思います。 いずれかの認証を有 ...
また、ファイル共有を作成していない場合は、以下のエントリでPowerShellでファイル共有を作成する手順を紹介していますのでどうぞ。
-
【Azure Files】ファイル共有をPowerShellで作成する。CSV読み込みもOK!
Azure Files のファイル共有を作成する際、ひとつふたつくらいならGUIで作成したほうが早いかもしれませんが、大量に作成するような場合はPowerShellで作成する選択肢もあるとよいですよね ...
ファイル共有の共有レベルのアクセス権設定をPowerShellで行う
基本の構文
基本のコマンドは以下です。
1 2 3 4 |
$ObjectId = "ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ" $roleName = "Storage File Data SMB Share Elevated Contributor" $scope = "/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0001" New-AzRoleAssignment -ObjectId $ObjectId -RoleDefinitionName $roleName -Scope $scope |
オプション
-ObjectId | ユーザまたはグループ |
-RoleDefinitionName | ロールの名前 |
-Scope | 割り当て先のファイル共有またはストレージアカウント |
指定するオブジェクトIDやロール名、スコープの確認の方法などを説明していきます。
割り当てるアカウントを確認
New-AzRoleAssignmentコマンドの引数にわたす際はObjectIdとして指定するため、対象ユーザーやグループの "Id" を確認します。
- ユーザーの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
PS > Get-AzADUser -StartsWith pig-admin UserPrincipalName : pig-admin@pig-log.com ObjectType : User UsageLocation : GivenName : Surname : AccountEnabled : True MailNickname : pig-admin Mail : DisplayName : pig-admin Id ★ : ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ Type : Member |
- グループの場合
1 2 3 4 5 6 7 8 9 10 |
PS > Get-AzADGroup -DisplayName pig-group SecurityEnabled : True MailNickname : pig-group ObjectType : Group Description : 動作確認用 DisplayName : pig-group Id ★ : ZZZZZZZZ-ZZZZ-ZZZZ-ZZZZ-ZZZZZZZZZZZZ Type : |
ここで確認した Id を New-AzRoleAssignment コマンドのオプション"-ObjectId"の引数に渡します。
ロール名を確認
以下のコマンドでロールの一覧を取得できます。そこから、ロール名に "share" を含むロールを抽出します。
1 2 3 4 5 6 7 |
PS > Get-AzRoleDefinition | where { $_.Name -like "*share*" } |ft name Name ---- Storage File Data SMB Share Reader # 記憶域ファイル データの SMB 共有の閲覧者 Storage File Data SMB Share Contributor # 記憶域ファイル データの SMB 共有の共同作成者 Storage File Data SMB Share Elevated Contributor # 記憶域ファイル データの SMB 共有の管理者特権の共同作成者 |
ここで確認した名称をオプション"-RoleDefinitionName" の引数に渡します。
割り当てるスコープの確認
ストレージアカウントを取得
- 名前でリソースを検索する場合(例として、ストレージアカウント名の前方一致で検索)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
PS > Get-AzResource |where { $_.Name -like "stpigfile*" } Name : stpigfile0001 ResourceGroupName : rg1_pigintra ResourceType : Microsoft.Storage/storageAccounts Location : japaneast ResourceId : /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0001 Tags : Name : stpigfile0002 ResourceGroupName : rg1_pigintra ResourceType : Microsoft.Storage/storageAccounts Location : japaneast ResourceId : /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0002 Tags : |
- ストレージアカウントをすべて抽出する場合は、「ResourceType」を使用(CloudShell用とか他用途のストレージアカウントも出てくる)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
PS > Get-AzResource |where { $_.ResourceType -match "storageAccounts" } Name : cs110032001243861b1 ResourceGroupName : cloud-shell-storage-southeastasia ResourceType : Microsoft.Storage/storageAccounts Location : southeastasia ResourceId : /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/cloud-shell-storage-southeastasia/providers/Microsoft.Storage/storageAccounts/cs110032001243861b1 Tags : Name Value ================= ================= ms-resource-usage azure-cloud-shell Name : strcldshell1 ResourceGroupName : NetworkWatcherRG ResourceType : Microsoft.Storage/storageAccounts Location : southeastasia ResourceId : /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/NetworkWatcherRG/providers/Microsoft.Storage/storageAccounts/strcldshell1 Tags : Name Value ================= ================= ms-resource-usage azure-cloud-shell Name : stpigfile0001 ResourceGroupName : rg1_pigintra ResourceType : Microsoft.Storage/storageAccounts Location : japaneast ResourceId : /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0001 Tags : Name : stpigfile0002 ResourceGroupName : rg1_pigintra ResourceType : Microsoft.Storage/storageAccounts Location : japaneast ResourceId : /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0002 Tags : |
ここで確認した ResourceId をオプション"-Scope"の引数に渡します。
ファイル共有を取得
以下のコマンドで、ストレージアカウントに作成されているファイル共有を確認することができます。
1 2 3 4 5 6 7 8 9 |
PS > Get-AzRmStorageShare -ResourceGroupName rg1_pigintra -StorageAccountName stpigfile0001 ResourceGroupName: rg1_pigintra, StorageAccountName: stpigfile0001 Name QuotaGiB EnabledProtocols AccessTier Deleted Version ShareUsageBytes snapshotTime ---- -------- ---------------- ---------- ------- ------- --------------- ------------ test-root1 5120 SMB TransactionOptimized test-root2 5120 SMB TransactionOptimized |
ファイル共有の詳細を確認してみる。IDも確認できるが、ロール割り当てのスコープとして指定する場合は「fileServices/default/shares/test-root1」の shares → fileshares と指定する必要があるようです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
PS > Get-AzRmStorageShare -ResourceGroupName rg1_pigintra -StorageAccountName stpigfile0001 |fl * ResourceGroupName : rg1_pigintra StorageAccountName : stpigfile0001 Id ★ : /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0001/fileServices/default/shares/test-root1 Name : test-root1 Type : Microsoft.Storage/storageAccounts/fileServices/shares Etag : "0x8DAC44F6A2E2230" QuotaGiB : 5120 Metadata : LastModifiedTime : 2022/11/12 1:44:18 Version : Deleted : DeletedTime : RemainingRetentionDays : EnabledProtocols : SMB RootSquash : AccessTier : TransactionOptimized AccessTierChangeTime : 2022/10/17 7:30:30 AccessTierStatus : ShareUsageBytes : SnapshotTime : ResourceGroupName : rg1_pigintra StorageAccountName : stpigfile0001 Id ★ : /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0001/fileServices/default/shares/test-root2 Name : test-root2 Type : Microsoft.Storage/storageAccounts/fileServices/shares Etag : "0x8DAB191DBB1814E" QuotaGiB : 5120 Metadata : LastModifiedTime : 2022/10/19 5:22:04 Version : Deleted : DeletedTime : RemainingRetentionDays : EnabledProtocols : SMB RootSquash : AccessTier : TransactionOptimized AccessTierChangeTime : 2022/10/19 5:22:03 AccessTierStatus : ShareUsageBytes : SnapshotTime : |
ロールの割り当て
基本的な割り当てのコマンドとしては、上述の通りです。
割り当てるのがユーザーの場合はObjectIDの指定ではなく、UserPrincipalName、SignInName でも可能です。グループの場合はObjectidを取得して指定するしかなさそう。
ストレージアカウントへの割り当て
- UserPrincipalName を指定
1234567891011# ユーザー名$userPrincipalName = "hogeuser@pig-log.com"# ロール名$roleName = "Storage File Data SMB Share Elevated Contributor"#スコープ$scope = "/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0001"# 設定New-AzRoleAssignment -UserPrincipalName $userPrincipalName -RoleDefinitionName $roleName -Scope $scope - SignInNameを指定
1234567891011# ユーザー名$SignInName = "hogeuser@pig-log.com"# ロール名$roleName = "Storage File Data SMB Share Elevated Contributor"#スコープ$scope = "/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/rg1_pigintra/providers/Microsoft.Storage/storageAccounts/stpigfile0001"# 設定New-AzRoleAssignment -SignInName $SignInName -RoleDefinitionName $roleName -Scope $scope
ファイル共有への割り当て
上でも少し触れましたが、「Get-AzRmStorageShare」で確認したファイル共有のIdを直接スコープとして指定することはできず、ロール割り当てのスコープとして指定する場合は「fileServices/default/shares/sync-test1」の shares → fileshares と指定する必要があります。
Idを指定する方法はストレージアカウントのResourceIDに『/fileServices/default/fileshares/<ファイル共有名>』を付与します。
- ストレージアカウントのResourceID
1/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/<リソースグループ名>/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>
- ファイル共有をスコープとして指定する場合以下のようになる
1/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/<リソースグループ名>/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>/fileServices/default/fileshares/<ファイル共有名>
以下が実行用のコマンドとなる(スコープの値だけ変更)
1 2 3 4 5 6 7 8 9 10 11 |
# ユーザー名 $userPrincipalName = "hogeuser@pig-log.com" # ロール名 $roleName = "Storage File Data SMB Share Elevated Contributor" #スコープ $scope = "/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/<リソースグループ名>/providers/Microsoft.Storage/storageAccounts/<ストレージアカウント名>/fileServices/default/fileshares/<ファイル共有名>" # 設定 New-AzRoleAssignment -UserPrincipalName $userPrincipalName -RoleDefinitionName $roleName -Scope $scope |
すべての認証済み ID に対する共有レベルのアクセス許可
ここで設定したアクセス許可をAD認証されたすべてのユーザーに適用する設定(AzureADのユーザーやグループ単位ではなく)です。ですので、上記で説明した「New-AzRoleAssignment」で特定のユーザー、グループを許可するのか、ここの設定ですべてのユーザーに許可するのか、のどちらかを設定することになります。
対象となるスコープはストレージアカウントになりますのでファイル共有単位で異なる設定とすることはできず統一する必要があります。
GUI(ポータル)での設定箇所は以下の通りです。
デフォルトでは無効 Disable となっているので、必要に応じて有効化およびロールを指定します。
コマンド実行時に指定するデフォルトパーミッションは以下となります。GUI で表示されるものと同じです。
None | 無効 |
StorageFileDataSmbShareReader | 読み取り |
StorageFileDataSmbShareContributor | 変更 |
StorageFileDataSmbShareElevatedContributor | フルコントロール |
上記を踏まえて、以下が実行用コマンドです。
1 2 3 4 5 6 7 8 9 10 11 |
# デフォルトパーミッション $defaultPermission = "XXXXXXXXXXXXXXXXXXXXXXXXX" # リソースグループ名 $resourceGroupName = "YYYYYYYYYYYYY" # ストレージアカウント名 $storageAccountName = "ZZZZZZZZZZZZZ" # 設定 Set-AzStorageAccount -ResourceGroupName $resourceGroupName -AccountName $storageAccountName -DefaultSharePermission $defaultPermission |
※『Set-AzStorageAccount』コマンドを実行するためには、Az.Storage モジュールのバージョンが 3.7.0 以降である必要があるようです。
以下バージョンの環境で実行したら -DefaultSharePermission のオプションが存在しませんでした。
1 |
3.5.1 Az.Storage |
Azモジュールのアップデート手順は以下のエントリでまとめています。
-
【Azure】Az PowerShell モジュールを更新(アップデート)できない
AzureFilesのパラメータを更新するために、Az.storage モジュールのバージョンをアップデートする必要があったものの、いくら『Update-Module -Name Az』を実行してもア ...
では。