So sichern Sie Concourse CI mit SSL mit Nginx unter Ubuntu 16.04

Einführung

Concourse CI ist ein modernes und skalierbares kontinuierliches Integrationssystem, mit dem das Testen von Pipelines mit einer zusammensetzbaren deklarativen Syntax automatisiert werden kann. Concourse baut auf dem Erfolg früherer CI-Systeme auf und zielt darauf ab, das Pipeline-Management zu vereinfachen und "Schneeflockenserver" zu eliminieren, sodass der Testserver ebenso reguliert ist wie der von ihm verarbeitete Code.

In einem vorheriges Tutorial haben wir gezeigt, wie eine Concourse CI-Instanz installiert und konfiguriert wird ein Ubuntu 16.04 Server. Am Ende stand uns ein Continuous Integration Server zur Verfügung, der sowohl über die Befehlszeile als auch über ein Webinterface verwaltet und überwacht werden konnte.

In diesem Handbuch werden wir die Concourse-CI-Schnittstellen sichern, indem wir einen TLS / SSL-Reverse-Proxy mit Nginx einrichten. Während Concourse für die native Verwendung von SSL konfiguriert werden kann, bietet ein Reverse-Proxy mehr Flexibilität für die zukünftige Skalierung und den Zugriff auf ein robusteres Feature-Set.

Voraussetzungen

Bevor Sie beginnen, benötigen Sie einen Ubuntu 16.04-Server * mit mindestens 1 GB RAM *. Befolgen Sie die folgenden Anleitungen, um einen Benutzer ohne Rootberechtigung einzurichten, Concourse zu installieren und zu konfigurieren, Nginx zu installieren und TLS / SSL-Verbindungen auf dem Server zu konfigurieren. Sie benötigen außerdem einen * Domainnamen *, der auf Ihren Concourse-Server verweist, um ihn ordnungsgemäß zu sichern:

Nachdem Sie diese Voraussetzungen erfüllt haben, wird auf Port 8080 ein Concourse-Server ausgeführt. Darüber hinaus wird Nginx auf den Ports 80 und 443 ausgeführt. Der Datenverkehr zu Port 80 wird zu Port 443 umgeleitet, der den Datenverkehr für Anforderungen an den Domänennamen Ihres Servers verschlüsselt.

Wenn Sie bereit sind, fahren Sie unten fort.

Konfigurieren von Nginx als Reverse Proxy für Concourse

Als erstes müssen wir die SSL-Server-Blockdatei ändern, um den Datenverkehr an den Concourse CI-Server weiterzuleiten.

Suchen Sie die richtige zu bearbeitende Datei

Da unser SSL-gesicherter Domainname für die Concourse-Schnittstelle verwendet werden soll, müssen wir ermitteln, welche Serverblockdatei derzeit unseren Domainnamen verarbeitet. Da wir nur an den aktiven Serverblöcken interessiert sind, können wir mit + grep + im Verzeichnis + / etc / nginx / sites-enabled + suchen:

grep -R server_name /etc/nginx/sites-enabled

Sie werden wahrscheinlich so etwas sehen:

Output/etc/nginx/sites-enabled/default:   server_name ;
/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default:   server_name ;
/etc/nginx/sites-enabled/default:#  server_name example.com;

In der obigen Ausgabe wird der Domänenname (in diesem Fall "+ example.com ") in der Datei " / etc / nginx / sites-enabled / default +" definiert. Sie möchten die Datei (die erste Spalte) bearbeiten, die Ihrem Domain-Namen zugeordnet ist.

Möglicherweise sehen Sie auch Folgendes:

Output/etc/nginx/sites-enabled/default:   server_name _;
/etc/nginx/sites-enabled/default:   return 301 https://$server_name$request_uri;
/etc/nginx/sites-enabled/default:   server_name _;
/etc/nginx/sites-enabled/default:#  server_name example.com;

Das "+ Servername _; " in der obigen Ausgabe ist normalerweise eine Serverblockdefinition, die allen nicht übereinstimmenden Anforderungen entspricht. Wenn Sie keine " Servername +" - Definition finden, die Ihrem Domainnamen entspricht, sollten Sie stattdessen die Datei verwenden, die so aussieht.

Definieren Sie den Concourse Server Block

Öffnen Sie die Datei, die Ihre Domain definiert, in Ihrem Texteditor, um zu beginnen:

sudo nano /etc/nginx/sites-enabled/

Wenn die Kommentare der Kürze halber entfernt wurden, sieht Ihre Datei wahrscheinlich so aus, wenn Sie die Anleitungen im Abschnitt zu den Voraussetzungen korrekt befolgt haben:

/ etc / nginx / sites-enabled / default

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name ;
   return 301 https://$server_name$request_uri;
}

server {
   listen 443 ssl http2 default_server;
   listen [::]:443 ssl http2 default_server;
   include snippets/ssl-.conf;
   include snippets/ssl-params.conf;

   root /var/www/html;
   index index.html index.htm index.nginx-debian.html;

   server_name ;

   location / {
       try_files $uri $uri/ =404;
   }

   location ~ /.well-known {
       allow all;
   }
}

Es kann geringfügige Abweichungen geben, dies sollte jedoch die allgemeine Struktur der Datei sein. Wir können dies an den Proxy unseres Concourse-Servers anpassen, indem wir zwei wichtige Änderungen vornehmen.

Zuerst erstellen wir ganz am Anfang der Datei, bevor der "+ Server" blockiert wird, einen "+ Upstream" -Block mit dem Namen * concourse *, der definiert, wie unser Concourse-Webprozess Verbindungen akzeptiert. Der Continuous Integration Server akzeptiert Verbindungen auf Port 8080.

Suchen Sie als Nächstes den Serverblock, der für die Bereitstellung von SSL-Inhalten verantwortlich ist, indem Sie den Block mit der Zeichenfolge "+ listen 443 " suchen. Überprüfen Sie erneut, ob der in diesem Block definierte " Servername " mit Ihrem Domain-Namen übereinstimmt (oder auf " Servername _; " gesetzt ist, wenn Sie bei der Suche mit " find +" keine mit Ihrem Domain-Namen übereinstimmenden Ergebnisse gefunden haben).

Innerhalb dieses Serverblocks müssen wir den Block "+ location / +" so anpassen, dass Nginx alle Anforderungen (die nicht explizit an anderer Stelle definiert sind) an den Concourse-Server weiterleitet. Dazu fügen wir Parameter aus einer externen Datei ein, legen einige zusätzliche Parameter fest und definieren die erforderlichen Proxy-Header, bevor wir die Anforderung an den zuvor definierten Upstream übergeben.

Ersetzen Sie die Direktive "+ try_files ", die im Block " location / +" definiert ist, durch die Zeilen im folgenden Beispiel. Wenn Sie fertig sind, sollte die fertige Datei ungefähr so ​​aussehen:

/ etc / nginx / sites-enabled / default

server {
   listen 80 default_server;
   listen [::]:80 default_server;
   server_name ;
   return 301 https://$server_name$request_uri;
}

server {
   listen 443 ssl http2 default_server;
   listen [::]:443 ssl http2 default_server;
   include snippets/ssl-.conf;
   include snippets/ssl-params.conf;

   root /var/www/html;
   index index.html index.htm index.nginx-debian.html;

   server_name ;

   location / {








   }

   location ~ /.well-known {
       allow all;
   }
}

Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind.

Testen und aktivieren Sie die neue Konfiguration

Lassen Sie Nginx vor der Verwendung der neuen Konfiguration Folgendes eingeben, um festzustellen, ob Syntaxfehler vorliegen:

sudo nginx -t
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Wenn anstelle der obigen Erfolgsmeldung Fehlermeldungen angezeigt werden, überprüfen Sie die bearbeitete Datei erneut auf Fehler, bevor Sie fortfahren.

Starten Sie Nginx neu, um die neue Konfiguration zu implementieren:

sudo systemctl restart nginx

Nginx ist jetzt so konfiguriert, dass Anforderungen für Ihren Domain-Namen an den Concourse-Server weitergeleitet werden.

Concourse für die Bindung an die lokale Loopback-Schnittstelle konfigurieren

Jetzt, da Nginx so eingerichtet ist, dass der Datenverkehr an den Concourse-Server weitergeleitet wird, sollten wir einschränken, von wo Concourse Verbindungen akzeptiert. Derzeit akzeptiert Concourse auf allen Schnittstellen Verbindungen zu Port 8080, sodass Benutzer die SSL-Verschlüsselung umgehen können, indem sie sich direkt mit dem Integrationsserver verbinden.

Wir können dieses Verhalten ändern, indem wir die Concourse-Webkonfiguration ändern. Öffnen Sie die Konfigurationsdatei des "+ web " - Prozesses, die wir unter " / etc / concourse / web_environment +" erstellt haben, in Ihrem Texteditor:

sudo nano /etc/concourse/web_environment

Suchen Sie den Parameter "+ CONCOURSE_EXTERNAL_URL " und ändern Sie ihn entsprechend der URL, die Benutzer für den Zugriff auf die Concourse-Weboberfläche verwenden sollten. Dies schließt das Protokoll ein, das durch " https: // +" angegeben wird, gefolgt von unserem Domainnamen.

Setzen Sie anschließend eine neue Umgebungsvariable mit dem Namen "+ CONCOURSE_BIND_IP " auf " 127.0.0.1 +". Standardmäßig hört Concourse alle Schnittstellen ab, aber diese Einstellung weist Concourse an, nur an die lokale Schnittstelle zu binden. Remoteverbindungen müssen über Nginx weitergeleitet werden, wodurch SSL erzwungen werden kann:

/ etc / concourse / web_environment

. . .
CONCOURSE_EXTERNAL_URL=://

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Starten Sie den Concourse-Prozess + web + neu, um die neuen Einstellungen zu verwenden:

sudo systemctl restart concourse-web

Überprüfen Sie, ob die Concourse-Schnittstelle "+ web +" nur die lokale Loopback-Schnittstelle überwacht, indem Sie Folgendes eingeben:

sudo netstat -plunt | grep 8080
Outputtcp        0      0           0.0.0.0:*               LISTEN      20932/concourse

Die obige Ausgabe zeigt an, dass der Concourse-Prozess "+ web +" nur die lokale Schnittstelle überwacht.

Wir können jetzt unsere Firewall-Einstellungen ändern, um unsere Ausnahme für Port 8080 zu entfernen, da alle externen Anforderungen über Nginx weitergeleitet werden:

sudo ufw delete allow 8080
secondary_label Output]
Rule deleted
Rule deleted (v6)

Jetzt können wir uns sicher in das Webinterface einloggen.

Testen des Webinterfaces

Besuchen Sie im Webbrowser Ihrer Wahl den Domain-Namen Ihres Servers:

https://

Sie sollten in der Lage sein, auf die erste Concourse CI-Seite zuzugreifen:

Wenn Sie in die Adressleiste Ihres Browsers schauen, erscheint ein Hinweis darauf, dass Sie sich über eine sichere Verbindung mit dem Integrationsserver verbinden:

Nginx sichert die Verbindung mit Ihrem Browser und leitet die Anfrage an Concourse weiter. Nachdem wir eine sichere Verbindung hergestellt haben, ist es sicher, sich bei der Weboberfläche anzumelden.

Wenn Sie auf den * Login * -Link in der oberen rechten Ecke klicken, können Sie sich bei der Weboberfläche anmelden. Zunächst werden Sie aufgefordert, Ihr Team auszuwählen. Das * main * -Team, bei dem es sich um die administrative Gruppe handelt, ist standardmäßig die einzige verfügbare Auswahl:

Auf der nächsten Seite werden Sie aufgefordert, Ihre Anmeldeinformationen einzugeben.

Nachdem Sie die Anmeldeinformationen eingegeben haben, die Sie in der Datei "+ web_environment +" konfiguriert haben, werden Sie angemeldet und zur Standard-Platzhalter-Oberfläche zurückgeführt:

Sobald Sie Ihre Pipeline-Konfiguration mit "+ fly +" an den Server übergeben, wird dieser Bildschirm durch eine Schnittstelle ersetzt, über die Sie Ihre Pipeline-Aktivität überwachen können.

Fazit

In diesem Handbuch haben wir Nginx als sicheren Reverse-Proxy für einen Concourse-CI-Server konfiguriert. Nginx akzeptiert sichere Verbindungen von Clients und leitet Anforderungen an den Concourse-Server weiter. Concourse wird an die lokale Loopback-Schnittstelle gebunden, sodass Remoteclients keine direkte Verbindung herstellen können.

Jetzt, da Sie eine sichere Verbindung zum Concourse-Server herstellen können, können Sie mit dem Tool "+ fly +" und der Webschnittstelle mit dem Erstellen und Verwalten von Pipelines beginnen. Sie können unserem nächsten Leitfaden folgen, um https://www.digitalocean.com/community/tutorials/how-to-set-up-continuous-integration-pipelines-with-concourse-ci-on-ubuntu-16-04 [zu erfahren. Entwicklung und Implementierung von Continuous Integration Pipelines], um automatische Testprozesse für Ihr Projekt einzurichten. Sie können auch das Beispiel https://concoursetutorial.com/basics/task-hello-world/["hello world ”in der Concourse-Dokumentation lesen.