So richten Sie Shipyard 2.0.10 mit TLS unter CoreOS sicher ein

Einführung

Docker ist eine beliebte Option für Containerisierungssoftware, und CoreOS ist auf Clusterumgebungen spezialisiert, sodass sich die beiden Anwendungen hervorragend für Containeranwendungen eignen. Das Organisieren aller Container kann jedoch kompliziert sein, insbesondere wenn sie nur über die Docker-Befehlszeilenschnittstelle verwaltet werden oder wenn Sie über mehrere Instanzen von CoreOS verfügen.

Glücklicherweise gibt es ein nützliches Docker-Verwaltungstool namensShipyard. Es gibt Ihnen die Möglichkeit, Container über eine nützliche GUI neu zu starten, zu zerstören und zu erstellen. Außerdem können Sie die Ressourcenzuweisung für bestimmte Container und die Verwaltung von Containern für mehrere Docker-Hosts verwalten. Es ist jedoch wichtig sicherzustellen, dass Ihr Docker-Server und Ihr Werftsystem sicher sind, insbesondere wenn sie in der Produktion verwendet werden.

In diesem Handbuch richten wir Shipyard 2.0.10 auf einem einzelnen CoreOS-Server ein und sichern Docker mit einem TLS-Zertifikat, um sicherzustellen, dass nur autorisierte Clients eine Verbindung dazu herstellen können. TLS steht fürTransport Layer Security. Es wird zum Verschlüsseln von Daten verwendet, die vom Client zum Server und wieder zurück transportiert werden. In unserem Fall werden wir es verwenden, um unsere Verbindung zum Docker-Host und die Docker-Verbindung zur Werft zu verschlüsseln.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

  • Ein CoreOS-Droplet mit mindestens 512 MB RAM, aber mindestens 1 GB wird empfohlen. Stellen Sie sicher, dass Sie die neueste stabile Version von CoreOS wählen, keine Alpha- oder Betaversion.

    Alle CoreOS-Server benötigen einen SSH-Schlüssel. Wenn Sie noch keinen haben, können Sie einen hinzufügen, indem Sie die Schritte 1 bis 3 vonHow To Use SSH Keys with DigitalOcean Droplets ausführen.

  • Ein vollständig qualifizierter Domänenname (FQDN) oder eine Unterdomäne für Ihren Docker-Host.

    Wenn Sie noch keine Domain besitzen, können Sie eine Domain bei einem der verschiedenen Domain-Registrare erwerben. Sobald Sie eine Domain verwenden müssen, enthältHow to Point to DigitalOcean Nameservers From Common Domain Registrars Anweisungen zum Einrichten unter dem DigitalOcean-DNS.

    Sie können Ihre Domain auf Ihr Droplet verweisen, indem Sie einen A-Datensatz hinzufügen, wie inHow To Set Up a Host Name with DigitalOcean beschrieben.

  • Das Einrichten von Docker für die Verwendung von Zertifikaten zur Authentifizierung ist ein ziemlich fortgeschrittenes Thema. Lesen Sie daherthis OpenSSL tutorial durch, um zu erklären, wie SSL-Zertifikate funktionieren.

[[Schritt eins - Erstellen des Serverzertifikats]] == Schritt 1 - Erstellen des Serverzertifikats

Als Erstes müssen wir eine Zertifizierungsstelle erstellen, mit der wir Server- und Client-Zertifikate signieren können. CoreOS wird mit OpenSSL geliefert, einem Dienstprogramm, mit dem Zertifikate generiert und signiert werden können.

Zunächst erstellen wir einen privaten RSA-Schlüssel. Erstellen Sie zunächst ein Verzeichnis mit dem Namendockertls und verschieben Sie es in ein Verzeichnis, damit Sie sich leicht merken können, wo sich die Dateien befinden.

mkdir ~/dockertls && cd ~/dockertls

Erstellen Sie als Nächstes einen privaten RSA-Schlüssel. Dieser Befehl fordert Sie auf, eine Passphrase für Ihren Schlüssel zu erstellen.

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

Lassen Sie uns den obigen Befehl aufschlüsseln. genrsa bedeutet, dass der Befehl einen privaten privaten RSA-Schlüssel generiert. -out private-key.pem gibt den Namen der zu generierenden Datei an, nämlichprivate-key.pem. Das letzte Bit,4096, ist die Länge des Schlüssels in Bits. Es wird empfohlen, diesen Wert auf einem hohen Wert wie 4096 zu halten.

Generieren Sie als Nächstes ein neues Zertifikat und signieren Sie es mit dem soeben erstellten privaten Schlüssel. Sie müssen die Passphrase eingeben, die Sie beim Erstellen des Schlüssels ausgewählt haben.

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

OpenSSL fragt auch nach einigen erforderlichen Informationen, wie dem FQDN Ihres Servers und dem Landkreis, aus dem Ihre Organisation stammt. Versuchen Sie, diese Fragen so genau wie möglich zu beantworten. Dies ist der letzte Schritt beim Erstellen unserer selbstsignierten Zertifizierungsstelle.

Jetzt, da wir die Zertifizierungsstelle haben, können wir tatsächlich einige Serverzertifikate zur Verwendung mit dem Docker-Daemon erstellen. Die folgenden beiden Befehle generieren eine Signaturanforderung. Stellen Sie sicher, dass Sieexample.com durch die Domain oder Subdomain ersetzen, die Sie für Docker verwenden.

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

Zum Schluss unterschreiben Sie mit dem privaten Schlüssel der Zertifizierungsstelle. Sie müssen die Passphrase erneut eingeben.

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

Dadurch wird eine Datei im aktuellen Verzeichnis mit dem Namenfinal-server-cert.pem erstellt. Hierbei handelt es sich um das Serverzertifikat, das auf dem Docker-Host verwendet wird.

[[Schritt zwei - Erstellen des Client-Zertifikats]] == Schritt 2 - Erstellen des Client-Zertifikats

Nachdem wir ein Serverzertifikat haben, müssen wir ein Clientzertifikat erstellen. Dies wird verwendet, wenn wir versuchen, eine Verbindung zum Docker-Host herzustellen. Es wird überprüft, ob die Clientverbindung tatsächlich von unserer persönlichen Zertifizierungsstelle überprüft und signiert wurde. Daher dürfen nur autorisierte Clients eine Verbindung herstellen und Befehle an Docker senden.

Erstellen Sie zunächst eine weitere Signaturanforderung für den Client.

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

Für diese Client-Anfrage ist ein kleiner zusätzlicher Schritt erforderlich. Wir müssen eine Konfigurationsdatei erstellen, die angibt, dass das resultierende Zertifikat tatsächlich für die Clientauthentifizierung verwendet werden kann.

echo extendedKeyUsage = clientAuth > client.cnf

Mit dem obigen Befehl wird eine Datei mit dem Namenclient.cnf mit dem InhaltextendedKeyUsage = clientAuth erstellt, ohne dass ein Texteditor verwendet werden muss.

Als nächstes signieren Sie den Client mit dem CA-Schlüssel.

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

Jetzt haben wir eine Zertifizierungsstelle, ein Serverzertifikat und ein Clientzertifikat.

[[Schritt drei - Konfigurieren von Docker und Coreos] == Schritt 3 - Konfigurieren von Docker und CoreOS

In diesem Schritt konfigurieren wir den Docker-Daemon für die Verwendung unserer Zertifikate.

Wir müssen die Startoptionen für Docker ändern. CoreOS verwendetsystemd, um Dienste zu verwalten. Wenn Siesystemd nachlesen und mehr darüber erfahren möchten, können SieHow To Use Systemctl to Manage Systemd Services and Units lesen.

Beginnen wir zunächst mit der Bearbeitung der Docker-Gerätedatei. Es gibt eine Option für den Befehlsystemctl, die uns hilft, indem wir die eigentliche Einheitendatei duplizieren, anstatt das Original direkt zu ändern. Sie können es sich wie eine Außerkraftsetzung für die Docker-Konfiguration vorstellen.

Öffnen Sie die Docker-Einheitendatei zur Bearbeitung mitsystemctl.

sudo systemctl edit --full docker

Dadurch wird die Datei zum Bearbeiten mitvim geöffnet. Sie können lernen, wie Sie sie verwenden, indem Sie unserevim tutorial lesen.

Suchen Sie die Zeile, die mitExecStart=/usr/lib/coreos/dockerd beginnt. Fügen Sie die hervorgehobenen Optionen unten nach--host=fd:// in diese Zeile ein, damit die Datei folgendermaßen aussieht:

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

Werfen wir einen Blick auf die Optionen, die wir gerade hinzugefügt haben:

  • --tlsverify aktiviert einfach die TLS-Überprüfung, sodass nur autorisierte Clients eine Verbindung herstellen können.

  • --tlscacert gibt den Speicherort des Zertifikats unserer Zertifizierungsstelle an.

  • --tlscert gibt den Speicherort des Serverzertifikats an.

  • --tlskey gibt den Speicherort des Serverschlüssels an.

  • -H=0.0.0.0:2376 bedeutet, dass Docker von überall auf Verbindungen wartet, jedoch keine Verbindungen zulässt, die keinen autorisierten Clientschlüssel oder kein autorisiertes Zertifikat haben.

Speichern und schließen Sie die Datei und laden Sie den Docker-Daemon erneut, damit er unsere neue Konfiguration verwendet.

sudo systemctl restart docker

Sie können sicherstellen, dass alles funktioniert, indem Sie den Docker-Status überprüfen.

systemctl status docker

Suchen Sie nach der Zeile, die mitActive: beginnt. Wenn etwas anderes alsactive (running) angezeigt wird, überprüfen Sie die Änderungen an der Gerätedatei und stellen Sie sicher, dass alle erforderlichen Schlüssel und Zertifikate generiert wurden.

Schließlich können wir unsere TLS-Überprüfung testen.

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

Wenn alles in Ordnung ist, sollten Sie einige grundlegende Systeminformationen über Ihren Docker-Host erhalten. Das heißt, Sie haben gerade Ihren Docker-Host mit TLS gesichert. Wenn Sie eine Fehlermeldung erhalten, überprüfen Sie die Protokolle mitsystemctl status docker.

Sie können jetzt von überall auf Ihren Docker-Host zugreifen, solange Sie eine Verbindung mit einem gültigen Zertifikat und Client-Schlüssel herstellen. Sie können so viele Client-Zertifikate generieren und signieren, wie Sie in einem Cluster verwenden möchten.

[[Schritt vier - Installation der Werft]] == Schritt vier - Installation der Werft

Das Einrichten der Werft ist relativ einfach. Alle Teile sind in ihren eigenen Docker-Containern enthalten, sodass Docker die erforderlichen Bilder automatisch abruft.

Zunächst müssen wir ein Datenvolumen einrichten, in dem die Datenbank der Werft gespeichert wird.

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

Jetzt können wir tatsächlich einen neuen Container fürRethinkDB herunterziehen und erzeugen. Dies ist die Datenbank-Engine, mit der Shipyard Echtzeitdaten von Docker verfolgt.

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

Dieser Befehl stellt auch sicher, dass RethinkDB nurlocalhost abhört. Dies ist ein guter Weg, um diese Datenbank zu sichern, da niemand von außerhalb des Servers darauf zugreifen kann.

Wir werden Shipyard Version 2.0.10 verwenden, da die Konfiguration mit Docker TLS am einfachsten ist. Der folgende Befehl startet einen neuen Container, der Shipyard ausführt, und verknüpft ihn mit dem RethinkDB-Container, damit diese kommunizieren können.

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

Wenn Sie die Einrichtung der Werft abgeschlossen haben, rufen Siehttp://example.com:8080 oderhttp://your_server_ip:8080 auf, um auf das Bedienfeld der Werft zuzugreifen. Sie können sich mit dem Standardbenutzernamenadmin und dem Standardkennwortshipyard anmelden.

Die Werft fordert Sie auf, dem Cluster einen neuen Motor hinzuzufügen. Klicken Sie auf die grüne Schaltfläche+ ADD. Daraufhin wird ein Formular wie das folgende angezeigt:

Shipyard Add

Füllen Sie die Informationen wie folgt aus:

  • Name kann sein, was immer Sie wollen. Dies ist der Name des Motors.

  • Labels kann auch beliebig sein. Machen Sie es einfach kurz, damit Sie Ihre Container organisiert halten können.

  • CPUs gibt an, wie viele CPUs Ihr Server hat.

  • Memory gibt an, wie viel RAM Ihr Server hat.

  • Address musshttps://your_server_ip:2376 sein, um TLS verwenden zu können.

Unter den Grundoptionen befinden sich drei große Textbereiche. Hier fügen Sie die Zertifikate und Schlüssel ein, damit Shipyard eine sichere Verbindung zu Ihrem Docker-Host herstellen kann.

Das erste FeldSSL Certificate erfordert das Client-Zertifikat. Drucken Sie den Inhalt des Zertifikats aus.

cat ~/dockertls/client.pem

Kopieren Sie dann die Ausgabe und fügen Sie sie in das FeldSSL Certificateein.

Als nächstes drucken Sie den Inhalt des Client-Schlüssels.

cat ~/dockertls/client-key.pem

Fügen Sie die Ausgabe in den Textbereich vonSSL Keyein.

Drucken Sie abschließend den Inhalt des CA-Zertifikats aus.

cat ~/dockertls/myca.pem

Fügen Sie diesen Inhalt in das FeldCA Certificateein.

Klicken Sie unten auf der Seite auf die hellblaue SchaltflächeADD. Wenn alles richtig konfiguriert ist, sollte die Werft Ihnen diesen Bildschirm anzeigen:

Shipyard Engine List

Fazit

Sie haben jetzt einen sicheren Docker-Host auf Ihrem CoreOS-Server!

Die Werft kann Sie bei der sicheren Verwaltung Ihrer Container und Hostcluster unterstützen. Sie können Ihrem lokalen Computer auch einen Client-Schlüssel und ein Zertifikat hinzufügen, damit Sie Ihren Docker-Cluster von überall aus remote verwalten können.

Für zusätzliche Sicherheitsschritte können Sie Nginx verwenden, um den Proxy Ihres Werftservers rückgängig zu machen. Auf diese Weise können Sie HTTPS verwenden, um von Ihrem lokalen Computer aus eine noch sicherere Verbindung zur Werft herzustellen. Mehr dazu erfahren Sie im ArtikelDocker Explained: How To Containerize and Use Nginx as a Proxy. Sie können auchspin up more CoreOS servers ausführen und einen Docker-Cluster ausprobieren. Mit Shipyard können Sie Hunderte von Motoren verwalten.