Data Engineering

امن‌سازی Airflow 2.4+ با AWS Secrets

مدیریت اعتبارنامه‌ها در پایپ‌لاین‌های داده یک نگرانی امنیتی حیاتی است. سخت‌کد کردن رازها یا اتکا به متغیرهای محیطی ایستا اغلب منجر به انحراف پیکربندی و آسیب‌پذیری‌های امنیتی می‌شود. با Airflow 2.4 و نسخه‌های بعدی، می‌توانیم از تزریق پویای متغیرها برای دریافت مستقیم داده‌های حساس از AWS Secrets Manager استفاده کنیم و اطمینان حاصل کنیم که DAGهای شما امن، انعطاف‌پذیر و مطابق با استانداردها باقی می‌مانند.

چرا تزریق پویا به جای پیکربندی ایستا؟

رویکردهای سنتی اغلب شامل قرار دادن رازها در airflow.cfg یا استفاده از متغیرهای محیطی است که برای به‌روزرسانی نیاز به راه‌اندازی مجدد کانتینر دارند. این موضوع برای چرخش مکرر رازها یا استقرار در چندین محیط مشکل‌ساز است. تزریق پویا به Airflow اجازه می‌دهد رازها را در زمان اجرا دریافت کند. با ترکیب عملگرهای سفارشی یا شیء Connection با AWS Boto3، می‌توانید اطمینان حاصل کنید که اعتبارنامه‌ها در حین انتقال رمزگذاری شده و توسط AWS در حالت ذخیره‌سازی نگهداری می‌شوند، در حالی که فقط برای وظایف خاصی که به آن‌ها نیاز دارند، آشکار می‌شوند.

پیش‌نیازها و راه‌اندازی

برای شروع، اطمینان حاصل کنید که محیط Airflow شما دارای مجوزهای لازم است. نقش IAM یا کاربر مرتبط با کارگرهای Airflow شما باید دارای مجوز secretsmanager:GetSecretValue برای شناسه‌های ARN رازهای خاص باشد.

اول، وابستگی‌های مورد نیاز را در فایل requirements Airflow خود نصب کنید:


boto3>=1.26.0

پیاده‌سازی دریافت‌کننده راز

ایجاد یک تابع کاربردی قابل استفاده مجدد، بهترین روش است. این کار DAGهای شما را تمیز نگه می‌دارد و مدیریت خطا را متمرکز می‌کند. در زیر یک پیاده‌سازی محکم از تابع بازیابی راز که با Boto3 یکپارچه شده است، آورده شده است.


import boto3
from botocore.exceptions import ClientError
from airflow.models import Variable

def get_aws_secret(secret_id: str, region_name: str = 'us-east-1') -> dict:
    """
    بازیابی یک راز از AWS Secrets Manager.
    
    Args:
        secret_id: نام یا ARN راز.
        region_name: منطقه AWS که راز در آن قرار دارد.
        
    Returns:
        یک دیکشنری حاوی رشته راز که به عنوان JSON تجزیه شده است.
    """
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )
    
    try:
        get_secret_value_response = client.get_secret_value(SecretId=secret_id)
    except ClientError as e:
        error_code = e.response['Error']['Code']
        if error_code == "ResourceNotFoundException":
            raise Exception(f"Secret with ID {secret_id} not found")
        else:
            raise e

    # مدیریت رازهای JSON در مقابل String
    if 'SecretString' in get_secret_value_response:
        return eval(get_secret_value_response['SecretString'])
    elif 'SecretBinary' in get_secret_value_response:
        return get_secret_value_response['SecretBinary'].decode()

# استفاده در DAG
import os
# این معمولاً در یک Task یا Operator پیچیده می‌شود
DB_PASSWORD = get_aws_secret('prod/db-credentials')['password']

یکپارچه‌سازی با اتصالات Airflow

به جای عبور از رمزهای عبور خام به وظایف فردی، بهتر است از مدیریت اتصال داخلی Airflow استفاده کنید. می‌توانید از یک Connection سفارشی یا یک پلاگین استفاده کنید که اتصال اضافی را هنگام نمونه‌سازی از Secrets Manager حل می‌کند.

برای یک رویکرد پیشرفته‌تر، در نظر بگیرید که از تزئین‌کننده @task در Airflow 2.4+ (TaskFlow API) برای تزریق مستقیم رازها به منطق وظیفه بدون آلوده کردن فضای نام سراسری استفاده کنید.


from airflow.decorators import dag, task

@dag(schedule=None, tags=['secrets-demo'], start_date=datetime(2024, 1, 1))
def secure_data_pipeline():
    
    @task
    def fetch_and_process():
        # رازها فقط زمانی که وظیفه اجرا می‌شود دریافت می‌شوند
        credentials = get_aws_secret('app/api-key')
        api_key = credentials['api_key']
        
        # انجام فراخوانی API با راز
        # requests.post(url, headers={'Authorization': f'Bearer {api_key}'})
        return f"API call made with key ending in {api_key[-4:]}"

    fetch_and_process()

secure_data_pipeline()

بهترین روش‌های امنیتی

  • حداقل امتیاز: نقش‌های IAM جداگانه برای هر محیط (dev, staging, prod) با دسترسی فقط به مسیرهای خاص رازها ایجاد کنید.
  • چرخش رازها: AWS Secrets Manager را برای چرخش خودکار رازهای خود پیکربندی کنید. از آنجا که Airflow آن‌ها را به صورت پویا دریافت می‌کند، بلافاصله از این مزیت بهره‌مند می‌شوید بدون نیاز به استقرار مجدد.
  • ماسک‌گذاری لاگ‌ها: هرگز مقدار کامل راز را در لاگ ثبت نکنید. در مثال بالا، ما فقط ۴ کاراکتر آخر را برای کمک به عیب‌یابی بدون قربانی کردن امنیت ثبت می‌کنیم.
  • رمزگذاری در حالت ذخیره‌سازی: اطمینان حاصل کنید که از کلیدهای مدیریت شده توسط مشتری KMS (CMKs) برای رازهای خود استفاده می‌کنید تا نیازهای سخت‌گیرانه انطباق را برآورده کنید.

نتیجه‌گیری

با پذیرش تزریق پویای متغیرها با AWS Secrets Manager در Airflow 2.4+، خطر اعتبارنامه‌های منقضی شده را حذف می‌کنید و سطح حمله زیرساخت خود را کاهش می‌دهید. این الگو برای معماری‌های میکروسرویس پیچیده به خوبی مقیاس می‌شود و اطمینان حاصل می‌کند که تیم‌های مهندسی داده شما می‌توانند بر روی ساخت منطق تمرکز کنند، نه مدیریت کلیدها. این روش‌ها را امروز پیاده‌سازی کنید تا امنیت پایپ‌لاین خود را برای آینده آماده کنید.

Share: