Azure Entra ID と Airflow で OAuth の課題を克服
エンタープライズ アプリケーションの認証の構成は、特に次のような高度なプラットフォームを使用する場合、複雑なプロセスになることがよくあります。 AzureエントラID そして Apache エアフロー。 🎛️ 今日のクラウド主導の環境では、このような統合により安全で一元的なユーザー管理が提供されますが、特に OAuth ベースの認証に関して技術的なハードルが生じる可能性があります。
OAuth クライアントから Azure のロールに至るまで、すべてを細心の注意を払って設定し、初期認証がシームレスに機能すると想像してください。ただし、ライブを開始する準備ができたと思ったときに、 認証エラー と表示され、進行が止まってしまいます。これはイライラする経験かもしれませんが、Azure の JSON Web Key Set (JWKS) 要件を深く理解することで解決できる課題です。
この記事では、セットアップは完了しているが、Airflow が認証段階でユーザーを拒否しているという現実のシナリオに取り組みます。 「無効な JSON Web キー セット」というエラー メッセージの潜在的な原因を詳しく調べ、問題を解決するためのトラブルシューティングのヒントを順を追って説明します。 OAuth 統合の成功 本番環境で。
これらの一般的な問題に対処することで、スムーズで承認されたアクセス エクスペリエンスを実現するためにセキュリティ設定を最適化する準備が整います。これらのエラーを洞察に変えてみましょう! 🔑
指示 | 使用例 |
---|---|
azure.authorize(callback=url_for('authorized', _external=True)) | このコマンドは OAuth 認証プロセスを開始し、ユーザーを Azure のログイン ページにリダイレクトします。コールバック パラメーターは、ユーザーが認証された後に承認応答を処理する関数を指定します。 |
jwks_uri | JSON Web Key Set (JWKS) URI は、JWT トークンの信頼性を検証するために Azure によって使用される公開キーを取得するために指定されます。この設定は、安全なトークン検証を確保するために重要です。 |
get_oauth_user_info | このメソッドは、認証中に受信した JWT トークンを解析してユーザー情報を抽出するためにオーバーライドされます。承認後にユーザーの詳細が処理される方法をカスタマイズし、トークン データを Airflow ユーザー プロパティにマッピングします。 |
authorize_url | このコマンドは、Azure でのユーザー認証用の URL エンドポイントを定義します。ここで OAuth フローが始まり、ユーザーをサインイン インターフェイスに誘導してアプリへのアクセスを許可します。 |
access_token_url | アクセス トークンの認証コードを交換するために使用される Azure エンドポイントを指定します。これにより、ユーザーのプロファイルへのアクセスと、スコープで定義されているその他のアクセス許可が付与されます。 |
session.get('azure_token') | セッション ストレージから Azure OAuth トークンを取得し、API リクエストでアクセス トークンを提供することで、セキュリティで保護されたエンドポイントへのアクセスを可能にします。このコマンドにより、トークンがセッション ストレージに安全に保存および管理されます。 |
client_kwargs | OAuth 用の追加のクライアント構成パラメータが含まれています。ここでは、client_kwargs を使用して、openid、電子メール、プロファイルなどのスコープを定義し、アプリがユーザーに代わってアクセスできるデータの種類を制御します。 |
super().get_oauth_user_info | Python の super() 関数を使用して、デフォルトの OAuth ユーザー情報メソッドをカスタム解析で拡張します。このアプローチにより、継承された機能を維持しながらエラーを処理し、ログをデバッグできるようになります。 |
request_token_params | 最初の OAuth リクエストの追加パラメータを定義します。この設定では、ユーザーから要求されるアクセスの範囲を指定します。これは、認証中に必要なユーザー データのみを取得するのに役立ちます。 |
window.location.href | JavaScript フロントエンド スクリプトで使用されるこのコマンドは、ブラウザを OAuth 認証 URL に動的にリダイレクトします。ユーザー固有のクエリ パラメーターを使用して URL を構築し、ログイン フローを開始します。 |
カスタム スクリプトを使用して Airflow の OAuth セキュリティを強化する
このソリューションでは、どのように統合するかに取り組んでいます。 AzureエントラID と 気流 OAuth ベースの認証と認可の場合。この統合により、ユーザー アクセスを管理するための安全かつ一元的な方法が提供され、複雑なセキュリティ要件を持つ組織に最適です。初期スクリプトは、Airflow のバックエンドで必要な OAuth 構成をセットアップし、次のような重要なパラメーターを定義することで機能します。 JWKS URI (JSON Web キー セット URI) を使用して、トークンの信頼性を安全に検証できます。 「jwks_uri」の目的は、Azure から公開キーを取得することです。これにより、Azure から受信した JWT (JSON Web トークン) が正当で改ざんされていないことが保証されます。適切な検証が行われていないトークンは不正アクセスにつながる可能性があるため、これは重要なステップです。
このスクリプトは、「authorize_url」パラメーターと「access_token_url」パラメーターも使用します。これらは、それぞれ OAuth フローの開始とアクセス トークンの認証コードの交換のための Azure の URL エンドポイントを定義します。これらの URL は、Azure ログイン ページから始まり、認証後にユーザーを Airflow に戻す、OAuth プロセスを通じてユーザーをガイドするための鍵となります。たとえば、従業員が会社の Airflow ダッシュボードにログインすると、Azure にリダイレクトされ、そこで資格情報を入力します。ログインが成功すると、Azure はユーザーを Airflow インターフェイスに送り返し、バックグラウンドでアクセス トークンを渡します。これにより、ユーザーは Azure ロールに基づいて承認されたアクセスを許可されます。
さらに、スクリプト内のカスタム セキュリティ クラス「AzureCustomSecurity」は、オーバーライド関数「get_oauth_user_info」を活用し、Airflow がユーザー固有の情報を JWT から直接取得できるようにします。これは、Airflow がトークンから取得するデータ (ユーザー名、電子メール、グループ ロールなど) をカスタマイズするため、特に便利です。これらのデータは、「管理者」や「閲覧者」などの Azure のロールと直接関連付けられます。たとえば、ユーザーが Azure の「airflow_nonprod_admin」グループに属している場合、そのユーザーは Airflow の「管理者」ロールにマッピングされ、管理者レベルのアクセス権が与えられます。このアプローチにより、Airflow 内で追加の役割を設定する必要がなくなり、組織にとってスケーラブルなソリューションになります。
最後に、JavaScript フロントエンド スクリプトは、クライアント ID やスコープなどの適切なクエリ パラメーターを使用して、指定された承認 URL にユーザーをリダイレクトすることにより、OAuth フローを開始します。これにより、特定の権限 (プロファイルや電子メールの読み取りなど) を持つユーザーのみが OAuth フローを続行できるようになります。認証が失敗した場合、スクリプトはわかりやすいエラー メッセージでユーザーに警告するため、問題が発生した場合でもスムーズなユーザー エクスペリエンスが保証されます。これらのバックエンド コンポーネントとフロントエンド コンポーネントが連携して、ユーザー アクセスを合理化し、不正な試行に対してアプリケーションを強化する、一貫性のある安全なセットアップを作成します。これは、組織の機密データを保護するための重要な手段です。 🔒
複数のスクリプトアプローチを使用した Airflow での OAuth 認証エラーの解決
最初の解決策 - OAuth 認証用の Python バックエンド スクリプト
# Import required modules and configure OAuth settings
import os
from flask import Flask, redirect, url_for, session
from flask_oauthlib.client import OAuth
# Define environment variables
tenant_id = os.getenv("AAD_TENANT_ID")
client_id = os.getenv("AAD_CLIENT_ID")
client_secret = os.getenv("AAD_CLIENT_SECRET")
app = Flask(__name__)
app.secret_key = 'supersecretkey'
oauth = OAuth(app)
# Define OAuth configuration with Flask-OAuthlib
azure = oauth.remote_app('azure',
consumer_key=client_id,
consumer_secret=client_secret,
request_token_params={'scope': 'openid email profile'},
base_url=f"https://login.microsoftonline.com/{tenant_id}",
access_token_url=f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token",
authorize_url=f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/authorize"
)
@app.route('/login')
def login():
return azure.authorize(callback=url_for('authorized', _external=True))
# OAuth authorization callback route
@app.route('/oauth-authorized/azure')
def authorized():
response = azure.authorized_response()
if response is None or response.get('access_token') is None:
return 'Access Denied'
# Handle successful authorization response
session['azure_token'] = (response['access_token'], '')
return redirect(url_for('home'))
@azure.tokengetter
def get_azure_oauth_token():
return session.get('azure_token')
# Run the Flask app
if __name__ == '__main__':
app.run()
代替バックエンド アプローチ - 安全なトークン検証のための JWKS と OpenID を使用したエアフロー構成
Airflow での OpenID Connect と JSON Web Key Set 構成に焦点を当てた別のバックエンド ソリューション
import os
from airflow.www.fab_security.manager import AUTH_OAUTH
# Required Airflow and custom modules for handling Azure OAuth
from airflow.auth.managers.fab.security_manager.override import FabAirflowSecurityManagerOverride
from airflow.utils.log.logging_mixin import LoggingMixin
class AzureAuthConfig:
AAD_TENANT_ID = os.getenv('AAD_TENANT_ID')
AAD_CLIENT_ID = os.getenv('AAD_CLIENT_ID')
AAD_CLIENT_SECRET = os.getenv('AAD_CLIENT_SECRET')
AUTH_TYPE = AUTH_OAUTH
OAUTH_PROVIDERS = [{
'name': 'azure',
'remote_app': {
'client_id': AzureAuthConfig.AAD_CLIENT_ID,
'client_secret': AzureAuthConfig.AAD_CLIENT_SECRET,
'authorize_url': f"https://login.microsoftonline.com/{AzureAuthConfig.AAD_TENANT_ID}/oauth2/v2.0/authorize",
'access_token_url': f"https://login.microsoftonline.com/{AzureAuthConfig.AAD_TENANT_ID}/oauth2/v2.0/token",
'jwks_uri': 'https://login.microsoftonline.com/common/discovery/v2.0/keys',
'redirect_uri': 'https://airflow.xyz.com/oauth-authorized/azure'
}},
# Ensure authentication maps to the correct role group in Azure
AUTH_ROLES_MAPPING = {
"airflow_nonprod_admin": ["Admin"],
"airflow_nonprod_op": ["Op"],
"airflow_nonprod_viewer": ["Viewer"],
}
フロントエンド スクリプト - OAuth 認証処理用の JavaScript
フロントエンドで OAuth リダイレクトとエラーを処理するための JavaScript アプローチ
// JavaScript function to handle authorization redirect
const authorizeUser = () => {
const oauthUrl = 'https://login.microsoftonline.com/your-tenant-id/oauth2/v2.0/authorize';
const params = {
client_id: 'your-client-id',
redirect_uri: 'https://airflow.xyz.com/oauth-authorized/azure',
response_type: 'token',
scope: 'openid email profile'
};
const queryString = new URLSearchParams(params).toString();
window.location.href = \`\${oauthUrl}?\${queryString}\`;
};
// Handle OAuth errors in the frontend
const handleOAuthError = (error) => {
if (error === 'access_denied') {
alert('Access Denied. Please contact your admin.');
} else {
alert('An unexpected error occurred.');
}
};
// Bind function to login button
document.getElementById('login-btn').addEventListener('click', authorizeUser);
Airflow での Azure Entra ID のロール マッピングとアクセス許可の調査
設定時 AzureエントラID で使用するための 気流 環境では、効果的なアクセス制御のために明確な役割マッピングを確立することが不可欠です。ロール マッピングにより、Azure Entra ID を介して Airflow にログインするユーザーには、Azure ロールに基づいてアクセス許可が割り当てられ、アクセス レベルを制御するための安全で管理しやすい方法が提供されます。たとえば、Azure のロールを次のようなグループに割り当てます。 airflow_nonprod_admin または airflow_nonprod_op 権限を重複させることなく、各役割を特定の Airflow アクセス レベルにマッピングするのに役立ちます。これにより、管理者が Azure のアクセス構成を直接処理できるようになり、セキュリティ管理が合理化されます。
この設定では、 AUTH_ROLES_MAPPING パラメーターは、Azure ロールを Airflow ロールにリンクするために使用され、ユーザーがログイン時に適切なアクセス許可を確実に継承できるようにします。 airflow_nonprod_viewer グループに追加すると、Airflow で「閲覧者」の役割が自動的に割り当てられ、編集権限を持たないワークフローとログの表示のみにアクションが制限されます。このアプローチは、Airflow 内の個々の権限を継続的に更新する必要がなく、ユーザー アクセスをより詳細に制御できるため、複数のチームや部門を持つ組織に特に役立ちます。
最後に、管理者は Azure Entra ID のアプリ登録機能を使用して、Airflow のロール要件に合わせた SAML および OAuth 設定を構成できます。たとえば、エンティティ ID と応答 URL を定義すると、ユーザー認証時に正しい OAuth トークンが確実に発行されます。この方法はセキュリティを強化するだけでなく、チームのワークフローを最適化し、承認されたユーザーのみが Airflow 内のタスクを積極的に変更できるようにします。このような戦略は、不正アクセスを防ぐためにユーザーの役割とアプリのセキュリティ ポリシーの統合が不可欠である大規模な展開で効果的です。 🔐
Azure Entra ID と Airflow の統合に関する重要な質問
- の目的は何ですか AUTH_ROLES_MAPPING エアフローのパラメータ?
- の AUTH_ROLES_MAPPING パラメーターは Azure ロールを Airflow ロールに接続し、Azure のグループ メンバーシップに基づいて自動ロール割り当てを有効にします。これにより、Azure Entra ID 経由でログインするユーザーに適切なアクセス許可が割り当てられ、アクセス制御が簡素化されます。
- どうやって jwks_uri OAuth セットアップで動作しますか?
- の jwks_uri JWT トークン検証のために Azure の公開キーを取得できる URI を定義します。このステップは、トークンの信頼性を検証し、不正アクセスを防ぐために重要です。
- なぜ設定されているのか redirect_uri OAuth プロバイダーは重要ですか?
- の redirect_uri 認証が成功した後、ユーザーの送信先を Azure に指示します。これは多くの場合、OAuth 応答を処理する Airflow エンドポイントに設定され、Azure と Airflow の間のスムーズな統合が可能になります。
- 複数のロールを単一の Azure Entra ID グループに割り当てることはできますか?
- はい、複数のロールを 1 つの Azure グループにマッピングできるため、アクセス許可を柔軟に割り当てることができます。たとえば、「管理者」と「閲覧者」の両方の役割をグループに関連付けて、権限を重複させることができます。
- 「無効な JSON Web キー セット」エラーをトラブルシューティングする最善の方法は何ですか?
- を確認してください。 jwks_uri 正しく構成されており、アクセス可能です。多くの場合、エンドポイントに到達できない場合、または Azure Entra ID キーが Airflow に誤ってキャッシュされている場合に、エラーが発生します。
- どうやって client_kwargs スコープはセキュリティを強化しますか?
- の client_kwargs スコープは、Airflow がユーザー プロファイルからアクセスできるデータを制限し、企業設定におけるコンプライアンスの鍵となる機密情報へのアクセス制限を強制します。
- 有効にするかどうか WTF_CSRF_ENABLED セキュリティを向上させるには?
- はい、 WTF_CSRF_ENABLED Airflow にクロスサイト リクエスト フォージェリ保護を提供し、不正なリクエストを防ぎます。セキュリティを強化するために、運用環境ではこのフラグを強く推奨します。
- 拒否されたサインイン要求を処理するにはどうすればよいですか?
- Azure のユーザー ロールを調べて、それらが正しく割り当てられていることを確認します。さらに、検証します authorize_url これらの設定は認証の成功に影響するため、グループ マッピングは正しいです。
- Azure 以外の OAuth プロバイダーを使用できますか?
- はい。Airflow は、プロバイダー固有のパラメーターを調整することで、Google や Okta などの他の OAuth プロバイダーをサポートします。 OAUTH_PROVIDERS。各プロバイダーには固有の URL と構成要件がある場合があります。
Azure Entra ID によるエアフローの保護に関する最終的な考え
Azure Entra ID を Airflow と統合すると、組織全体の認証を合理化できます。次のような OAuth パラメータを慎重に構成することで、 jwks_uri およびアクセス トークン URL を使用すると、不正アクセスのリスクを最小限に抑える安全な接続が確立されます。このレベルのセキュリティは、データ主導型の組織にとって不可欠です。
Azure のロール マッピングにより、Airflow でスケーラブルなロールベースのアクセス戦略が可能になります。これらのマッピングを使用すると、特に大規模なチームで、ユーザーの管理と権限の割り当てがより効率的になります。これらの構成を明確に理解することで、将来のセキュリティ ニーズに対する認証設定の回復力を高めることができます。 🔒
Azure と Airflow の統合に関する主要なソースと参考資料
- 統合に関する Microsoft ドキュメント Azure Active Directory エンタープライズ認証とアクセス管理のための OAuth。
- Apache Airflow の公式ガイド OAuth とセキュリティの構成 、外部認証方法の構成に関する洞察が含まれます。
- Helm の詳細な展開図ドキュメント エアフロー ヘルム チャート 、Kubernetes 環境での安全なデプロイメントの実践に焦点を当てています。
- 統合のための Python Flask-OAuth ライブラリからの洞察 Flask OAuthlib Python ベースのアプリケーションでトークン フローとユーザー認証を管理するための重要なリソースである Azure Entra ID を使用します。
- Azure AD のトラブルシューティングに関するリソース OAuth 関連のエラー 、特に JSON Web キー セットとトークン検証に関連する問題に重点を置いています。