Aller au contenu principal

Modèle de sécurité

Loch Deploy détient le socket Docker et lance des stacks compose pour les pipelines GitLab CI. Lisez cette page avant de l'exposer.

Modèle de confiance​

ActeurConfianceCe qu'il peut faire
Instance GitLabTotaleSigne les jetons. Qui la contrôle, ou contrôle sa clé de signature, contrôle toutes les stacks
Pipeline d'un projet autoriséPour ses propres stacksDéployer tout fichier compose qui respecte la politique, n'importe quelle image, n'importe quelle commande via /exec, n'importe quel nom d'environnement
Conteneurs d'une stackAucuneLancer des images arbitraires, écrire dans les répertoires de bind de la stack
Clients réseauAucuneAtteindre le serveur uniquement via le reverse proxy

Le serveur est conçu pour que le contrôle d'un pipeline ne s'étende ni à l'hôte ni aux stacks des autres projets : l'identité vient du jeton signé, les commandes compose sont limitées à la stack, la propriété est enregistrée par project_id, et la politique refuse les fonctionnalités compose qui donnent accès à l'hôte. Cette frontière n'est pas complète ; voir les risques ci-dessous.

Root avec le socket Docker​

Le processus tourne en root dans son conteneur, volontairement : le socket équivaut déjà à root sur l'hôte, et /directories doit faire des chown vers des uid arbitraires. Le déploiement de référence retire toutes les capacités sauf CHOWN, FOWNER et DAC_OVERRIDE, active no-new-privileges et un système de fichiers racine en lecture seule. Cela limite le conteneur, pas ce qui passe par le socket.

Toute faille exploitable du serveur, de sa politique ou de ses dépendances est une compromission root de l'hôte.

Risques résiduels​

En supposant que la liste de contrôle de durcissement est respectée :

IDRisqueNiveau
A1Collision de slugs : deux projets peuvent aboutir à la même clé de stack ; le premier déploiement la possèdeMoyen
A2Course aux liens symboliques sur les sources de bind entre la validation et up (anciens conteneurs invisibles pour le serveur)Faible
A3L'interpolation ${VAR} lit l'environnement du serveurFaible à moyen
A4Les ports: publiés sont autorisés et contournent le proxyMoyen
A5Une stack peut router le nom d'hôte d'une autre stack dans Traefik, ou casser ses routeursMoyen
A6Accaparement de container_name entre clés partageant un préfixe (déni de service seulement)Faible
A7Aucun quota de CPU, de mémoire, de disque ou de nombre de stacksMoyen
A8L'attente d'un créneau docker est hors du budget de temps : un déploiement peut dépasser 16 minutesFaible
A9La politique est une liste de refus : les nouveaux attributs compose sont autorisés par défautFaible
A10Une compromission du serveur donne root sur l'hôteImpact élevé
A11Les routeurs des projets peuvent s'attacher à l'entrypoint de déploiement :8443Faible

Mécanismes et atténuations de chaque risque : SECURITY.md.

Atténuations hors du serveur : un pare-feu sur l'hôte pour les ports publiés (A4), tous les hôtes sensibles dans FORBIDDEN_TRAEFIK_HOSTS (A5), et une revue de la politique à chaque mise à jour de Compose (A9).

À ne jamais faire​

attention
  • Publier :8080, ou attacher deploy-server à un réseau que les stacks peuvent rejoindre.
  • Ajouter deploy-internal ou socket-proxy à ALLOWED_EXTERNAL_NETWORKS.
  • Élargir TRUSTED_PROXIES au-delà de l'adresse exacte du proxy.
  • Mettre des secrets dans l'environnement du serveur.
  • Lancer -import-registry pendant que le serveur tourne.
  • Ajouter un USER non root à l'image : le serveur a besoin de root par conception.
  • Compter sur :ro pour le socket Docker : il protège le fichier, pas l'API.

Bon à savoir​

  • Les jetons sont refusés 10 minutes après leur émission ; 30 secondes de décalage d'horloge sont tolérées.
  • Le journal d'audit ne contient jamais l'e-mail de l'utilisateur, seulement son login GitLab.
  • Les outils de l'hôte qui parcourent WEBSITES_BASE (sauvegardes, chown -R) ne doivent pas suivre les liens symboliques : les conteneurs peuvent en créer dans leurs propres répertoires.
  • Signalez les problèmes de sécurité en privé aux mainteneurs, pas dans des issues publiques.