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 leuserns-remap
attribut à l'utilisateurdockremap
vi /etc/docker/daemon.json
{
"userns-remap": "dockremap"
}
- Presse
:wq
pour enregistrer et fermerdaemon.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 commandedocker pull
etdocker 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.