Azure Entra ID 및 Airflow로 OAuth 문제 극복
엔터프라이즈 애플리케이션에 대한 인증 구성은 특히 다음과 같은 고급 플랫폼을 사용하는 경우 복잡한 프로세스가 될 수 있습니다. Azure 엔트라 ID 그리고 아파치 에어플로우. 🎛️ 오늘날의 클라우드 기반 환경에서 이러한 통합은 안전한 중앙 집중식 사용자 관리를 제공하지만 특히 OAuth 기반 인증의 경우 기술적인 장애물을 공유할 수 있습니다.
OAuth 클라이언트부터 Azure의 역할까지 모든 것을 꼼꼼하게 설정했고 초기 인증이 원활하게 작동한다고 상상해 보세요. 하지만 라이브를 시작할 준비가 되었다고 생각하는 바로 그 순간, 인증 오류 나타나면 진행이 중단됩니다. 이는 실망스러운 경험일 수 있지만 Azure의 JWKS(JSON 웹 키 세트) 요구 사항을 더 깊이 이해하면 해결할 수 있는 과제입니다.
이 문서에서는 설정이 완료되었지만 Airflow가 승인 단계에서 사용자를 거부하는 실제 시나리오를 다룹니다. "잘못된 JSON 웹 키 세트" 오류 메시지의 잠재적인 원인을 조사하고 문제 해결 팁을 안내해 드립니다. 성공적인 OAuth 통합 프로덕션 환경에서.
이러한 일반적인 문제를 해결하면 원활하고 승인된 액세스 환경을 위해 보안 설정을 최적화할 수 있습니다. 이러한 오류를 통찰력으로 전환하기 위해 자세히 살펴보겠습니다! 🔑
명령 | 사용예 |
---|---|
azure.authorize(callback=url_for('authorized', _external=True)) | 이 명령은 OAuth 권한 부여 프로세스를 시작하여 사용자를 Azure 로그인 페이지로 리디렉션합니다. 콜백 매개변수는 사용자가 인증되면 권한 부여 응답을 처리하는 함수를 지정합니다. |
jwks_uri | JWKS(JSON 웹 키 세트) 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, email, profile과 같은 범위를 정의하여 앱이 사용자를 대신하여 액세스할 수 있는 데이터 유형을 제어하는 데 사용됩니다. |
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 웹 키 세트 URI)을 사용하여 토큰 진위 여부를 안전하게 확인할 수 있습니다. “jwks_uri”의 목적은 Azure에서 받은 JWT(JSON 웹 토큰)가 합법적이고 변조되지 않았음을 보장하는 Azure에서 공개 키를 검색하는 것입니다. 적절한 검증이 이루어지지 않은 토큰은 무단 액세스로 이어질 수 있으므로 이는 중요한 단계입니다.
또한 스크립트는 각각 OAuth 흐름을 시작하고 액세스 토큰에 대한 인증 코드를 교환하기 위해 Azure에서 URL 끝점을 정의하는 "authorize_url" 및 "access_token_url" 매개 변수를 사용합니다. 이러한 URL은 Azure 로그인 페이지에서 시작하여 인증된 후 Airflow에 반환하는 OAuth 프로세스를 통해 사용자를 안내하는 데 핵심입니다. 예를 들어 회사의 Airflow 대시보드에 로그인하는 직원은 Azure로 리디렉션되어 자격 증명을 입력하게 됩니다. 로그인에 성공하면 Azure는 사용자를 Airflow 인터페이스로 다시 보내고 백그라운드에서 액세스 토큰을 전달하여 Azure 역할에 따라 승인된 액세스를 허용합니다.
또한 스크립트의 사용자 지정 보안 클래스 `AzureCustomSecurity`는 Airflow가 JWT에서 직접 사용자별 정보를 검색할 수 있도록 하는 재정의 함수 "get_oauth_user_info"를 활용합니다. 이는 "관리자" 또는 "뷰어"와 같은 Azure의 역할과 직접적으로 연관되는 사용자 이름, 이메일, 그룹 역할을 포함하여 Airflow가 토큰에서 가져오는 데이터를 사용자 정의할 때 특히 유용합니다. 예를 들어 사용자가 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 구성
Airflow의 OpenID Connect 및 JSON 웹 키 세트 구성에 중점을 둔 또 다른 백엔드 솔루션
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 Airflow의 매개변수?
- 그만큼 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 그룹에 여러 역할을 할당할 수 있나요?
- 예, 여러 역할을 단일 Azure 그룹에 매핑하여 권한을 유연하게 할당할 수 있습니다. 예를 들어, "관리자" 및 "뷰어" 역할은 중복되는 권한을 위해 그룹과 연결될 수 있습니다.
- "잘못된 JSON 웹 키 세트" 오류를 해결하는 가장 좋은 방법은 무엇입니까?
- 보장 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 액티브 디렉터리 기업 인증 및 액세스 관리를 위한 OAuth.
- Apache Airflow의 공식 가이드 OAuth 및 보안 구성 , 외부 인증 방법 구성에 대한 통찰력을 제공합니다.
- Helm의 상세한 배포 차트 문서 기류 투구 차트 , Kubernetes 환경의 보안 배포 사례에 중점을 둡니다.
- 통합을 위한 Python Flask-OAuth 라이브러리의 통찰력 플라스크 OAuthlib Python 기반 애플리케이션에서 토큰 흐름 및 사용자 권한 부여를 관리하기 위한 핵심 리소스인 Azure Entra ID를 사용합니다.
- 처리에 대한 Azure AD 문제 해결 리소스 OAuth 관련 오류 , 특히 JSON 웹 키 세트 및 토큰 확인과 관련된 문제에 중점을 둡니다.