Retour au cours

Leçon 24 : Utilisateurs Non-Root et Meilleures Pratiques de Sécurité des Conteneurs

Docker, de zéro à héros : Le cours complet sur la conteneurisation pour débutants

Leçon 24 : Utilisateurs Non-Root et Meilleures Pratiques de Sécurité des Conteneurs

La sécurité doit être une priorité. Par défaut, les processus à l'intérieur d'un conteneur Docker s'exécutent en tant qu'utilisateur root, ce qui constitue un risque de sécurité majeur.

Le Problème du Root

Si un acteur malveillant prend le contrôle d'un conteneur s'exécutant en tant que root, il pourrait exploiter une vulnérabilité dans le démon Docker ou le noyau Linux pour obtenir un accès root à la machine hôte.

Solution : L'Instruction USER

L'instruction USER dans un Dockerfile définit l'utilisateur (par nom ou UID) qui exécutera toutes les commandes suivantes (RUN, CMD, ENTRYPOINT).

Exemple : Création et Utilisation d'un Utilisateur Dédié

  1. Créer l'utilisateur et le groupe : dockerfile FROM alpine:latest

    Créer un groupe et un utilisateur non-root

    RUN addgroup -S appgroup && adduser -S appuser -G appgroup

    WORKDIR /app

    Assurez-vous que le nouvel utilisateur est propriétaire du répertoire de l'application

    RUN chown -R appuser:appgroup /app

    Passer à l'utilisateur non-root

    USER appuser

    Le CMD s'exécutera maintenant en tant que 'appuser'

    CMD ["node", "server.js"]

  2. Utilisation d'Utilisateurs Pré-existants : De nombreuses images de base (comme Node.js, Python, ou Alpine) fournissent déjà des utilisateurs non-root auxquels vous pouvez passer immédiatement, comme node ou python.

    dockerfile FROM node:20-slim

    Passer directement à l'utilisateur fourni par l'image de base

    USER node

    WORKDIR /home/node/app COPY . .

    CMD ["npm", "start"]

Autres Conseils de Sécurité

  • Utilisez de Petites Images de Base : Utilisez des images alpine ou slim au lieu d'images OS complètes (par exemple, ubuntu) pour minimiser la surface d'attaque.
  • Utilisez les Constructions Multi-Étapes (Leçon 21) : Éliminez les outils de construction inutiles de l'image finale.
  • Restreindre les Capacités : Utilisez le drapeau --cap-drop lors de docker run pour supprimer les capacités du noyau inutiles du conteneur.