Apache Airflow Security
Temel Bilgiler
Apache Airflow, veri boru hatlarını veya iş akışlarını düzenlemek ve zamanlamak için bir platform olarak hizmet verir. Veri boru hatları bağlamında "orkestrasyon" terimi, çeşitli kaynaklardan gelen karmaşık veri iş akışlarının düzenlenmesi, koordinasyonu ve yönetimi sürecini ifade eder. Bu orkestrasyon edilen veri boru hatlarının temel amacı, işlenmiş ve tüketilebilir veri kümelerini sunmaktır. Bu veri kümeleri, iş zekası araçları, veri bilimi ve makine öğrenme modelleri de dahil olmak üzere birçok uygulama tarafından yaygın olarak kullanılmaktadır ve büyük veri uygulamalarının işleyişine temel oluşturur.
Temel olarak, Apache Airflow, bir şey olduğunda (olay, cron) kodun yürütülmesini zamanlamak için size izin verecektir.
Yerel Laboratuvar
Docker-Compose
Tam bir Apache Airflow docker ortamını başlatmak için https://raw.githubusercontent.com/apache/airflow/main/docs/apache-airflow/start/docker-compose.yaml adresindeki docker-compose yapılandırma dosyasını kullanabilirsiniz. (MacOS'ta iseniz, docker VM'ye en az 6GB RAM verdiğinizden emin olun).
Minikube
Apache Airflow'ı çalıştırmanın kolay bir yolu, minikube ile çalıştırmaktır:
Airflow Yapılandırması
Airflow, yapılandırmasında hassas bilgileri saklayabilir veya zayıf yapılandırmalar bulunabilir:
Airflow ConfigurationAirflow RBAC
Airflow'u saldırmadan önce izinlerin nasıl çalıştığını anlamanız gerekmektedir:
Airflow RBACSaldırılar
Web Konsolu Sorgulaması
Eğer web konsoluna erişiminiz varsa, aşağıdaki bilgilere bazı veya tümüne erişebilirsiniz:
Değişkenler (Özel hassas bilgiler burada saklanabilir)
Bağlantılar (Özel hassas bilgiler burada saklanabilir)
http://<airflow>/connection/list/
adresinden erişebilirsinizYapılandırma (Gizli anahtar (
secret_key
) ve şifreler gibi hassas bilgiler burada saklanabilir)Kullanıcılar ve rollerin listesi
Her bir DAG'ın kodu (ilginç bilgiler içerebilir)
Değişken Değerlerini Almak
Değişkenler, Airflow'da saklanabilir, böylece DAG'lar değerlerine erişebilir. Diğer platformların sırlarına benzer. Yeterli izinlere sahipseniz, bunlara GUI'de http://<airflow>/variable/list/
adresinden erişebilirsiniz.
Airflow, varsayılan olarak değişkenin değerini GUI'de gösterecektir, ancak bu kaynağa göre, GUI'de yıldızlar olarak görünecek değerin listesini ayarlamak mümkündür.
Ancak, bu değerler hala CLI (DB erişimi gerektirir), rastgele DAG yürütme, API ile değişkenler uç noktasına erişme (API'nin etkinleştirilmesi gerekmektedir) ve GUI kendisi aracılığıyla alınabilir. GUI'den bu değerlere erişmek için sadece erişmek istediğiniz değişkenleri seçin ve Eylemler -> Dışa Aktar üzerine tıklayın. Başka bir yol, gizli değeri elde etmek için arama filtrelemesi kullanarak brute force yapmaktır:
Yetki Yükseltme
Eğer expose_config
yapılandırması True olarak ayarlanmışsa, Kullanıcı rolünden ve yukarısından olan herkes web üzerinden yapılandırmayı okuyabilir. Bu yapılandırmada secret_key
görünür, bu da bu geçerli anahtara sahip herhangi bir kullanıcının kendi imzalı çerezini oluşturarak başka bir kullanıcı hesabını taklit edebileceği anlamına gelir.
DAG Arka Kapısı (Airflow worker'da RCE)
Eğer DAG'ların kaydedildiği yere yazma erişiminiz varsa, sadece bir tane oluşturabilirsiniz ve size bir ters kabuk gönderecektir. Bu ters kabuk, bir airflow worker konteyneri içinde çalıştırılacaktır:
DAG Arka Kapısı (Airflow zamanlayıcısında RCE)
Eğer bir şeyi kodun kökünde çalışacak şekilde ayarlarsanız, bu yazı yazıldığı sırada, bunun DAG klasörüne yerleştirildikten birkaç saniye sonra zamanlayıcı tarafından çalıştırılacaktır.
DAG Oluşturma
Eğer DAG kümesi içindeki bir makineyi ele geçirebilirseniz, dags/
klasöründe yeni DAG betikleri oluşturabilir ve bu betikler DAG kümesindeki diğer makinelerde de replike edilecektir.
DAG Kod Enjeksiyonu
GUI üzerinden bir DAG çalıştırdığınızda, ona argümanlar geçirebilirsiniz. Bu nedenle, DAG düzgün bir şekilde kodlanmamışsa Komut Enjeksiyonuna açık olabilir. Bu CVE'de olduğu gibi: https://www.exploit-db.com/exploits/49927
DAG'larda komut enjeksiyonlarını aramaya başlamak için bilmeniz gereken tek şey, parametrelerin kodla erişildiği kodun dag_run.conf.get("param_name")
olduğudur.
Ayrıca, aynı zafiyet değişkenlerle de oluşabilir (not edin ki yeterli yetkilere sahipseniz GUI üzerindeki değişkenlerin değerini kontrol edebilirsiniz). Değişkenlere şu şekilde erişilir:
Eğer örneğin bir bash komutu içinde kullanılıyorlarsa, komut enjeksiyonu gerçekleştirebilirsiniz.
Last updated