• Assurez la sécurité des applications de la bonne manière! Détectez, protégez, surveillez, accélérez et plus encore…
  • Voyons comment renforcer et sécuriser le Docker pour l'environnement de production.

    Bien que Docker a permis aux développeurs de logiciels et aux ingénieurs DevOps de créer et de déployer rapidement des applications, il est également livré avec une grande surface d'attaque pour les cyber-pirates pour tirer parti.

    Nous verrons comment sécuriser un Docker sur une plate-forme Linux à partir de ce qui suit.

    • Défauts de configuration
    • Exécution de code à distance
    • Débordements de tampon
    • Falsification d'images et ainsi de suite.

    Nous utiliserons les outils suivants, tels que Serveur notaire de Docker signer des images et Sécurité du banc Docker pour vérifier l'hôte, la configuration du démon, etc.

    Avant de procéder à la sécurisation, abordons les bases.

    Qu'est-ce qu'une technologie de conteneur?

    La technologie de conteneur permet aux développeurs ou aux ingénieurs DevOps de conditionner une application afin qu'elle puisse s'exécuter avec des dépendances isolées des autres processus.

    Il existe un certain nombre de technologies de conteneurs sur le marché, telles que Apache Mesos, fusée, lxcainsi que Docker. Bien qu'ils entrent dans la catégorie de la technologie des conteneurs, ils fonctionnent différemment.

    Différence entre VM et VE

    Un hôte de machine virtuelle est entièrement différent d'un hôte d'environnement virtuel. Sur les machines virtuelles, chaque application conteneurisée est livrée avec son propre ensemble de bibliothèques et de système d'exploitation, tandis que les applications, par défaut, sur un hôte d'environnement virtuel tel que lxc et docker partagent le noyau Linux.

    Qu'est-ce que Docker?

    Docker est une technologie de conteneur utilisée par des millions de personnes pour créer une application Web et la déployer d'un environnement de test à un environnement de production.

    Docker Engine

    Le Docker Engine est composé de trois composants.

    • Un serveur: ce composant est un processus ou un démon de longue durée chargé de gérer les images et les conteneurs.
    • API REST: Cette interface permet au démon docker et à l'outil client docker de communiquer.
    • Outil client Docker: l'outil client Docker utilise le composant API REST pour informer le démon docker d'exploiter une application conteneurisée.

    Registre de confiance Docker

    Docker Trusted Registry est une solution de stockage d'images de Docker pour le secteur des plates-formes d'entreprise. C'est différent du hub docker. Alors que le docker hub est hébergé dans le cloud, le registre de confiance docker est une solution de stockage sur site pour Édition entreprise Docker.

    Trust du contenu Docker

    Docker Content Trust offre la possibilité d'utiliser des signatures de données pour les images envoyées et reçues vers et depuis des registres Docker distants tels que Docker Hub.

    Espaces de noms Linux

    Les espaces de noms Linux sont une fonctionnalité du noyau Linux qui isole une application ou un processus conteneurisé s'exécutant sur un hôte d'environnement virtuel des autres processus.

    Groupes de contrôle Linux (Cgroups)

    Les groupes de contrôle Linux est une fonctionnalité du noyau Linux qui vous permet d'allouer des ressources telles que le temps CPU, la bande passante réseau, la mémoire système, etc. aux processus actifs sur un hôte.

    CAPACITÉS

    Sous Linux, il existe une fonction de sécurité dans le sous-système du noyau qui peut être définie ou appliquée pour limiter le processus privilégié, un processus exécuté par un utilisateur avec l'UID 1. Bien que les processus ou les utilisateurs privilégiés puissent contourner les autorisations de contrôle d'accès discrétionnaires, ils ne peuvent pas contourner règles de capacités.

    Concentrons-nous maintenant sur la sécurité.

    Sécurisation de l'hôte Docker

    Dans cette section, nous verrons comment sécuriser l'hôte sur lequel réside Docker.

    Analyse du noyau Linux

    Avant d'héberger un docker sur une plate-forme Linux, vous devez d'abord inspecter le noyau. Il existe plusieurs outils open source tels que Lynis et OpenVAS vous pouvez utiliser pour analyser le noyau Linux.

    Copiez ou clonez le projet Lynis à partir de Github à l'aide du git clone commander.

    git clone https://github.com/CISOfy/lynis.git

    Ensuite, utilisez la commande ci-dessous pour accéder au lynis répertoire et auditez le système Linux.

    cd lynis; ./lynis audit system

    Durcir le noyau Linux

    Après avoir analysé le noyau Linux à la recherche de vulnérabilités système, vous pouvez ajouter une autre couche de protection supplémentaire au noyau via grsécurité. Il fournit des fonctionnalités de sécurité telles que les suivantes.

    • Prévention de l'exploitation du Buffer Overflow
    • / tmp prévention de la vulnérabilité des courses
    • / proc restrictions qui ne divulguent pas d'informations sur les propriétaires de processus.
    • Prévention de l'exécution de code arbitraire dans le noyau et ainsi de suite.

    Au départ, vous pouvez Télécharger patchs gratuitement depuis grsecurity et appliquez-le à votre noyau actuel. Mais il n'autorise plus les correctifs gratuits.

    Installer Docker dans une VM

    Au lieu d'installer Docker directement sur un hôte Linux, vous pouvez ajouter une couche de protection supplémentaire en l'installant dans une machine virtuelle. Ce faisant, même s'il y a un problème de vulnérabilité avec le noyau hôte, cela n'affectera pas les conteneurs docker.

    Protéger les privilèges root

    Par défaut, Docker nécessite des privilèges root pour créer et gérer des conteneurs. Le script malveillant peut exploiter cette surface d'attaque pour atteindre un super-utilisateur sur un hôte Linux et éventuellement accéder à des fichiers / dossiers sensibles, des images, des certificats, etc.

    Pour éviter cela, nous pouvons utiliser la commande suivante. Nous pouvons décider de supprimer des fonctionnalités telles que setgid et setuid pour empêcher d'autres programmes ou processus de changer leur GID en un autre GID ce qui peut entraîner une élévation de privilèges. Vous pouvez également vérifier ici pour une liste de définition des capacités Linux.

    La commande ci-dessous exécute le conteneur du serveur Web Apache et supprime le setgid et setuid capacités via --cap-drop pour empêcher le conteneur Apache de changer son GID et UID en un autre UID et GID.

    GID et UID dans ce contexte font référence à  group ID et user ID respectivement.

    docker run -d --cap-drop SETGID --cap-drop SETUID apache

    Utilisateur Docker

    En plus d'empêcher d'autres programmes ou processus, vous pouvez également créer un utilisateur pour gérer les opérations de docker telles que docker run  au lieu de le gérer via un superutilisateur.

    Vous pouvez ajouter ou créer un utilisateur Docker via les éléments suivants:

    sudo groupadd docker

    La commande ci-dessus crée un groupe appelé docker

    Ensuite, créez un utilisateur à l'aide de la commande ci-dessous:

    sudo useradd mike

    Enfin, utilisez la commande ci-dessous pour ajouter un utilisateur mike au groupe docker pour administrer les opérations des dockers.

    sudo usermod  -aG docker mike

    Gérer le conteneur avec les groupes de contrôle

    Dans un environnement de production, vous pouvez avoir plusieurs conteneurs.

    Si vous n'avez pas cgroups installé sur votre hôte, vous pouvez utiliser la commande suivante pour l'installer puis vérifier ici (pour Ubuntu) sur la façon de le configurer.

    sudo apt-get install cgroup-bin cgroup-lite cgroup-tools cgroupfs-mount libcgroup1

    Nous pouvons allouer les conteneurs à des ressources CPU limitées via le --cpu-shares et --cpuset-cpus

    L'exemple de commande suivant montre prodnginx le processus de conteneur est exécuté uniquement sur le premier cœur via --cpuset-cpus et alloue 20 CPU via  --cpu-shares tandis que le proxnginx Le processus de conteneur est exécuté sur les deux premiers cœurs de CPU et se voit également allouer 20 CPU.

    docker run -d --name prodnginx --cpuset-cpus=0 --cpu-shares=20 nginx
    docker run -d --name testnginx --cpuset-cpus=2 --cpu-shares=20 nginx

    Tapez ensuite la commande docker stats pour afficher l'utilisation du processeur par le prodnginx et testnginx conteneurs

    CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O
    845bea7263fb        prodnginx            57.69%              1.258MiB / 985.2MiB   0.13%               578B / 0B           1.33MB / 0B 
    189ba15e8258        testnginx            55.85%              1.25MiB / 985.2MiB    0.13%               578b / 0B           1.33MB / 0B 

    Il est judicieux de définir des partages CPU pour un hôte docker lorsque plusieurs conteneurs sont exécutés dessus.

    Gestion des conteneurs avec des espaces de noms

    Un espace de noms peut empêcher les conteneurs de s'exécuter en tant qu'utilisateurs privilégiés, ce qui peut aider à éviter les attaques d'escalade de privilèges.

    Nous pouvons activer l'espace de noms dans le docker en utilisant /etc/subuid  et   /etc/subgid fichiers comme indiqué ci-dessous.

    • créer un utilisateur à l'aide de adduser commander
    sudo adduser dockremap
    • Configurer un sous-guide pour l'utilisateur  dockremap
    sudo sh -c 'echo dockremap:400000:65536 > /etc/subuid'
    • Ensuite, configurez le sous-gid pour l'utilisateur dockremap
    sudo sh -c 'echo dockremap:400000:65536 > /etc/subgid'
    • Ouvrez le daemon.json fichier et remplissez-le avec le contenu suivant pour associer le userns-remap attribut à l'utilisateur dockremap
    vi   /etc/docker/daemon.json
    { 
    
     "userns-remap": "dockremap"
    
    }
    • Presse :wq pour enregistrer et fermer daemon.json fichier et enfin redémarrez docker pour activer les espaces de noms sur un hôte docker
    sudo  /etc/init.d/docker  restart

    Sécurisation du démon Docker

    Il est également nécessaire de configurer le démon Docker pour assurer une communication sécurisée entre le client docker et le démon docker via TLS.

    Utilisez la commande suivante pour ouvrir daemon.json fichier et copiez et collez le contenu suivant (remplacez l'adresse IP par votre réelle) comme indiqué ci-dessous

    vi  daemon.json
    {
      "debug": false,
      "tls": true,
      "tlscert": "/var/docker/server.pem",
      "tlskey": "/var/docker/serverkey.pem",
      "hosts": ["tcp://192.168.16.5:2376"]
    }

    Sécurisation des composants Docker

    Voyons comment utiliser des outils tels que CodeNotaire et serveur notaire signer des images afin d'éviter la falsification d'images. De plus, il est également nécessaire de numériser des images juste pour être sûr que les images ne sont pas remplies de vulnérabilités

    Nous utiliserons le serveur notarié de Docker pour signer et vérifier les images et utiliser Moteur d'ancre pour analyser les images à la recherche de vulnérabilités.

    Vérifier les images avec Notary Server

    Avant de pouvoir utiliser le serveur Notary pour signer des images, nous devons télécharger et installer docker-compose. Nous utiliserons Docker Compose pour mettre en place un serveur de notaire.

    • Exécutez la commande ci-dessous pour télécharger la dernière version de Docker Compose
    sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    • Appliquer des autorisations exécutables au docker-compose comme indiqué ci-dessous
    sudo chmod 700  /usr/local/bin/docker-compose
    • Vous pouvez tester si vous avez installé avec succès docker-compose via la commande suivante
    docker-compose  --version
    • Maintenant, nous pouvons installer le serveur notaire via docker-compose
    git clone https://github.com/theupdateframework/notary.git
    • La commande ci-dessus clone ou copie le serveur du notaire à partir du référentiel notaire
    • Démarrez le serveur notaire et le signataire via les commandes ci-dessous:
    docker-compose build
    docker-compose up -d
    • Copiez ensuite les certificats de configuration et de test dans votre répertoire notaire local à l'aide de la commande ci-dessous
    mkdir -p ~/.notary && cp cmd/notary/config.json cmd/notary/root-ca.crt ~/.notary
    • Maintenant, exécutez la commande suivante pour connecter le serveur notaire au client docker
    export   DOCKER_CONTENT_TRUST=1
    export  DOCKER_CONTENT_TRUST_SERVER=https://notaryserver:4443
    • Générez une paire de clés de délégation via la commande ci-dessous
    docker trust key generate mike --dir ~./docker/trust          
    • Créons maintenant une nouvelle clé cible au cas où le référentiel n'existerait pas
    docker trust signer add --key ~/.docker/trust/mike.pub mike mikedem0/whalesay
    • Ensuite, vous pouvez signer votre image docker à l'aide de la commande docker trust sign. Vous devez extraire l'image du docker du hub de docker et ré-étiqueter à l'aide de la commande docker pull et docker tag respectivement.
    docker trust sign mikedem0/nginx:latest

    Vous pouvez également analyser les images du docker à la recherche de vulnérabilités et de défauts de configuration. Tu peux vérifier ici pour savoir comment utiliser Anchor Engine pour rechercher les vulnérabilités et Sécurité de Docker Bench pour vérifier les défauts de configuration.

    J'espère que ce qui précède vous donne une idée du Docker de sécurité pour l'environnement de production. Vous pouvez également consulter ce cours Udemy sur piratage et sécurisation des conteneurs Docker.