Airflow UI のアクセス制御を使用する

Cloud Composer 1 | Cloud Composer 2 | Cloud Composer 3

このページでは、Airflow UI と DAG UI に対するアクセス制御のさまざまなメカニズムについて説明します。IAM によって提供されるアクセス制御に加えて、これらのメカニズムを使用して、お使いの環境の Airflow UI と DAG UI でユーザーを分離できます。

Cloud Composer の Airflow UI アクセス制御の概要

Airflow UIDAG UI へのアクセスと、それらの UI のデータとオペレーションの公開設定は、Cloud Composer では次の 2 つのレベルで制御されます。

  1. Cloud Composer での Airflow UI と DAG UI へのアクセスは IAM によって制御されます。

    プロジェクトで Cloud Composer 環境を表示できるロールがアカウントに付与されていない場合、Airflow UI と DAG UI は使用できません。

    IAM は、Airflow UI や DAG UI で追加の詳細な権限制御を行うことはありません。

  2. Apache Airflow アクセス制御モデルを使用すると、ユーザーロールに基づいて Airflow UI と DAG UI の可視性を低減できます。

    Apache Airflow アクセス制御は Airflow の機能であり、IAM とは異なる独自のユーザー、ロール、権限のモデルを持っています。

Apache Airflow アクセス制御は、リソースベースの権限を使用します。特定の Airflow のロールを持つ Airflow ユーザーはすべて、このロールの権限を取得します。たとえば、can delete on Connections 権限を持つロールを付与された Airflow ユーザーは、Airflow UI の [接続] ページで接続を削除できます。

個々の DAG に DAG レベルの権限を割り当てることもできます。たとえば、特定の Airflow ロールを持つユーザーだけが Airflow UI で特定の DAG を表示できるように設定可能です。Cloud Composer では、環境のバケット内の DAG ファイルが配置されているサブフォルダに基づいて、DAG レベルの権限を自動的に割り当てることができます。

始める前に

  • アクセス制御付きの Airflow UI は、Cloud Composer バージョン 1.13.4 以降と Airflow 1.10.10 以降で使用できます。環境で Python 3 を実行する必要もあります。

  • フォルダ単位のロール登録は、Airflow 2 では Cloud Composer 1.18.12 以降のバージョンで、Airflow 1 では Cloud Composer 1.13.4 以降のバージョンで使用できます。

Airflow UI のアクセス制御を有効にする

Airflow 2

Airflow 2 では、アクセス制御を使用する Airflow UI が常に有効になっています。

Airflow 1

アクセス制御を使用する Airflow UI を有効にするには、次の Airflow 構成オプションをオーバーライドします。

セクション キー
webserver rbac True

これは、既存の環境に対して行うことも、新しい環境を作成するときに行うこともできます。

この構成では、環境は従来の Airflow UI ではなく、アクセス制御のある Airflow UI を実行します。

Airflow のロールおよびアクセス制御の設定を管理する

管理者のロール(または同等のロール)を持つユーザーは、Airflow UI でアクセス制御設定を表示、変更できます。

Airflow UI では、[セキュリティ] メニューからアクセス制御設定を構成できます。Airflow アクセス制御モデル、使用可能な権限、デフォルトロールの詳細については、Airflow UI のアクセス制御のドキュメントをご覧ください。

Airflow 1 では、ユーザーロールがすべてのカスタムロールのテンプレートとして扱われます。Airflow は、all_dags の権限を除き、ユーザーロールからすべてのカスタムロールに権限を継続的にコピーします。

Airflow は独自のユーザーリストを保持します。管理者のロール(または同等のもの)を持つユーザーは、環境の Airflow UI を開いたユーザーで、Airflow に登録されたユーザーのリストを表示できます。このリストには、次のセクションで説明するように、管理者が手動で事前登録したユーザーも含まれます。

Airflow UI でユーザーを登録する

新しいユーザーは、Cloud Composer 環境の Airflow UI を初めて開いたときに自動的に登録されます。

登録時に、[webserver]rbac_user_registration_role Airflow の構成オプションで指定されたロールがユーザーに付与されます。新規登録ユーザーのロールを管理するには、この Airflow 構成オプションを別の値でオーバーライドします。

指定しない場合、Airflow 2 を使用する環境では、デフォルトの登録のロールは Op となります。

Airflow 1.10.* を使用する環境では、デフォルトの登録のロールは Admin です。

Airflow UI の基本ロールの構成を作成する場合、次の手順をおすすめします。

Airflow 2

  1. 環境管理者は、新しく作成された環境の Airflow UI を開きます。

  2. 管理者アカウントに Admin ロールを付与します。Airflow 2 を使用する環境の新しいアカウントのデフォルトのロールは Op です。Admin ロールを割り当てるには、gcloud CLI で次の Airflow CLI コマンドを実行します。

      gcloud composer environments run ENVIRONMENT_NAME \
        --location LOCATION \
        users add-role -- -e USER_EMAIL -r Admin
    

    以下のように置き換えます。

    • ENVIRONMENT_NAME を環境の名前にする。
    • LOCATION は、環境が配置されているリージョン。
    • USER_EMAIL は、ユーザー アカウントのメールアドレス。
  3. 管理者は、他のユーザーに Admin ロールを割り当てるなど、新しいユーザーのアクセス制御を構成できます。

Airflow 1

  1. 環境管理者は、Admin ロールで自動的に登録される 新しく作成された環境の Airflow UI を開きます。

  2. 新しいユーザーに必要なロールに、次の Airflow 構成オプションをオーバーライドします。たとえば、User とします。

    セクション キー
    webserver rbac_user_registration_role User または管理者以外のロール
  3. 管理者は、他のユーザーに Admin ロールを割り当てるなど、新しいユーザーの Airflow UI アクセス制御を構成できるようになりました。

ユーザーを事前登録する

ユーザーは、(メールアドレスではなく)Google ユーザー アカウントの数値 ID がユーザー名として自動的に登録されます。また、手動でユーザーを登録し、ユーザー名のフィールドをユーザーのメインのメールアドレスに設定したユーザー レコードを追加して、ユーザーにロールを割り当てることもできます。事前登録ユーザー レコードと一致するメールアドレスを持つユーザーが初めて Airflow UI にログインすると、そのユーザー名は現在メールアドレスで識別されている(最初のログイン時に)ユーザー ID に置き換えられます。Google ID(メールアドレス)とユーザー アカウント(ユーザー ID)の関係は固定されていません。Google グループは事前登録できません。

ユーザーを事前登録するには、Airflow UI を使用するか、Google Cloud CLI から Airflow CLI コマンドを実行します。

Google Cloud CLI を使用してカスタムロールを持つユーザーを事前登録するには、次の Airflow CLI コマンドを実行します。

gcloud composer environments run ENVIRONMENT_NAME \
  --location LOCATION \
  users create -- \
  -r ROLE \
  -e USER_EMAIL \
  -u USER_EMAIL \
  -f FIRST_NAME \
  -l LAST_NAME \
  --use-random-password # The password value is required, but is not used

以下を置き換えます。

  • ENVIRONMENT_NAME: 環境の名前
  • LOCATION: 環境が配置されているリージョン
  • ROLE: ユーザーの Airflow ロール(例: Op
  • USER_EMAIL: ユーザーのメールアドレス
  • FIRST_NAMELAST_NAME: ユーザーの名と姓

例:

gcloud composer environments run example-environment \
  --location us-central1 \
  users create -- \
  -r Op \
  -e "example-user@example.com" \
  -u "example-user@example.com" \
  -f "Name" \
  -l "Surname" \
  --use-random-password

ユーザーを削除する

ユーザーを Airflow UI から削除しても、そのユーザーが Airflow UI に次回アクセスしたときに自動的に登録されるため、ユーザーのアクセス権は取り消されません。Airflow UI 全体へのアクセス権を取り消すには、プロジェクトの許可ポリシーから composer.environments.get 権限を削除します。

ユーザーのロールを「パブリック」に変更することで、ユーザーの登録を維持しつつ、Airflow UI のすべての権限を削除することもできます。

DAG レベルの権限を自動的に構成する

フォルダごとのロール登録機能では、/dags フォルダ内の各サブフォルダごとにカスタム Airflow ロールが自動的に作成され、このロールにすべての DAG レベルのアクセス権が、ソースファイルがそれぞれのサブフォルダに保存されているすべての DAG に付与されます。これにより、カスタム Airflow ロールの管理と DAG へのアクセスが効率化されます。

フォルダ単位のロール登録の仕組み

フォルダ単位のロール登録は、ロールとその DAG レベルの権限を自動的に構成する方法です。そのため、DAG レベルの権限を付与するほかの Airflow メカニズムとの競合が発生する可能性があります。

このような競合を回避するため、フォルダ単位のロール登録を有効にすると、これらのメカニズムの動作も変更されます。

Airflow 1 では、フォルダごとのロール登録が有効になっている場合、これらのメカニズムを使用する可能性は無効になります。DAG レベルの権限管理はすべて、フォルダ単位のロール登録でのみ行われます。

Airflow 2 では:

  • DAG のソースコードで定義されている access_control プロパティを使用して、DAG へのアクセス権をロールに付与できます。
  • (Airflow UI または gcloud CLI を介して)手動で DAG 権限を付与すると、競合が発生することがあります。たとえば、DAG レベルの権限を手動でフォルダ単位のロールに付与すると、DAG プロセッサが DAG を同期する際にこれらの権限を削除または上書きできます。DAG 権限は手動で付与しないことをおすすめします。
  • ロールには、フォルダ単位のロール登録で登録され、DAG の access_control プロパティで定義された DAG アクセス権の結合があります。

最上位の /dags フォルダに直接配置された DAG は、フォルダ単位のロールに自動的に割り当てられません。フォルダごとのロールでアクセスすることはできません。管理者、Op、ユーザーなど、他の権限を持つロールは、Airflow UI と DAG UI を通じてアクセスできます。

組み込みの Airflow ロールと Cloud Composer によって作成されたロールと一致する名前のサブフォルダに DAG をアップロードした場合、これらのサブフォルダ内の DAG の権限は引き続きロールに割り当てられます。たとえば、DAG を /dags/Admin フォルダにアップロードすると、この DAG に対する権限が管理者ロールに付与されます。組み込みの Airflow ロールには、管理者、Op、ユーザー、閲覧者、パブリックが含まれます。Cloud Composer では、フォルダ単位のロール登録機能が有効になった後に、NoDags と UserNoDags が作成されます。

Airflow スケジューラで DAG を処理する際に、Airflow はフォルダ単位のロール登録を行います。環境内の DAG が 100 を超えると、DAG 解析時間が増加することがあります。 この場合は、Airflow 1 環境の場合は [scheduler]max_threads パラメータを増やすか、Airflow 2 の場合は [scheduler]parsing_processes を増やすことをおすすめします。

DAG をフォルダ単位のロールに自動的に割り当てる

DAG をフォルダ単位のロールに自動的に割り当てるには:

  1. 次の Airflow 構成オプションをオーバーライドします。

    セクション キー
    webserver rbac_autoregister_per_folder_roles True
  2. 新しいユーザー登録ロールを、DAG にアクセスできないロールに変更します。 このようにして、管理者が特定の DAG に対する権限を持つロールをアカウントに割り当てるまで、新規ユーザーは DAG にはアクセスできません。

    UserNoDags と NoDags は、フォルダ単位のロール登録機能が有効になっている場合にのみ Cloud Composer によって作成されるロールです。これらはユーザーロールと同等ですが、DAG へのアクセス権はありません。UserNoDags ロールは Airflow 2 で作成され、NoDags ロールは Airflow 1 で作成されます。

    Airflow 2 で、次の Airflow 構成オプションをオーバーライドします。

    セクション キー
    webserver rbac_user_registration_role UserNoDags

    Airflow 1 で、次の Airflow 構成オプションをオーバーライドします。

    セクション キー
    webserver rbac_user_registration_role NoDags
  3. ユーザーが Airflow に登録されていることを確認します。

  4. 次のいずれかの方法でユーザーにロールを割り当てます。

    • Airflow が DAG サブフォルダに基づいて自動的にロールを作成し、ユーザーをこれらのロールに割り当てます。
    • DAG サブフォルダの空のロールをあらかじめ作成し、ロール名をサブフォルダの名前と一致させてから、これらのロールにユーザーを割り当てます。たとえば、/dags/CustomFolder フォルダには CustomFolder という名前のロールを作成します。
  5. ユーザーに割り当てられたロールと一致する名前のサブフォルダに DAG をアップロードします。これらのサブフォルダは、環境のバケット内の /dags フォルダ内に配置する必要があります。Airflow は、このようなサブフォルダ内の DAG に権限を追加します。これにより、対応するロールを持つユーザーのみが Airflow UI と DAG UI から DAG にアクセスできるようになります。

DAG レベルの権限を手動で構成する

カスタムロールの DAG レベルの権限を構成して、特定のユーザー グループに表示される DAG を指定できます。

Airflow UI で DAG レベルの権限を構成するには:

  1. DAG をグループ化するための空のロールを管理者が作成します。
  2. 管理者がユーザーを適切なロールに割り当てます。
  3. 管理者またはユーザーが DAG をロールに割り当てます。
  4. Airflow UI では、ユーザーは自分のグループに割り当てられた DAG のみを表示できます。

DAG は、DAG プロパティまたは Airflow UI からロールに割り当てることができます。

Airflow UI でロールに DAG を割り当てる

管理者は、Airflow UI で必要な DAG レベルの権限を適切なロールに割り当てることができます。

このオペレーションは DAG UI ではサポートされていません。

DAG プロパティ内のロールに DAG を割り当てる

DAG に access_control DAG パラメータを設定して、DAG が割り当てられる DAG グループ化ロールを指定できます。

Airflow 2

dag = DAG(
  access_control={
    'DagGroup': {'can_edit', 'can_read'},
  },
  ...
  )

Airflow 1

dag = DAG(
  access_control={
    'DagGroup': {'can_dag_edit', 'can_dag_read'},
  },
  ...
  )

Airflow UI で監査ログをユーザーにマッピングする

Airflow UI の監査ログは、Google ユーザー アカウントの数値 ID にマッピングされます。たとえば、ユーザーが DAG を一時停止すると、ログにエントリが追加されます。

Airflow 2

Airflow 2 では、Airflow UI の [参照] > [監査ログ] ページで監査ログを表示できます。

Airflow 2 の監査ログページのエントリ
図 1: Airflow 2 の監査ログページのエントリ

Airflow 1

Airflow 1 では、[参照] > [ログ] ページで監査ログを表示できます。

Airflow 1 の [ログ] ページのエントリ
図 1: Airflow 1 の [ログ] ページのエントリ

一般的なエントリでは、[オーナー] フィールドに数値 ID 「accounts.google.com:NUMERIC_ID」が表示されます。[セキュリティ] > [ユーザーの一覧表示] ページで、数値 ID をユーザーのメールアドレスにマッピングできます。このページは Admin ロールを持つユーザーが使用できます。

Google ID(メールアドレス)とユーザー アカウント(ユーザー ID)の関係は固定されていません。

次のステップ