Veri boru hatlarında kimlik bilgilerini yönetmek kritik bir güvenlik konusudur. Gizli bilgileri sabit kodlamaya veya statik ortam değişkenlerine güvenmek, yapılandırma sapmasına ve güvenlik açıklarına yol açar. Airflow 2.4 ve sonraki sürümlerde, hassas verileri doğrudan AWS Secrets Manager'dan almak için dinamik değişken enjeksiyonundan yararlanabiliriz; bu sayede DAG'larınız güvenli, esnek ve uyumlu kalır.
Neden Statik Yapılandırmaya Karşı Dinamik Enjeksiyon?
Geleneksel yaklaşımlar genellikle gizli bilgileri airflow.cfg dosyasına yerleştirmeyi veya güncellemek için konteyner yeniden başlatması gerektiren ortam değişkenlerini kullanmayı içerir. Bu durum, sık rotasyon veya çoklu ortam dağıtımları için sorunludur. Dinamik enjeksiyon, Airflow'un gizli bilgileri çalışma zamanında almasını sağlar. Özel operatörleri veya Connection nesnesini AWS Boto3 ile birleştirerek, kimlik bilgilerin AWS tarafından hem iletim sırasında hem de dinlenme halinde şifrelenmesini, yalnızca bunlara ihtiyaç duyan belirli görevlere maruz bırakılmasını sağlayabilirsiniz.
Ön Gereksinimler ve Kurulum
Başlamak için, Airflow ortamınızın gerekli izinlere sahip olduğundan emin olun. Airflow işçilerinizle ilişkili IAM rolü veya kullanıcısının, belirli gizli bilgi ARN'leri için secretsmanager:GetSecretValue izinlerine sahip olması gerekir.
Öncelikle, Airflow gereksinimler dosyanıza gerekli bağımlılıkları yükleyin:
boto3>=1.26.0
Gizli Bilgi Alıcısının Uygulanması
Yeniden kullanılabilir bir yardımcı işlev oluşturmak en iyi uygulamadır. Bu, DAG'larınızı temiz tutar ve hata yönetimini merkezi hale getirir. Aşağıda, Boto3 ile entegre olan sağlam bir gizli bilgi alma işlevinin uygulaması yer almaktadır.
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'dan bir gizli bilgiyi getirir.
Args:
secret_id: Gizli bilginin adı veya ARN'si.
region_name: Gizli bilginin bulunduğu AWS bölgesi.
Returns:
JSON olarak ayrıştırılmış gizli bilgi dizgesini içeren bir sözlük.
"""
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 ve Dizi gizli bilgilerini işleme
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'da kullanım
import os
# Bu genellikle bir Görev veya Operatör içinde sarılır
DB_PASSWORD = get_aws_secret('prod/db-credentials')['password']
Airflow Bağlantılarıyla Entegrasyon
Ham şifreleri bireysel görevlere geçirmek yerine, Airflow'un yerleşik bağlantı yönetimini kullanmak daha iyidir. Bağlantı ekstralarını anında oluşturulma sırasında Secrets Manager'dan çözen özel bir Connection veya eklenti kullanabilirsiniz.
Daha gelişmiş bir yaklaşım için, Airflow 2.4+ (TaskFlow API) içindeki @task süsleyicisini (decorator) kullanarak gizli bilgileri küresel ad alanını kirletmeden doğrudan görev mantığına enjekte etmeyi düşünün.
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():
# Gizli bilgiler yalnızca görev çalıştığında alınır
credentials = get_aws_secret('app/api-key')
api_key = credentials['api_key']
# Gizli bilgi ile API çağrısı yap
# 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()
Güvenlik En İyi Uygulamaları
- En Az Yetki: Her ortam (dev, staging, prod) için yalnızca belirli gizli bilgi yollarına erişim yetkisine sahip ayrı IAM rolleri oluşturun.
- Gizli Bilgi Rotasyonu: AWS Secrets Manager'ı gizli bilgilerinizi otomatik olarak döndürmeye (rotate) yapılandırın. Airflow bunları dinamik olarak aldığı için, yeniden dağıtım yapmadan hemen fayda sağlarsınız.
- Günlük Kaydı Maskelenmesi: Asla tam gizli bilgi değerini günlük kaydına yazmayın. Yukarıdaki örnekte, güvenliği tehlikeye atmadan hata ayıklamaya yardımcı olmak için yalnızca son 4 karakteri günlük kaydına yazdık.
- Dinlenme Halinde Şifreleme: Sıkı uyumluluk gereksinimlerini karşılamak için gizli bilgilerinizde KMS Müşteri Yönetimli Anahtarları (CMK) kullanmayı sağlayın.
Sonuç
Airflow 2.4+ içinde AWS Secrets Manager ile dinamik değişken enjeksiyonunu benimseyerek, eski kimlik bilgisi riskini ortadan kaldırır ve altyapınızın saldırı yüzeyini azaltırsınız. Bu desen, karmaşık mikro hizmet mimarileri için iyi ölçeklenir ve veri mühendisliği ekiplerinizin anahtarları yönetmek yerine mantık oluşturmaya odaklanmasını sağlar. Boru hattı güvenliğinizi geleceğe hazırlamak için bu uygulamaları bugün hayata geçirin.