Comment configurer en toute sécurité le chantier naval 2.0.10 avec TLS sous CoreOS

introduction

Docker est une option répandue dans les logiciels de conteneurisation et CoreOS dans les environnements en cluster, ce qui en fait un partenaire idéal pour les applications conteneurisées. Garder tous vos conteneurs organisés peut toutefois s'avérer compliqué, notamment s'ils ne sont gérés que via l'interface de ligne de commande Docker ou si vous disposez de plusieurs instances de CoreOS.

Heureusement, il existe un outil de gestion Docker utile appeléShipyard. Il vous donne la possibilité de redémarrer, détruire et créer des conteneurs via une interface graphique utile. Il vous permet également de gérer l'allocation de ressources à des conteneurs spécifiques et de gérer des conteneurs sur plusieurs hôtes Docker. Cependant, il est important de vous assurer que votre serveur Docker et votre système Shipyard sont sécurisés, en particulier s’ils sont utilisés en production.

Dans ce guide, nous allons configurer Shipyard 2.0.10 sur un serveur CoreOS unique et sécuriser Docker avec un certificat TLS pour garantir que seuls les clients autorisés puissent s'y connecter. TLS signifieTransport Layer Security. Il est utilisé pour chiffrer les données lorsqu’elles sont transportées du client au serveur et inversement. Dans notre cas, nous l’utiliserons pour chiffrer notre connexion à l’hôte Docker et la connexion de Docker au chantier naval.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

  • Un CoreOS Droplet avec au moins 512 Mo de RAM, mais 1 Go ou plus est recommandé. Assurez-vous de choisir la dernière version stable de CoreOS et non une version alpha ou bêta.

    Tous les serveurs CoreOS nécessitent une clé SSH, donc si vous n'en avez pas déjà une, vous pouvez en ajouter une en suivant les étapes 1 à 3 deHow To Use SSH Keys with DigitalOcean Droplets.

  • Un nom de domaine complet (FQDN) ou un sous-domaine pour votre hôte Docker.

    Si vous ne possédez pas déjà un domaine, vous pouvez en acheter un auprès de l'un des différents registraires de domaine. Une fois que vous avez un domaine à utiliser,How to Point to DigitalOcean Nameservers From Common Domain Registrars a des instructions sur la façon de le configurer sous le DNS DigitalOcean.

    Vous pouvez diriger votre domaine vers votre Droplet en ajoutant un enregistrement A comme décrit dansHow To Set Up a Host Name with DigitalOcean.

  • Configurer Docker pour utiliser des certificats pour l'authentification est un sujet assez avancé, alors lisezthis OpenSSL tutorial pour une explication du fonctionnement des certificats SSL.

[[step-one -—- creation-the-server-certificate]] == Étape 1 - Création du certificat de serveur

La première chose à faire est de créer une autorité de certification que nous pourrons utiliser pour signer les certificats de serveur et de client. CoreOS est fourni avec OpenSSL, un utilitaire pouvant être utilisé pour générer et signer des certificats.

Pour commencer, nous allons créer une clé privée RSA. Tout d’abord, créez et déplacez-vous vers un répertoire appelédockertls, afin que vous puissiez facilement vous rappeler où se trouvent les fichiers.

mkdir ~/dockertls && cd ~/dockertls

Ensuite, créez une clé privée RSA. Cette commande vous invitera à créer une phrase secrète pour votre clé.

openssl genrsa -aes256 -out private-key.pem 4096

Décomposons la commande ci-dessus. genrsa signifie que la commande générera une clé privée RSA privée. -out private-key.pem spécifie le nom du fichier que nous voulons générer, qui estprivate-key.pem. Le dernier bit,4096, est la longueur de la clé en bits. Il est recommandé de garder ce nombre élevé, comme 4096.

Générez ensuite un nouveau certificat et signez-le avec la clé privée que nous venons de créer. Vous devrez entrer la phrase secrète choisie lors de la création de la clé.

openssl req -new -x509 -sha512 -days 365 -key private-key.pem -out myca.pem

OpenSSL vous demandera également certaines informations requises, telles que le nom de domaine complet de votre serveur et le comté sur lequel votre organisation est basée. Essayez de répondre à ces questions le plus précisément possible. C’est la dernière étape de la création de notre autorité de certification auto-signée, ou CA.

Maintenant que nous avons l'autorité de certification, nous pouvons créer des certificats de serveur à utiliser avec le démon Docker. Les deux commandes suivantes génèrent une demande de signature. Assurez-vous de remplacerexample.com par le domaine ou sous-domaine que vous utilisez pour Docker.

openssl genrsa -out docker-1-key.pem 4096
openssl req -subj "/CN=example.com" -sha512 -new -key docker-1-key.pem -out docker.csr

Enfin, signez avec la clé privée de l’AC. Vous devrez entrer à nouveau la phrase secrète de la clé.

openssl x509 -req -days 365 -sha256 -in docker.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out final-server-cert.pem

Cela créera un fichier dans le répertoire actuel appeléfinal-server-cert.pem, qui est le certificat de serveur qui sera utilisé sur l'hôte Docker.

[[step-two -—- creating-the-client-certificate]] == Étape deux - Création du certificat client

Maintenant que nous avons un certificat de serveur, nous devons créer un certificat client. Ceci sera utilisé chaque fois que nous essayons de nous connecter à l'hôte Docker. Il vérifiera que la connexion du client a bien été vérifiée et signée par notre autorité de certification personnelle. Par conséquent, seuls les clients autorisés seront autorisés à se connecter et à envoyer des commandes à Docker.

Commencez par créer une autre demande de signature pour le client.

openssl genrsa -out client-key.pem 4096
openssl req -subj '/CN=client' -new -key client-key.pem -out docker-client.csr

Il y a un petit pas supplémentaire à faire à la demande de ce client. Nous devons créer un fichier de configuration qui spécifie que le certificat résultant peut réellement être utilisé pour l'authentification du client.

echo extendedKeyUsage = clientAuth > client.cnf

La commande ci-dessus crée un fichier appeléclient.cnf avec le contenuextendedKeyUsage = clientAuth sans avoir besoin d'utiliser un éditeur de texte.

Ensuite, signez le client avec la clé de l'autorité de certification.

openssl x509 -req -days 365 -sha512 -in docker-client.csr -CA myca.pem -CAkey private-key.pem -CAcreateserial -out client.pem -extfile client.cnf

Nous avons maintenant une autorité de certification, un certificat de serveur et un certificat client.

[[step-three -—- configuring-docker-and-coreos]] == Étape trois - Configuration de Docker et CoreOS

Dans cette étape, nous allons configurer le démon Docker pour qu’il utilise nos certificats.

Nous devons modifier les options de démarrage pour Docker. CoreOS utilisesystemd pour gérer les services. Si vous souhaitez lire sursystemd et en savoir plus à ce sujet, vous pouvez lireHow To Use Systemctl to Manage Systemd Services and Units.

Commençons par éditer le fichier de l’unité Docker. Il existe une option pour la commandesystemctl qui nous aidera en dupliquant le fichier unité réel au lieu de modifier l'original directement. Vous pouvez le considérer comme un remplacement pour la configuration de Docker.

Ouvrez le fichier de l'unité Docker pour le modifier à l'aide desystemctl.

sudo systemctl edit --full docker

Cela ouvrira le fichier pour l'édition en utilisantvim, que vous pouvez apprendre à utiliser en lisant nosvim tutorial.

Trouvez la ligne commençant parExecStart=/usr/lib/coreos/dockerd. Ajoutez les options en surbrillance ci-dessous après--host=fd:// sur cette ligne, de sorte que le fichier ressemble à ceci:

EnvironmentFile=-/run/flannel_docker_opts.env
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
ExecStart=/usr/lib/coreos/dockerd --daemon --host=fd:// --tlsverify --tlscacert=/home/core/dockertls/myca.pem --tlscert=/home/core/dockertls/final-server-cert.pem --tlskey=/home/core/dockertls/docker-1-key.pem -H=0.0.0.0:2376 $DOCKER_OPTS $DOCKER_OPT_BIP $DOCKER_OPT_MTU $DOCKER_OPT_IPMASQ

Jetons un coup d’œil aux options que nous venons d’ajouter:

  • --tlsverify active simplement la vérification TLS afin que seuls les clients autorisés puissent se connecter.

  • --tlscacert spécifie l'emplacement du certificat de notre autorité de certification.

  • --tlscert spécifie l'emplacement du certificat du serveur.

  • --tlskey spécifie l'emplacement de la clé du serveur.

  • -H=0.0.0.0:2376 signifie que Docker écoutera les connexions de n’importe où, mais il n’autorisera toujours pas les connexions sans clé client ou certificat autorisé.

Enregistrez et fermez le fichier, puis rechargez le démon Docker pour qu'il utilise notre nouvelle configuration.

sudo systemctl restart docker

Vous pouvez vous assurer que tout fonctionne correctement en vérifiant le statut de Docker.

systemctl status docker

Recherchez la ligne commençant parActive:. S'il indique autre chose queactive (running), vérifiez les modifications apportées au fichier d'unité et assurez-vous que toutes les clés et tous les certificats requis ont été générés.

Enfin, nous pouvons tester notre vérification TLS.

docker --tlsverify --tlscacert=myca.pem --tlscert=client.pem --tlskey=client-key.pem -H=example.com:2376 info

Si tout va bien, vous devriez recevoir des informations système de base sur votre hôte Docker; cela signifie que vous venez de sécuriser votre hôte Docker avec TLS. Si vous obtenez une erreur, vérifiez les journaux à l'aide desystemctl status docker.

Vous pouvez maintenant accéder à votre hôte Docker depuis n'importe où, à condition de vous connecter à l'aide d'un certificat et d'une clé client valides. Vous pouvez générer et signer autant de certificats clients que vous le souhaitez pour une utilisation dans un cluster.

[[step-four -—- Installing-Shipyard]] == Étape 4 - Installation du chantier naval

La mise en place du chantier naval est un processus assez facile. Toutes les pièces sont contenues dans leurs propres conteneurs Docker. Par conséquent, Docker extraira automatiquement les images requises.

Premièrement, nous devons définir un volume de données dans lequel la base de données de Shipyard sera stockée.

docker create --name shipyard-rethinkdb-data shipyard/rethinkdb

Maintenant, nous pouvons réellement tirer vers le bas et créer un nouveau conteneur pourRethinkDB. Il s'agit du moteur de base de données que Shipyard utilise pour suivre les données en temps réel de Docker.

docker run -it -d --name shipyard-rethinkdb --restart=always --volumes-from shipyard-rethinkdb-data -p 127.0.0.1:49153:8080 -p 127.0.0.1:49154:28015 -p 127.0.0.1:29015:29015 shipyard/rethinkdb

Cette commande garantit également que RethinkDB n'écoutera que surlocalhost. C'est un bon moyen de sécuriser cette base de données car cela signifie que personne ne pourra y accéder de l'extérieur du serveur.

Nous utiliserons la version 2.0.10 de Shipyard car c’est le plus facile à configurer avec Docker TLS. La commande suivante va démarrer un nouveau conteneur qui exécute Shipyard et le lie au conteneur RethinkDB, leur permettant de communiquer.

docker run -it -p 8080:8080 -d --restart=always --name shipyard --link shipyard-rethinkdb:rethinkdb shipyard/shipyard:2.0.10

Une fois que vous avez terminé la configuration de votre chantier naval, visitezhttp://example.com:8080 ouhttp://your_server_ip:8080 pour accéder au panneau de configuration du chantier naval. Vous pouvez vous connecter avec le nom d'utilisateur par défautadmin et le mot de passeshipyard.

Le chantier naval vous invitera à ajouter un nouveau moteur au cluster. Cliquez sur le bouton vert+ ADD et un formulaire comme celui-ci vous sera présenté:

Shipyard Add

Remplissez les informations comme suit:

  • Name peut être ce que vous voulez. Ce sera le nom du moteur.

  • Labels peut également être ce que vous voulez. Bref, pour que vos conteneurs restent bien organisés.

  • CPUs est le nombre de processeurs dont dispose votre serveur.

  • Memory est la quantité de RAM dont dispose votre serveur.

  • Address doit êtrehttps://your_server_ip:2376 pour utiliser TLS.

Il y a trois grandes zones de texte sous les options de base. C'est là que vous allez coller les certificats et les clés pour que Shipyard puisse se connecter en toute sécurité à votre hôte Docker.

Le premier champ,SSL Certificate, nécessite le certificat client. Imprimez le contenu du certificat.

cat ~/dockertls/client.pem

Copiez ensuite la sortie et collez-la dans la zoneSSL Certificate.

Ensuite, imprimez le contenu de la clé client.

cat ~/dockertls/client-key.pem

Collez la sortie dans la zone de texteSSL Key.

Enfin, imprimez le contenu du certificat de l'autorité de certification.

cat ~/dockertls/myca.pem

Collez ce contenu dans la zoneCA Certificate.

Cliquez sur le bouton bleu pâleADD en bas de la page. Si tout est configuré correctement, Shipyard devrait vous présenter cet écran:

Shipyard Engine List

Conclusion

Vous avez maintenant un hôte Docker sécurisé s'exécutant sur votre serveur CoreOS!

Shipyard peut vous aider à gérer vos conteneurs et votre groupe d'hôtes en toute sécurité. Vous pouvez également ajouter une clé client et un certificat à votre ordinateur local pour pouvoir gérer votre cluster Docker à distance, où que vous soyez.

Pour des étapes de sécurité supplémentaires, vous pouvez utiliser Nginx pour inverser le proxy de votre serveur Shipyard. Cela vous permet d'utiliser HTTPS pour une connexion encore plus sécurisée au chantier naval à partir de votre machine locale. Vous pouvez en savoir plus à ce sujet dans l'articleDocker Explained: How To Containerize and Use Nginx as a Proxy. Vous pouvez égalementspin up more CoreOS servers et essayer un cluster Docker. Vous pouvez gérer des centaines de moteurs à l'aide du chantier naval.