Comment sécuriser Docker pour l'environnement de production?
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 à levervieillir.
Nous verrons comment sécuriser un Docker sur un Linux platforme à partir de ce qui suit.
- Défauts de configuration
- Exécution de code à distance
- Buffer Les débordements
- Falsification d'images et ainsi de suite.
Nous utiliserons les outils suivants, tels que Serveur notaire de Docker signer des images et Docker bench sécurité 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 des conteneurs permet aux développeurs ou aux ingénieurs DevOps de packager une application afin qu'elle puisse s'exécuter avec des dépendances isolées.ated d'un autre processpar exemple.
Il existe un certain nombre de technologies de conteneurs sur le marché, telles que Apache Mésos, lxcet Docker. Bien qu'ils relèvent du cateEn raison 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éerate une application Web et déployez-la d'un environnement de test vers un environnement de production.
Docker Engine
Le Docker Engine est composé de trois composants.
- Un serveur : ce composant est un outil de longue durée process ou démon responsable de la gestion des images et des conteneurs.
- API REST : Cette interface permet au démon Docker et à l'outil client Docker de communiquerate.
- Outil client Docker : l'outil client Docker utilise le composant API REST pour informer le démon Docker de fonctionnerate une application conteneurisée.
Registre de confiance Docker
Docker Trusted Registry est une solution de stockage d'images de Docker pour les entreprisesrise platformer une 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 Entreprise Dockerrise édition.
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 isoléeatesa application conteneurisée ou process exécuté sur un hôte d'environnement virtuel provenant d'un autre processpar exemple.
Groupes de contrôle Linux (Cgroups)
Les groupes de contrôle Linux sont une fonctionnalité du noyau Linux qui vous permet d'attribuerate ressources telles que le temps CPU, le réseau bandwidth, la mémoire système, etc. processes sur un hôte.
Capacités
Sous Linux, il existe une fonctionnalité de sécurité dans le sous-système du noyau qui peut être définie ou appliquée pour limiter les privilèges. process tel process exécuté par un utilisateur avec l'UID 1. Bien que privilégié processSi les utilisateurs ou les utilisateurs peuvent contourner les autorisations discrétionnaires de contrôle d'accès, ils ne peuvent pas contourner les 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 Linux platformulaire, vous devez d'abord inspect le noyau. Il existe plusieurs outils open source tels que Lynis et le OuvrirVAS 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 naviguerate à la lynis
répertoire et auditez le système Linux.
cd lynis; ./lynis audit system
Renforcer le noyau Linux
Après avoir analysé le noyau Linux à la recherche de vulnérabilités basées sur le système, vous pouvez en ajouter un autre. extra couche de protection au noyau via grsécurité. Il fournit des fonctionnalités de sécurité telles que les suivantes.
- Buffer exploitation de débordement preventrée
- /tmp vulnérabilité de course preventrée
- /proc restrictions qui ne divulguent pas d'informations sur process propriétaires.
- Prevmention de l'arbitexécution de code rare dans le noyau et ainsi de suite.
Initierally, vous pouvez download patchs gratuitement depuis grsecurity et appliquez-le à votre noyau actuel. Mais il n'autorise plus les correctifs gratuits.
Installer Docker dans une machine virtuelle
Au lieu d'installer Docker directement sur un hôte Linux, vous pouvez ajouter un extra couche de protection en l'installant dans une machine virtuelle. Ce faisant, même s'il existe un problème de vulnérabilité avec le noyau hôte, cela n'affectera pas les conteneurs Docker.
Protection des privilèges racine
Par défaut, Docker nécessite les privilèges root pour créerate et gérer les conteneurs. Le script malveillant peut levervieillir cette surface d'attaque pour s'intensifierate à un superutilisateur sur un hôte Linux et un événementally accéder aux fichiers/dossiers sensibles, aux images, aux certificatsates, etc.
HautrevPour le saisir, nous pouvons utiliser la commande suivante. Nous pouvons décider d'abandonner des capacités telles que setgid
et le setuid
Hautrevent d'autres programmes ou processes de changer leur GID à 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 le setuid
capacités via --cap-drop
Hautrevempêche le conteneur Apache de changer son GID et son UID par un autre UID et GID.
GID et UID dans ce contexte font référence à group ID
et le user ID
respectivement.
docker run -d --cap-drop SETGID --cap-drop SETUID apache
Utilisateur Docker
En dehors de prevaccéder à d'autres programmes ou processes, vous pouvez aussi créerate un utilisateur pour gérer les opérations du docker telles que docker run
au lieu de le gérer via un superutilisateur.
Vous pouvez ajouter ou créerate un utilisateur de Docker via les éléments suivants :
sudo groupadd docker
La commande ci-dessus createun groupe appelé docker
Ensuite, créezate un utilisateur utilisant la commande ci-dessous :
sudo useradd mike
finally 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 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 allouerate les conteneurs à des ressources CPU limitées via le --cpu-shares
et le --cpuset-cpus
L'exemple de commande suivant montre prodnginx
récipient process est exécuté uniquement sur le premier noyau via --cpuset-cpus
et est allouéate 20 processeurs via --cpu-shares
tandis que le proxnginx
récipient process est exécuté sur les deux premiers cœurs de processeur et est également allouéated 20 processeurs.
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 le 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 prevLes conteneurs ent ne s'exécutent pas en tant qu'utilisateurs privilégiés, ce qui peut aider à éviter les attaques par élévation de privilèges.
Nous pouvons activer l'espace de noms dans le docker en utilisant /etc/subuid
et le /etc/subgid
fichiers comme indiqué ci-dessous.
- CREate un utilisateur utilisant le
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 associerate leuserns-remap
attribut à l'utilisateurdockremap
vi /etc/docker/daemon.json
{
"userns-remap": "dockremap"
}
- Press
:wq
pour enregistrer et fermerdaemon.json
fichier et finally redémarrez Docker pour activer les espaces de noms sur un hôte Docker
sudo /etc/init.d/docker restart
Sécuriser le 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 le 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 le lateè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 le certificat de configuration et de testsates à votre répertoire de notaire local en utilisant 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érerate une paire de clés de délégation via la commande ci-dessous
docker trust key generate mike --dir ~./docker/trust
- Maintenant, créonsate une cible de nouvelles clés au cas où le référentiel n'existe 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
et ledocker 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 Docker Bench Sécurité 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.