Cloud & K8s
Notes cloud, conteneurs et CI/CD (données de lab).
Docker (bases)
docker build . -t mon_image
docker run -p 8080:80 nginx
docker network create --driver bridge mon-bridge
docker run -dit --name alpine1 --network mon-bridge alpine
docker exec alpine1 ping -c 1 alpine2
# Registry local minikube
eval $(minikube docker-env)
docker build . --tag localhost:5000/ma_premiere_image
docker push localhost:5000/ma_premiere_image
curl http://localhost:5000/v2/_catalog
Kubernetes (Kube)
kubectl whoami
kubectl auth can-i --list
kubectl get <ressource> <nom> -o yaml
kubectl get pods
crane auth x.x.x -u xxxx -p xxxx
crane pull image /tmp/mg.tar
Azure CLI (DevOps)
az devops login
az pipelines list --query "[].{name:name,id:id}" -o table
az devops security group list --project "Pentest"
az devops security group membership list --id <GROUP_ID> -o table
az devops security permission list --id "Pipeline/<PIPELINE_ID>" --subject "<USER_ID>"
Scénarios d’attaque Azure DevOps / CI-CD
Lire des variables cachées à travers les pipelines : injecter
echo $(var) | base64(ourev) dans un header curl d’un step.Attribuer des rôles sur une ressource (souscription Azure) via un pipeline privilégié :
az role assignment create --assignee <ID> --role "Contributor" --scope "<scope>"Accéder à un repo secret que l’utilisateur ne peut pas lire mais le pipeline oui :
curl -H "Authorization: Bearer $(System.AccessToken)" https://dev.azure.com/{org}/{project}/_apis/git/repositories?api-version=7.1ou déclarer
resources: repositories: - repository: secretetcheckout: secret.Build validation activée → exécuter du code via pre-merge pull request.
Tests non isolés pouvant modifier des fichiers de build → monter en read-only / isoler dans des conteneurs.
Service connection garantie à tous les pipelines → restreindre par branch control (
allowed branches: main).
Bypass de restrictions : changer le trigger vers main (auto) ou vers une nouvelle branche pour contourner les politiques de reviewers. Solution : restrictions (checks) sur les service connections / variables et branch control.
Références : Azure DevOps Privilege Escalation: Pipeline Shenanigans (Anniek van der Peijl), Azure DevOps security – Lessons learned (Björn Sundling).
Terraform state file → prise de contrôle pipeline (study case)
Si un red teamer peut modifier uniquement le fichier terraform.state d’un bucket S3 :
- Suppression de ressources : insérer une ressource factice pointant vers l’ID réel à détruire, ou modifier un attribut non-updatable in place → Terraform propose de détruire/recréer.
- Exécution de code : publier un custom provider malveillant (fonction
New()qui fait un GET vers un webhook) puis référencer ce provider dans le state (registry.terraform.io/<user>/terrarizer). Le code s’exécute dèsterraform init, même sansapply.
Mitigations : figer (pin) les providers hors pipeline (image immuable), sécuriser le state (permissions/KMS pour que seul le pipeline y écrive), activer le state locking (DynamoDB), stocker le lock dans un emplacement séparé, utiliser un rôle read-only pour terraform plan.
Détection de vulnérabilités IaC (Checkov / Terra)
Exemples de checks Azure fréquents :
| Check | Risque | Fix |
|---|---|---|
| CKV_AZURE_10 / 9 | SSH/RDP ouverts (source_address_prefix = "*") |
Restreindre à un CIDR de confiance |
| CKV_AZURE_113 | SQL server public | public_network_access_enabled = false |
| CKV_AZURE_23/24 | SQL sans auditing | Ajouter azurerm_mssql_server_extended_auditing_policy |
| CKV_AZURE_3 | Storage sans HTTPS | enable_https_traffic_only = true |
| CKV_AZURE_35 | Storage réseau ouvert | network_rules { default_action = "Deny" } |
| CKV_AZURE_120 | App Gateway sans WAF | waf_configuration { enabled = true, firewall_mode = "Prevention" } |
AKS (Kubernetes managé)
azure_policy add-on, désactiver le dashboard, activer OMS agent (logging), chiffrement disque (disk_encryption_set_id), private_cluster_enabled = true, network_policy (azure/calico), api_server_authorized_ip_ranges, RBAC (role_based_access_control { enabled = true }).
App Services / VM / Key Vault / Storage
App Services : min_tls_version = "1.2", ftps_state = "Disabled", https_only = true, managed identity, auth AAD. VM : disable_password_authentication = true + admin_ssh_key, chiffrement OS disk. Key Vault : network_acls default_action = "Deny", purge_protection_enabled = true, soft_delete_retention_days = 90, clés HSM et expiration. Storage : chiffrement disque/CMK, default_action = "Deny", logging queue, min_tls_version = "TLS1_2".
LLM (prompt injection)
- Poser la même question plusieurs fois, changer les mots (password, secret).
- Injection de commande :
;ls,$(ls), indirect prompt injection. - XSS indirect/direct avec des
"quotes".
OWASP Top 10 CI/CD Security Risks
CICD-SEC-1 Insufficient Flow Control · SEC-2 Inadequate IAM · SEC-3 Dependency Chain Abuse · SEC-4 Poisoned Pipeline Execution (PPE) · SEC-5 Insufficient PBAC · SEC-6 Insufficient Credential Hygiene · SEC-7 Insecure System Configuration · SEC-8 Ungoverned 3rd-Party Services · SEC-9 Improper Artifact Integrity Validation · SEC-10 Insufficient Logging & Visibility.
Outils d’audit K8s / Cloud
- kube-bench, kube-scan, kube-hunter, Polaris, kubeaudit
- Chef Inspec +
cis-kubernetes-benchmark - rbac-police (PaloAltoNetworks)
- ScoutSuite :
python3 scout.py Azure --cli