# Kubernetes SecurityContext(s)

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

## PodSecurityContext <a href="#podsecuritycontext-v1-core" id="podsecuritycontext-v1-core"></a>

[**D'après la documentation :**](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core)

Lors de la spécification du contexte de sécurité d'un Pod, vous pouvez utiliser plusieurs attributs. D'un point de vue de sécurité défensive, vous devriez considérer :

- Avoir **runASNonRoot** comme **Vrai**
- Configurer **runAsUser**
- Si possible, envisager de **limiter** les **permissions** en indiquant **seLinuxOptions** et **seccompProfile**
- Ne **PAS** donner d'accès au **groupe** de **privilèges** via **runAsGroup** et **supplementaryGroups**

| Paramètre                                                                                                                                                                                                                                                                                                                                                                                                                                  | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroup</strong></a><br><em>integer</em></p>                                                                                                                                                                                                                                                 | <p>Un groupe supplémentaire spécial qui s'applique à <strong>tous les conteneurs dans un pod</strong>. Certains types de volumes permettent au Kubelet de <strong>changer la propriété de ce volume</strong> pour qu'il soit possédé par le pod :<br>1. Le GID propriétaire sera le FSGroup<br>2. Le bit setgid est défini (les nouveaux fichiers créés dans le volume seront possédés par FSGroup)<br>3. Les bits de permission sont OR'd avec rw-rw---- Si non défini, le Kubelet ne modifiera pas la propriété et les permissions de tout volume</p> |

| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>fsGroupChangePolicy</strong></a><br><em>string</em></p>                                                                                                                                                                                                                                      | Cela définit le comportement de **changement de propriété et de permission du volume** avant d'être exposé à l'intérieur du Pod.                                                                                                                                                                                                                                                                                                                                                                         |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p>                                                                                                                                                                                                                                              | Le **GID pour exécuter le point d'entrée du processus du conteneur**. Utilise la valeur par défaut d'exécution si non défini.                                                                                                                                                                                                                                                                                                                                                        |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p>                                                                                                                                                                                                                                            | Indique que le conteneur doit s'exécuter en tant qu'utilisateur non-root. Si vrai, le Kubelet validera l'image à l'exécution pour s'assurer qu'elle ne s'exécute pas en tant que UID 0 (root) et échouera à démarrer le conteneur si c'est le cas.                                                                                                                                                                                                                                                                          |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p>                                                                                                                                                                                                                                               | Le **UID pour exécuter le point d'entrée du processus du conteneur**. Par défaut, il s'agit de l'utilisateur spécifié dans les métadonnées de l'image si non spécifié.                                                                                                                                                                                                                                                                                                                                                              |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>Plus d'infos sur</em> <em><strong>seLinux</strong></em></p>                                                           | Le **contexte SELinux à appliquer à tous les conteneurs**. Si non spécifié, le runtime du conteneur allouera un contexte SELinux aléatoire pour chaque conteneur.                                                                                                                                                                                                                                                                                                                             |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a><br><em>Plus d'infos sur</em> <em><strong>Seccomp</strong></em></p>                                                           | Les **options seccomp à utiliser par les conteneurs** dans ce pod.                                                                                                                                                                                                                                                                                                                                                                                                                         |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>supplementalGroups</strong></a><br><em>integer array</em></p>                                                                                                                                                                                                                                | Une liste de **groupes appliqués au premier processus exécuté dans chaque conteneur**, en plus du GID principal du conteneur.                                                                                                                                                                                                                                                                                                                                                                  |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>sysctls</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#sysctl-v1-core"><em>Sysctl</em></a> <em>array</em><br><em>Plus d'infos sur</em> <a href="https://www.garron.me/en/go2linux/sysctl-linux.html"><em><strong>sysctls</strong></em></a></p> | Les sysctls contiennent une liste de **sysctls nommés utilisés pour le pod**. Les pods avec des sysctls non pris en charge (par le runtime du conteneur) pourraient échouer à se lancer.                                                                                                                                                                                                                                                                                                                                        |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p>                                                                                           | Les paramètres spécifiques à Windows appliqués à tous les conteneurs. Si non spécifié, les options dans le SecurityContext d'un conteneur seront utilisées.                                                                                                                                                                                                                                                                                                                                               |

## SecurityContext

[**D'après la documentation :**](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core)

Ce contexte est défini à l'intérieur des **définitions de conteneurs**. D'un point de vue de sécurité défensive, vous devriez considérer :

- **allowPrivilegeEscalation** à **Faux**
- Ne pas ajouter de **capabilités** sensibles (et supprimer celles dont vous n'avez pas besoin)
- **privileged** à **Faux**
- Si possible, définir **readOnlyFilesystem** comme **Vrai**
- Définir **runAsNonRoot** à **Vrai** et définir un **runAsUser**
- Si possible, envisager de **limiter** les **permissions** en indiquant **seLinuxOptions** et **seccompProfile**
- Ne **PAS** donner d'accès au **groupe** de **privilèges** via **runAsGroup.**

Notez que les attributs définis dans **SecurityContext et PodSecurityContext**, la valeur spécifiée dans **SecurityContext** prend **précédence**.

| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>allowPrivilegeEscalation</strong></a><br><em>boolean</em></p>                                                                                                                                                                      | **AllowPrivilegeEscalation** contrôle si un processus peut **gagner plus de privilèges** que son processus parent. Ce booléen contrôle directement si le drapeau no_new_privs sera défini sur le processus du conteneur. AllowPrivilegeEscalation est toujours vrai lorsque le conteneur est exécuté en tant que **Privileged** ou a **CAP_SYS_ADMIN** |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>capabilities</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#capabilities-v1-core"><em>Capabilities</em></a><br><em>Plus d'infos sur</em> <em><strong>Capabilities</strong></em></p>  | Les **capabilités à ajouter/retirer lors de l'exécution des conteneurs**. Par défaut, il s'agit de l'ensemble par défaut de capacités.                                                                                                                                                                                                                |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>privileged</strong></a><br><em>boolean</em></p>                                                                                                                                                                                    | Exécuter le conteneur en mode privilégié. Les processus dans les conteneurs privilégiés sont essentiellement **équivalents à root sur l'hôte**. Par défaut, c'est faux.                                                                                                                                                                           |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>procMount</strong></a><br><em>string</em></p>                                                                                                                                                                                      | procMount désigne le **type de montage proc à utiliser pour les conteneurs**. La valeur par défaut est DefaultProcMount qui utilise les valeurs par défaut du runtime du conteneur pour les chemins en lecture seule et les chemins masqués.                                                                                                                                |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>readOnlyRootFilesystem</strong></a><br><em>boolean</em></p>                                                                                                                                                                        | Indique si ce **conteneur a un système de fichiers racine en lecture seule**. La valeur par défaut est fausse.                                                                                                                                                                                                                                         |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsGroup</strong></a><br><em>integer</em></p>                                                                                                                                                                                    | Le **GID pour exécuter le point d'entrée** du processus du conteneur. Utilise la valeur par défaut d'exécution si non défini.                                                                                                                                                                                                                            |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsNonRoot</strong></a><br><em>boolean</em></p>                                                                                                                                                                                  | Indique que le conteneur doit **s'exécuter en tant qu'utilisateur non-root**. Si vrai, le Kubelet validera l'image à l'exécution pour s'assurer qu'elle ne s'exécute pas en tant que UID 0 (root) et échouera à démarrer le conteneur si c'est le cas.                                                                                                      |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>runAsUser</strong></a><br><em>integer</em></p>                                                                                                                                                                                     | Le **UID pour exécuter le point d'entrée** du processus du conteneur. Par défaut, il s'agit de l'utilisateur spécifié dans les métadonnées de l'image si non spécifié.                                                                                                                                                                                              |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seLinuxOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#selinuxoptions-v1-core"><em>SELinuxOptions</em></a><br><em>Plus d'infos sur</em> <em><strong>seLinux</strong></em></p> | Le **contexte SELinux à appliquer au conteneur**. Si non spécifié, le runtime du conteneur allouera un contexte SELinux aléatoire pour chaque conteneur.                                                                                                                                                              |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>seccompProfile</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#seccompprofile-v1-core"><em>SeccompProfile</em></a></p>                                                               | Les **options seccomp** à utiliser par ce conteneur.                                                                                                                                                                                                                                                                     |
| <p><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core"><strong>windowsOptions</strong></a><br><a href="https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#windowssecuritycontextoptions-v1-core"><em>WindowsSecurityContextOptions</em></a></p>                                 | Les **paramètres spécifiques à Windows** appliqués à tous les conteneurs.                                                                                                                                                                                                                                                          |

## Références

- [https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#podsecuritycontext-v1-core)
- [https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#securitycontext-v1-core)

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