Geekflare est soutenu par notre public. Nous pouvons gagner des commissions d'affiliation en achetant des liens sur ce site.
Partager sur:

Comment sécuriser Docker pour l'environnement de production?

sécurité docker
Scanner de sécurité des applications Web Invicti – la seule solution qui offre une vérification automatique des vulnérabilités avec Proof-Based Scanning™.

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 Mésos, lxc et 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.

Savoir-faire

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.

Scanning Linux kernel

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

Harden Linux kernel

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.

Install Docker in a 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.

Protecting Root Privileges

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

Docker User

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

Managing Container with Cgroups

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.

Managing Containers with Namespaces

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

Securing the Docker Daemon

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.

Verify Images with 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.

Merci à nos commanditaires
Plus de bonnes lectures sur DevOps
Alimentez votre entreprise
Certains des outils et services pour aider votre entreprise à se développer.
  • Invicti utilise Proof-Based Scanning™ pour vérifier automatiquement les vulnérabilités identifiées et générer des résultats exploitables en quelques heures seulement.
    Essayez Invicti
  • Web scraping, proxy résidentiel, proxy manager, web unlocker, moteur de recherche et tout ce dont vous avez besoin pour collecter des données Web.
    Essayez Brightdata
  • Semrush est une solution de marketing numérique tout-en-un avec plus de 50 outils de référencement, de médias sociaux et de marketing de contenu.
    Essayez Semrush
  • Intruder est un scanner de vulnérabilités en ligne qui détecte les failles de cybersécurité de votre infrastructure, afin d'éviter des violations de données coûteuses.
    Essayez Intruder