# Configuration Airflow

{{#include ../../banners/hacktricks-training.md}}

## Fichier de Configuration

**Apache Airflow** génère un **fichier de config** sur toutes les machines airflow appelé **`airflow.cfg`** dans le répertoire personnel de l'utilisateur airflow. Ce fichier de config contient des informations de configuration et **peut contenir des informations intéressantes et sensibles.**

**Il existe deux façons d'accéder à ce fichier : en compromettant une machine airflow ou en accédant à la console web.**

Notez que les **valeurs à l'intérieur du fichier de config** **peuvent ne pas être celles utilisées**, car vous pouvez les écraser en définissant des variables d'environnement telles que `AIRFLOW__WEBSERVER__EXPOSE_CONFIG: 'true'`.

Si vous avez accès au **fichier de config sur le serveur web**, vous pouvez vérifier la **vraie configuration en cours** sur la même page où la config est affichée.\
Si vous avez **accès à une machine dans l'environnement airflow**, vérifiez l'**environnement**.

Quelques valeurs intéressantes à vérifier lors de la lecture du fichier de config :

### \[api]

- **`access_control_allow_headers`** : Cela indique les **en-têtes autorisés** pour **CORS**
- **`access_control_allow_methods`** : Cela indique les **méthodes autorisées** pour **CORS**
- **`access_control_allow_origins`** : Cela indique les **origines autorisées** pour **CORS**
- **`auth_backend`** : [**Selon la documentation**](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html), quelques options peuvent être mises en place pour configurer qui peut accéder à l'API :
- `airflow.api.auth.backend.deny_all` : **Par défaut, personne** ne peut accéder à l'API
- `airflow.api.auth.backend.default` : **Tout le monde peut** y accéder sans authentification
- `airflow.api.auth.backend.kerberos_auth` : Pour configurer **l'authentification kerberos**
- `airflow.api.auth.backend.basic_auth` : Pour **l'authentification basique**
- `airflow.composer.api.backend.composer_auth` : Utilise l'authentification des compositeurs (GCP) (depuis [**ici**](https://cloud.google.com/composer/docs/access-airflow-api)).
- `composer_auth_user_registration_role` : Cela indique le **rôle** que l'**utilisateur compositeur** obtiendra dans **airflow** (**Op** par défaut).
- Vous pouvez également **créer votre propre méthode d'authentification** avec python.
- **`google_key_path`** : Chemin vers la **clé de compte de service GCP**

### **\[atlas]**

- **`password`** : Mot de passe Atlas
- **`username`** : Nom d'utilisateur Atlas

### \[celery]

- **`flower_basic_auth`** : Identifiants (_user1:password1,user2:password2_)
- **`result_backend`** : URL Postgres qui peut contenir des **identifiants**.
- **`ssl_cacert`** : Chemin vers le cacert
- **`ssl_cert`** : Chemin vers le cert
- **`ssl_key`** : Chemin vers la clé

### \[core]

- **`dag_discovery_safe_mode`** : Activé par défaut. Lors de la découverte des DAGs, ignorez tous les fichiers qui ne contiennent pas les chaînes `DAG` et `airflow`.
- **`fernet_key`** : Clé pour stocker des variables chiffrées (symétrique)
- **`hide_sensitive_var_conn_fields`** : Activé par défaut, cache les informations sensibles des connexions.
- **`security`** : Quel module de sécurité utiliser (par exemple kerberos)

### \[dask]

- **`tls_ca`** : Chemin vers ca
- **`tls_cert`** : Chemin vers le cert
- **`tls_key`** : Chemin vers la clé tls

### \[kerberos]

- **`ccache`** : Chemin vers le fichier ccache
- **`forwardable`** : Activé par défaut

### \[logging]

- **`google_key_path`** : Chemin vers les identifiants JSON GCP.

### \[secrets]

- **`backend`** : Nom complet de la classe du backend des secrets à activer
- **`backend_kwargs`** : Le paramètre backend_kwargs est chargé dans un dictionnaire et passé à **init** de la classe du backend des secrets.

### \[smtp]

- **`smtp_password`** : Mot de passe SMTP
- **`smtp_user`** : Utilisateur SMTP

### \[webserver]

- **`cookie_samesite`** : Par défaut, c'est **Lax**, donc c'est déjà la valeur la plus faible possible
- **`cookie_secure`** : Définir le **drapeau sécurisé** sur le cookie de session
- **`expose_config`** : Par défaut, c'est Faux, si vrai, la **config** peut être **lue** depuis la **console** web
- **`expose_stacktrace`** : Par défaut, c'est Vrai, cela affichera les **tracebacks python** (potentiellement utiles pour un attaquant)
- **`secret_key`** : C'est la **clé utilisée par flask pour signer les cookies** (si vous avez cela, vous pouvez **usurper l'identité de n'importe quel utilisateur dans Airflow**)
- **`web_server_ssl_cert`** : **Chemin** vers le **certificat** **SSL**
- **`web_server_ssl_key`** : **Chemin** vers la **clé** **SSL**
- **`x_frame_enabled`** : Par défaut, c'est **Vrai**, donc par défaut le clickjacking n'est pas possible

### Authentification Web

Par défaut, l'**authentification web** est spécifiée dans le fichier **`webserver_config.py`** et est configurée comme
```bash
AUTH_TYPE = AUTH_DB
```
Ce qui signifie que **l'authentification est vérifiée par rapport à la base de données**. Cependant, d'autres configurations sont possibles comme
```bash
AUTH_TYPE = AUTH_OAUTH
```
Pour laisser l'**authentification aux services tiers**.

Cependant, il existe également une option pour **permettre l'accès aux utilisateurs anonymes**, en définissant le paramètre suivant au **rôle souhaité** :
```bash
AUTH_ROLE_PUBLIC = 'Admin'
```
{{#include ../../banners/hacktricks-training.md}}
