dockerhardeningsecurite
MDstable
NoteSnippetChecklistPlaybook
Docker — Hardening & Sécurité
Checklist et commandes pour sécuriser un environnement Docker
checklistintermediate 2025-05-10 3 min read
dockerhardeningsecuriteconteneursdevsecops
Audit de sécurité Docker
bash
Variables
{{IMAGE}}
{{CONTAINER}}
# Audit avec Docker Bench Securitydocker run --rm --net host --pid host --userns host --cap-add audit_control-e DOCKER_CONTENT_TRUST$DOCKER_CONTENT_TRUST-v /etc/etcro-v /usr/bin/containerd/usr/bin/containerdro-v /usr/bin/runc/usr/bin/runcro-v /usr/lib/systemd/usr/lib/systemdro-v /var/lib/var/libro-v /var/run/docker.sock/var/run/docker.sockrodocker/docker-bench-security# Audit image avec Trivytrivy image {{IMAGE}}# Audit image avec Grypegrype {{IMAGE}}# Inspect containerdocker inspect {{CONTAINER}}docker stats {{CONTAINER}} --no-stream
Dockerfile sécurisé
dockerfile
# ✅ Bon exemple — image minimale + non-rootFROM node:20-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=productionFROM node:20-alpine AS runner# Créer user non-rootRUN addgroup -g 1001 -S appgroup && \adduser -S -u 1001 -G appgroup appuserWORKDIR /appCOPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modulesCOPY --chown=appuser:appgroup . .# Basculer sur user non-rootUSER appuser# Ne pas exposer port root (<1024)EXPOSE 3000# Health checkHEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \CMD node -e "require('http').get('http://localhost:3000/health', r => process.exit(r.statusCode === 200 ? 0 : 1))"CMD ["node", "server.js"]
docker-compose.yml sécurisé
yaml
Variables
{{SERVICE}}
version: '3.8'services:{{SERVICE}}:image: myapp:latest# Limites ressourcesdeploy:resources:limits:cpus: '0.5'memory: 512M# Sécuritésecurity_opt:- no-new-privileges:trueread_only: true# Tmpfs pour /tmptmpfs:- /tmp:noexec,nosuid,size=64m# Capabilities minimalescap_drop:- ALLcap_add:- NET_BIND_SERVICE # Seulement si nécessaire# User non-rootuser: "1001:1001"# Variables env depuis fichierenv_file:- .env# Réseau isolénetworks:- internal# Pas de port host sauf nécessaireexpose:- "3000"networks:internal:driver: bridgeinternal: true # Pas d'accès internet sauf via proxy
Checklist hardening Docker0/12
Commandes d'audit
bash
Variables
{{CONTAINER}}
{{IMAGE}}
# Processus dans le containerdocker exec {{CONTAINER}} ps aux# User courantdocker exec {{CONTAINER}} whoamidocker exec {{CONTAINER}} id# Fichiers SUID/SGID dans l'imagedocker run --rm --entrypoint sh {{IMAGE}} -c "find / -perm /6000 -type f 2>/dev/null"# Réseaux Dockerdocker network lsdocker network inspect bridge# Volumes montésdocker inspect {{CONTAINER}} | jq '.[].HostConfig.Binds'# Variables d'environnement (attention aux secrets !)docker inspect {{CONTAINER}} | jq '.[].Config.Env'
OPS·BRAIN v1.03 notes · DevOpslocal