この記事では、Azure CLIを使ってディレクトリやファイルのアクセス制御リスト(ACL)を取得し、設定し、更新する方法を紹介します。
新しい子項目は自動的にACLを継承します。 しかし、既存の子項目に対して個別に変更を加えることなく、再帰的にACLを追加・更新・削除することも可能です。
参照 | サンプル | フィードバックの提供
前提条件
Azure サブスクリプション。 詳細については、Azure 無料試用版の取得に関するページを参照してください。
階層型名前空間が有効になっているストレージ アカウント。 手順については、「 階層的な名前空間を持つストレージアカウントを作成」を参照してください。
Azure CLI バージョン
2.14.0以上。以下のセキュリティ アクセス許可のいずれか:
プロビジョニング済みの Microsoft Entra ID のセキュリティ プリンシパルで、ターゲット コンテナー、ストレージ アカウント、親リソース グループ、またはサブスクリプションをスコープとしてStorage Blob Data Ownerロールが割り当てられているもの。
ACL 設定を適用する予定のターゲット コンテナーまたはディレクトリの所有ユーザー。 ACLを再帰的に設定するには、このユーザーはターゲットコンテナやディレクトリ内のすべての子項目を含みます。
正しいバージョンの Azure CLI がインストールされていることを確認する
Azure Cloud Shellを開くか、Azure CLIをローカルにインストールしている場合は、Windows PowerShellのようなコマンドコンソールアプリケーションを開いてください。
次のコマンドを使用して、インストールされている Azure CLI のバージョンが
2.14.0以上であることを確認します。az --versionもしAzure CLIのバージョンが
2.14.0より低い場合は、より後のバージョンをインストールしてください。 詳細については、「 Azure CLI のインストール」を参照してください。
アカウントに接続する
Azure CLI をローカルで使用している場合は、login コマンドを実行します。
az loginCLIがデフォルトのブラウザを開けるなら、ブラウザを開いてAzureのサインインページを読み込みます。
それ以外の場合は、 https://aka.ms/devicelogin でブラウザー ページを開き、ターミナルに表示されている認証コードを入力します。 次に、ブラウザーでアカウントの資格情報を使用してサインインします。
さまざまな認証方法の詳細については、「Azure CLI を使用して BLOB またはキュー データへのアクセスを承認する」を参照してください。
もしあなたのアイデンティティが複数のサブスクリプションに紐づいていて、サブスクリプションを選択するよう促さない場合は、アクティブなサブスクリプションを使いたいストレージアカウントのサブスクリプションに設定してください。 この例では、
<subscription-id>プレースホルダーの値をサブスクリプションの ID に置き換えます。az account set --subscription <subscription-id>
ACL を取得する
az storage fs access show コマンドで ディレクトリの ACL を取得します。
この例では、ディレクトリの ACL を取得して、その ACL をコンソールに出力します。
az storage fs access show -p my-directory -f my-container --account-name mystorageaccount --auth-mode login
az storage fs access show コマンドでファイルのアクセス許可を取得します。
この例では、ファイルの ACL を取得して、その ACL をコンソールに出力します。
az storage fs access show -p my-directory/upload.txt -f my-container --account-name mystorageaccount --auth-mode login
次の画像は、ディレクトリの ACL を取得した後の出力を示しています。
この例では、所有ユーザーには読み取り、書き込み、実行のアクセス許可があります。 所有グループには、読み取りと実行のアクセス許可のみがあります。 アクセス制御リストの詳細については、「Azure Data Lake Storage のアクセス制御」を参照してください。
ACL を設定する
ACL を設定する場合は、ACL 全体 (そのすべてのエントリを含む) を置換します。 セキュリティ プリンシパルのアクセス許可レベルの変更または ACL への新しいセキュリティ プリンシパルの追加を、他の既存のエントリに影響を与えることなく行いたい場合は、代わりに ACL を "更新" する必要があります。 ACL を置換するのでなく更新するには、この記事の「ACL を更新する」セクションを参照してください。
ACL を "設定" する場合は、所有ユーザーのエントリ、所有グループのエントリ、および他のすべてのユーザーのエントリを追加する必要があります。 所有ユーザー、所有グループ、およびその他のすべてのユーザーの詳細については、「ユーザーと ID」を参照してください。
ここでは、次の操作方法について説明します。
- ACL を設定する
- ACL を再帰的に設定する
ACL を設定する
az storage fs access set コマンドでディレクトリの ACL を設定します。
この例では、所有ユーザー、所有グループ、またはその他のユーザーのディレクトリに ACL を設定し、その ACL をコンソールに出力します。
az storage fs access set --acl "user::rw-,group::rw-,other::-wx" -p my-directory -f my-container --account-name mystorageaccount --auth-mode login
この例では、所有ユーザー、所有グループ、またはその他のユーザーのディレクトリに既定の ACL を設定し、その ACL をコンソールに出力します。
az storage fs access set --acl "default:user::rw-,group::rw-,other::-wx" -p my-directory -f my-container --account-name mystorageaccount --auth-mode login
ファイルのACLを設定するにはaz storage fs access setコマンドを使ってください。
この例では、所有ユーザー、所有グループ、またはその他のユーザーのファイルに ACL を設定し、その ACL をコンソールに出力します。
az storage fs access set --acl "user::rw-,group::rw-,other::-wx" -p my-directory/upload.txt -f my-container --account-name mystorageaccount --auth-mode login
注
特定のグループやユーザーのACLを設定するには、それぞれのオブジェクトIDを使用します。 例えば、 グループのACLを設定するには group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxを使います。
ユーザーのACLを設定するにはuser:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxを使います。
次の画像は、ファイルの ACL を設定した後の出力を示しています。
この例では、所有ユーザーと所有グループには、読み取りと書き込みのアクセス許可のみがあります。 他のすべてのユーザーには、書き込みと実行のアクセス許可があります。 アクセス制御リストの詳細については、「Azure Data Lake Storage のアクセス制御」を参照してください。
ACL を再帰的に設定する
az storage fs access set-recursive コマンドを使用して、ACL を再帰的に設定します。
この例では、my-parent-directory という名前のディレクトリの ACL を設定します。 これらのエントリは、所有するユーザーに読み書きや実行の権限を与え、所有するグループには読み取りと実行の権限のみを与え、他のすべてのユーザーにはアクセス権を与えません。 この例の最後の ACL エントリでは、"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" というオブジェクト ID を持つ特定のユーザーに、読み取りと実行のアクセス許可を付与しています。
az storage fs access set-recursive --acl "user::rwx,group::r-x,other::---,user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r-x" -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login
注
デフォルトのACLエントリを設定するには、各エントリにプレフィックスdefault:を追加します。 たとえば、default:user::rwx または default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r-x です。
ACL を更新する
ACL を "更新する" 場合は、ACL を置換するのでなく ACL を変更します。 たとえば、ACL にリストされている他のセキュリティ プリンシパルに影響を与えることなく、新しいセキュリティ プリンシパルを ACL に追加することができます。 ACL を更新するのでなく、置換する場合は、この記事の「ACL を設定する」セクションを参照してください。
ACL を更新するには、更新したい ACL エントリを含む新しい ACL オブジェクトを作成してから、そのオブジェクトを ACL の更新操作で使用します。 既存のACLは取得せず、更新のためのACLエントリだけを提供してください。
ここでは、次の操作方法について説明します。
- ACL を更新する
- ACL を再帰的に更新する
ACL を更新する
az storage fs access update-recursive コマンドを使用して、ファイルの ACL を更新します。 Azure CLIはアップデート用のupdate-recursiveコマンドのみを提供します。 単一のファイルをターゲットにすると、コマンドはそのファイルのACLのみを更新します。
この例では、書き込みアクセス許可を持つ ACL エントリを更新します。
az storage fs access update-recursive --acl "user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:rwx" -p my-parent-directory/myfile.txt -f my-container --account-name mystorageaccount --auth-mode login
特定のグループまたはユーザーの ACL を更新するには、それぞれのオブジェクト ID を使用します。 たとえば、group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx または user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx です。
注
Azure CLIは、子アイテムのACLを更新せずに単一のディレクトリのACLを更新することはできません。 そのディレクトリ内のすべての子項目の ACL を変更せずにディレクトリの ACL を更新するには、サポートされている他のツールと SDK のいずれかを使用します。 詳しくは「ACL を設定する方法」をご覧ください。
ACL を再帰的に更新する
az storage fs access update-recursive コマンドを使用して、ACL を再帰的に更新します。
この例では、書き込みアクセス許可を持つ ACL エントリを更新します。
az storage fs access update-recursive --acl "user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:rwx" -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login
注
デフォルトのACLエントリを更新するには、各エントリにプレフィックスdefault:を追加します。 たとえば、default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r-x のようにします。
ACL エントリを再帰的に削除する
1 つ以上の ACL エントリを再帰的に削除できます。 ACLエントリを削除するには、削除したいACLエントリ用の新しいACLオブジェクトを作成し、そのオブジェクトをremove ACL操作で使用してください。 既存のACLは取得せず、削除用のACLエントリーだけを提供してください。
az storage fs access remove-recursive コマンドを使用して、ACL のエントリを削除します。
この例では、コンテナーのルート ディレクトリから ACL エントリを削除します。
az storage fs access remove-recursive --acl "user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login
注
デフォルトのACLエントリを削除するには、各エントリにプレフィックスdefault:を追加します。 たとえば、default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx のようにします。
エラーからの復旧
ACL を再帰的に変更するときに、実行時またはアクセス許可のエラーが発生する場合があります。 実行時エラーが発生した場合は、プロセスを最初から再開します。 権限エラーは、セキュリティプリンシパルがディレクトリ階層内のディレクトリやファイルのACLを変更する十分な権限を持っていない場合に発生します。 アクセス許可の問題を解決してから、継続トークンを使用してエラーの発生時点からプロセスを再開するか、最初からプロセスを再開するかを選択します。 最初から再開する場合は、継続トークンを使用する必要はありません。 ACL エントリは、悪影響を及ぼすことなく再適用できます。
失敗が発生した場合は、 --continue-on-failure パラメータを falseに設定して継続トークンを返します。 エラーに対処した後、コマンドを再度実行し、--continuation パラメーターを後続トークンに設定することにより、障害が発生した時点からプロセスを再開できます。
az storage fs access set-recursive --acl "user::rw-,group::r-x,other::---" --continue-on-failure false --continuation xxxxxxx -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login
プロセスが中断されずに確実に完了されるようにするには、--continue-on-failure パラメーターを true に設定します。
az storage fs access set-recursive --acl "user::rw-,group::r-x,other::---" --continue-on-failure true --continuation xxxxxxx -p my-parent-directory/ -f my-container --account-name mystorageaccount --auth-mode login
ベスト プラクティス
このセクションでは、ACL を再帰的に設定するためのベスト プラクティス ガイドラインについて説明します。
実行時エラーの処理
実行時エラーは、さまざまな理由で発生する可能性があります (たとえば、停電やクライアント接続の問題など)。 実行時エラーが発生した場合は、再帰的な ACL プロセスを再開します。 ACL は、悪影響を及ぼすことなく項目に再適用できます。
アクセス許可エラー (403) の処理
再帰的な ACL プロセスの実行中にアクセス制御の例外が発生した場合、AD のセキュリティ プリンシパルに、ディレクトリ階層内にある 1 つ以上の子項目に ACL を適用するための十分なアクセス許可がない可能性があります。 アクセス許可エラーが発生すると、プロセスが停止し、継続トークンが提供されます。 アクセス許可の問題を修正してから、継続トークンを使用して残りのデータセットを処理します。 既に正常に処理済みのディレクトリとファイルをもう一度処理する必要はありません。 再帰的な ACL プロセスを再開することも選択できます。 ACL は、悪影響を及ぼすことなく項目に再適用できます。
資格情報
ターゲット ストレージ アカウントまたはコンテナーのスコープでストレージ BLOB データ所有者ロールが割り当てられている、Microsoft Entra セキュリティ プリンシパルをプロビジョニングすることをお勧めします。
パフォーマンス
待機時間を短縮するには、ストレージ アカウントと同じリージョンにある Azure 仮想マシン (VM) で再帰的な ACL プロセスを実行することをお勧めします。
ACLの制限
ディレクトリまたはファイルに適用できる ACL の最大数は、アクセス ACL が 32 個と既定 ACL が 32 個です。 詳細については、Azure Data Lake Storage Gen2 でのアクセス制御に関するページを参照してください。