إدارة بيانات الاعتماد في خطوط أنابيب البيانات هي قضية أمنية حرجة. غالباً ما يؤدي ترميز الأسرار أو الاعتماد على متغيرات البيئة الثابتة إلى انحراف التكوين وثغرات أمنية. مع Airflow 2.4 وما بعده، يمكننا الاستفادة من حقن المتغيرات الديناميكي لجلب البيانات الحساسة مباشرة من AWS Secrets Manager، مما يضمن بقاء DAGs الخاصة بك آمنة ومرنة ومتوافقة.
لماذا الحقن الديناميكي بدلاً من التكوين الثابت
غالباً ما تتضمن الأساليب التقليدية وضع الأسرار في airflow.cfg أو استخدام متغيرات بيئة تتطلب إعادة تشغيل الحاويات للتحديث. هذا مشكلة في حالات التدوير المتكرر أو النشر متعدد البيئات. يتيح الحقن الديناميكي لـ Airflow جلب الأسرار وقت التشغيل. من خلال دمج المشغلين المخصصين أو كائن Connection مع AWS Boto3، يمكنك ضمان تشفير بيانات الاعتماد أثناء النقل وتخزينها في وضع السكون بواسطة AWS، مع تعرضها فقط للمهام المحددة التي تحتاج إليها.
المتطلبات المسبقة والإعداد
للبدء، تأكد من أن بيئة Airflow الخاصة بك تملك الأذونات اللازمة. يجب أن يكون دور IAM أو المستخدم المرتبط بأجهزة عمل Airflow الخاصة بك لديه أذونات secretsmanager:GetSecretValue لمعرّفات ARN الخاصة بالأسرار المحددة.
أولاً، قم بتثبيت الاعتماديات المطلوبة في ملف متطلبات Airflow الخاص بك:
boto3>=1.26.0
تنفيذ جالب الأسرار
إنشاء دالة أداة قابلة لإعادة الاستخدام هو أفضل ممارسة. هذا يحافظ على نظافة DAGs الخاصة بك ويوحد معالجة الأخطاء. أدناه تنفيذ قوي لدالة استرجاع الأسرار التي تتكامل مع 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_id}")
else:
raise e
# معالجة أسرار JSON مقابل السلاسل
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
# عادةً ما يتم تغليف هذا في مهمة أو مشغل
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 بمفتاح ينتهي بـ {api_key[-4:]}"
fetch_and_process()
secure_data_pipeline()
أفضل ممارسات الأمن
- أقل امتيازات: أنشئ أدوار IAM منفصلة لكل بيئة (تطوير، تجريبية، إنتاج) مع وصول فقط إلى مسارات الأسرار المحددة.
- تدوير الأسرار: قم بتكوين AWS Secrets Manager لتدوير أسرارك تلقائياً. بما أن Airflow يجلبها ديناميكياً، فإنك تستفيد فوراً دون إعادة النشر.
- إخفاء السجلات: لا تسجل قيمة السر الكاملة أبداً. في المثال أعلاه، نسجل فقط آخر 4 أحرف للمساعدة في تصحيح الأخطاء دون المساس بالأمن.
- التشفير في وضع السكون: تأكد من استخدام مفاتيح KMS المُدارة من قبل العميل (CMKs) لأسرارك لتلبية متطلبات الامتثال الصارمة.
خاتمة
من خلال اعتماد حقن المتغيرات الديناميكي مع AWS Secrets Manager في Airflow 2.4+، فإنك تقضي على خطر بيانات الاعتماد القديمة وتقلل من سطح الهجوم في بنيتك التحتية. يتوسع هذا النمط بشكل جيد مع معماريات الخدمات الدقيقة المعقدة ويضمن أن فرق هندسة البيانات الخاصة بك يمكنها التركيز على بناء المنطق بدلاً من إدارة المفاتيح. نفذ هذه الممارسات اليوم لتأمين خطوط أنابيبك للمستقبل.