Je voudrais mettre en place une instance Docker renforcée, principalement pour exécuter des micro-services tels que des applications golang compilées statiquement. Ce que je recherche, c'est de protéger le système d'exploitation hôte contre un conteneur escroc et les conteneurs les uns des autres. J'ai essayé de résumer la situation avec le scénario suivant.
Scénario:
Nous avons un serveur exécutant un OS minimal tel qu'Alpine Linux (OS basé sur busybox), avec SElinux et grsec installés, activés et correctement configurés.
Sur ce serveur s'exécute une instance Docker avec 2 conteneurs en cours d'exécution, A et B et un volume V.
Le conteneur A contient une application compilée statiquement sans dépendances, mise en réseau avec l'Internet public (application Web ou API publique). Cette application contient un énorme bogue, quelque chose comme l'exécution arbitraire de code/téléchargement/shell inverse complet, le pire que vous puissiez imaginer. Ce conteneur est également mis en réseau avec le volume V en tant que destination de téléchargement, base de données, etc.
Le système d'exploitation hôte contient un indicateur qui ne peut être lu qu'à la racine (appliqué par SElinux).
Le conteneur B contient également un drapeau et une application mais aucune connexion au monde extérieur.
Attaquant:
Hypothèses:
Objectif:
Questions:
Mes suggestions:
Utilisez une image Docker extrêmement minimale, sans espace utilisateur. Quelque chose comme:
FROM scratch
COPY app /
ENTRYPOINT ["/app"]
Désescalader le privilège avant d'exécuter l'application. (Je ne sais pas quelle est la bonne façon de le faire ...)
/bin/sh
, /bin/ls
ou quelque chose comme ça.Je vous renvoie aux CIS Benchmarks pour des directives de durcissement. La référence CIS actuelle pour Docker peut être trouvée ici . Il s'agit d'une norme industrielle acceptée pour le durcissement de base. Ils offrent également des directives pour Linux et al, les serveurs Web, les bases de données, etc.