Azure Data Lake Storage Gen2 で Azure CLI を使用して ACL を管理する

この記事では、Azure CLI を使用して、ディレクトリとファイルのアクセス制御リストを取得、設定、更新する方法について説明します。

ACL の継承は、親ディレクトリの下に作成された新しい子項目に対して既に利用可能です。 しかし、親ディレクトリの既存の子項目に対して ACL を再帰的に追加、更新、および削除することもできます。それぞれの子項目に対してこれらの変更を個別に行う必要はありません。

参照 | サンプル | フィードバックの提供

前提条件

  • Azure サブスクリプション。 詳細については、Azure 無料試用版の取得に関するページを参照してください。

  • 階層型名前空間が有効になっているストレージ アカウント。 作成するには、こちらの手順に従います。

  • Azure CLI バージョン 2.14.0 以上。

  • 次のセキュリティのアクセス許可のいずれか。

    • ターゲット コンテナー、ストレージ アカウント、親リソース グループ、またはサブスクリプションのスコープでストレージ BLOB データ所有者ロールが割り当てられた、プロビジョニングされた Microsoft Entra ID セキュリティ プリンシパル

    • ACL 設定を適用する予定のターゲット コンテナーまたはディレクトリの所有ユーザー。 ACL を再帰的に設定する場合、これには、ターゲット コンテナーまたはディレクトリ内のすべての子項目が含まれます。

    • ストレージ アカウント キー。

正しいバージョンの Azure CLI がインストールされていることを確認する

  1. Azure Cloud Shell を開きます。または、Azure CLI をローカルにインストールした場合は、Windows PowerShell などのコマンド コンソール アプリケーションを開きます。

  2. 次のコマンドを使用して、インストールされている Azure CLI のバージョンが 2.14.0 以上であることを確認します。

     az --version
    

    Azure CLI のバージョンが 2.14.0 より低い場合は、新しいバージョンをインストールします。 詳細については、「 Azure CLI のインストール」を参照してください。

アカウントに接続する

  1. Azure CLI をローカルで使用している場合は、login コマンドを実行します。

    az login
    

    CLI で既定のブラウザーを開くことができる場合、開いたブラウザに Azure サインイン ページが読み込まれます。

    それ以外の場合は、 https://aka.ms/devicelogin でブラウザー ページを開き、ターミナルに表示されている認証コードを入力します。 次に、ブラウザーでアカウントの資格情報を使用してサインインします。

    さまざまな認証方法の詳細については、「Azure CLI を使用して BLOB またはキュー データへのアクセスを承認する」を参照してください。

  2. 自分の ID が複数のサブスクリプションに関連付けられている場合は、アクティブなサブスクリプションを、静的 Web サイトをホストするストレージ アカウントのサブスクリプションに設定します。

    az account set --subscription <subscription-id>
    

    <subscription-id> プレースホルダーの値をサブスクリプションの ID に置き換えます。

Note

この記事に示す例は、Microsoft Entra 認可を示しています。 認証方法の詳細については、「Azure CLI を使用して BLOB またはキュー データへのアクセスを承認する」を参照してください。

ACL を取得する

az storage fs access show コマンドで ディレクトリの ACL を取得します。

この例では、ディレクトリの ACL を取得して、その ACL をコンソールに出力します。

az storage fs access show -p my-directory -f my-file-system --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-file-system --account-name mystorageaccount --auth-mode login

次の画像は、ディレクトリの ACL を取得した後の出力を示しています。

Get ACL output

この例では、所有ユーザーには読み取り、書き込み、実行のアクセス許可があります。 所有グループには、読み取りと実行のアクセス許可のみがあります。 アクセス制御リストの詳細については、「Azure Data Lake Storage Gen2 のアクセス制御」を参照してください。

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-file-system --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-file-system --account-name mystorageaccount --auth-mode login

az storage fs access set コマンドでファイルの ACL を設定します。

この例では、所有ユーザー、所有グループ、またはその他のユーザーのファイルに ACL を設定し、その ACL をコンソールに出力します。

az storage fs access set --acl "user::rw-,group::rw-,other::-wx" -p my-directory/upload.txt -f my-file-system --account-name mystorageaccount --auth-mode login

Note

特定のグループまたはユーザーの ACL を設定するには、それぞれのオブジェクト ID を使用します。 たとえば、グループの ACL を設定するには、group:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx を使用します。 ユーザーの ACL を設定するには、user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx を使用します。

次の画像は、ファイルの ACL を設定した後の出力を示しています。

Get ACL output 2

この例では、所有ユーザーと所有グループには、読み取りと書き込みのアクセス許可のみがあります。 他のすべてのユーザーには、書き込みと実行のアクセス許可があります。 アクセス制御リストの詳細については、「Azure Data Lake Storage Gen2 のアクセス制御」を参照してください。

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

Note

既定の 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 を更新します。

この例では、書き込みアクセス許可を持つ 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 です。

注意

子項目の ACL を更新せずに単一ディレクトリの ACL を更新することは、Azure CLI ではサポートされていません。 そのディレクトリ内のすべての子項目の 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

Note

既定の ACL エントリを更新する場合は、各エントリにプレフィックス default: を追加します。 たとえば、default:user:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:r-x のようにします。

ACL エントリを再帰的に削除する

1 つ以上の ACL エントリを再帰的に削除できます。 ACL エントリを削除するには、削除する ACL エントリ用に新しい ACL オブジェクトを作成してから、そのオブジェクトを 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

Note

既定の 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 でのアクセス制御に関するページを参照してください。

関連項目