So konfigurieren Sie Jenkins mit SSL mithilfe eines Nginx-Reverse-Proxy

Einführung

Standardmäßig wird Jenkins mit einem integrierten Winstone-Webserver geliefert, der Port 8080 überwacht. Sobald Sie Jenkins jedoch ernsthaft einsetzen, sollten Sie es mit SSL sichern, um Kennwörter und andere vertrauliche Daten zu schützen, die über die Weboberfläche übertragen werden.

In diesem Lernprogramm wird gezeigt, wie Sie Nginx als Reverse-Proxy konfigurieren, um Client-Anforderungen an Jenkins weiterzuleiten. Um zu beginnen, müssen Sie die folgenden Voraussetzungen erfüllen.

Voraussetzungen

One Ubuntu 16.04 server wurde mit einem Nicht-Root-Benutzersudound einer Firewall konfiguriert, indem Sie denUbuntu 16.04 initial server setup guide mit Jenkins und Nginx folgen, die mithilfe der folgenden Anleitungen installiert und konfiguriert wurden:

Wenn Sie diese Anforderungen erfüllt haben, können Sie beginnen.

[[Schritt eins - Konfigurieren von Nginx]] == Schritt Eins - Konfigurieren von Nginx

Im vorausgesetzten TutorialHow to Secure Nginx with Let’s Encrypt on Ubuntu 16.04 haben wir Nginx so konfiguriert, dass SSL in der Datei/etc/nginx/sites-available/default verwendet wird. Daher öffnen wir diese Datei, um unsere Reverse-Proxy-Einstellungen hinzuzufügen.

sudo nano /etc/nginx/sites-available/default

Zunächst fügen wir im Blockservermit den SSL-Konfigurationseinstellungen spezifische Zugriffs- und Fehlerprotokolle hinzu:

/etc/nginx/sites-available/default

. . .
server {
        # SSL Configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        access_log            /var/log/nginx/jenkins.access.log;
        error_log            /var/log/nginx/jenkins.error.log;

Anschließend konfigurieren wir die Proxy-Einstellungen. Da wir alle Anfragen an Jenkins senden, werden wir die Standardzeiletry_filesauskommentieren, die, wie geschrieben, einen 404-Fehler zurückgibt, bevor die Anfrage Jenkins erreicht.

/etc/nginx/sites-available/default

 . . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;        }
. . .

Anschließend werden die tatsächlichen Proxy-Einstellungen hinzugefügt. Die Konfiguration beginnt mit der Aufnahme der von Nginx bereitgestelltenproxy_params, die sicherstellen, dass Informationen wie der Hostname, das Protokoll der Clientanforderung und die Client-IP-Adresse in unseren Protokolldateien verfügbar sind. Als nächstes legtproxy_pass das Protokoll und die Adresse des Proxyservers fest, in unserem Fall des Jenkins-Servers, auf den auf dem lokalen Host an Port 8080 zugegriffen wird. Dann erhöhen wir dieproxy_read_timeout von Nginx '60-Sekunden-Standard auf den vom Projekt empfohlenen 90-Sekunden-Wert. Und schließlich fügen wir dieproxy_redirect hinzu, um sicherzustellen, dass dieresponses are properly rewritten den richtigen Hostnamen enthalten.

Stellen Sie sicher, dass Sie Ihren SSL-gesicherten Domainnamen in der folgenden Zeileproxy_redirectersetzen:

/etc/nginx/sites-available/default

Location /
. . .
           location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                # try_files $uri $uri/ =404;
                include /etc/nginx/proxy_params;
                proxy_pass          http://localhost:8080;
                proxy_read_timeout  90s;
                # Fix potential "It appears that your reverse proxy set up is broken" error.
                proxy_redirect      http://localhost:8080 https://your.ssl.domain.name;

Speichern und schließen Sie die Datei, sobald Sie diese Änderungen vorgenommen haben. Wir werden Nginx erst neu starten, nachdem wir Jenkins konfiguriert haben, aber wir werden unsere Konfiguration jetzt testen:

sudo nginx -t

Wenn alles in Ordnung ist, gibt der Befehl Folgendes zurück:

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

Wenn nicht, beheben Sie alle gemeldeten Fehler, bis der Test bestanden ist.

[.Hinweis]##

Note:
Wenn Sieproxy_pass falsch konfigurieren (z. B. durch Hinzufügen eines abschließenden Schrägstrichs), erhalten Sie auf Ihrer Jenkins-Konfigurationsseite etwas Ähnliches wie das Folgende.

Jenkins error: Reverse proxy set up is broken

Wenn dieser Fehler auftritt, überprüfen Sie Ihre Einstellungen fürproxy_pass undproxy_redirect in der Nginx-Konfiguration.

[[Schritt zwei - Konfigurieren von Jenkins]] == Schritt Zwei - Konfigurieren von Jenkins

Damit Jenkins mit Nginx arbeiten kann, müssen wir die Jenkins-Konfiguration aktualisieren, damit der Jenkins-Server nur dielocalhost-Schnittstelle und nicht alle Schnittstellen (0.0.0.0) überwacht. Wenn Jenkins alle Schnittstellen abhört, kann er möglicherweise über seinen ursprünglichen, unverschlüsselten Port (8080) darauf zugreifen.

Wir werden die Konfigurationsdatei von/etc/default/jenkinsändern, um diese Anpassungen vorzunehmen.

sudo nano /etc/default/jenkins

Suchen Sie die ZeileJENKINS_ARGS und fügen Sie--httpListenAddress=127.0.0.1 zu den vorhandenen Argumenten hinzu:

/etc/default/jenkins

. . .
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"

Speichern und schließen Sie die Datei.

Um die neuen Konfigurationseinstellungen zu verwenden, werden Jenkins und Nginx neu gestartet.

sudo systemctl restart jenkins

Dasystemctl keine Ausgabe anzeigt, überprüfen wir den Status:

sudo systemctl status jenkins

Wir sollten den Status vonactive (exited)in der Zeile vonActiveehen:

Output● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; bad; vendor preset: enabled)
   Active: active (exited) since Tue 2017-04-25 22:37:29 UTC; 5s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 11360 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
  Process: 11391 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)

Wir wiederholen diese Schritte für Nginx:

sudo systemctl restart nginx
sudo systemctl status nginx
Output● nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-04-25 22:36:08 UTC; 2min 51s ago
  Process: 11339 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=
  Process: 11349 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  Process: 11345 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUC
 Main PID: 11353 (nginx)

Nachdem wir beide Server neu gestartet haben, sollten wir in der Lage sein, die Domäne über HTTP oder HTTPS zu besuchen. HTTP-Anfragen werden automatisch an HTTPS umgeleitet und die Jenkins-Site wird sicher bedient.

[[Schritt drei - Testen der Konfiguration]] == Schritt 3 - Testen der Konfiguration

Wir testen die Konfiguration, indem wir das Administratorkennwort zurücksetzen, nachdem wir die Verschlüsselung aktiviert haben. Wir besuchen zunächst die Website überhttp, um zu überprüfen, ob wir Jenkins erreichen, und werden wie erwartet zuhttps umgeleitet:

Geben Sie in Ihrem Webbrowser "http: //your.ssl.domain.name" ein und ersetzen Sieyour.ssl.domain.name durch Ihre Domain. Nachdem Sie die Eingabetaste gedrückt haben, sollte die URL mithttps beginnen und die Positionsleiste sollte anzeigen, dass die Verbindung sicher ist.

Verify Jenkins is being served over https

Wir gebenadmin in das Feld "Benutzer" und das automatisch generierte Passwort ein, das Jenkins bei der Installation erstellt und gespeichert hat.

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

Wenn Sie das Kennwort des Administratorbenutzers zurückgesetzt haben, geben Sie stattdessen dieses Kennwort ein. Sobald wir uns einloggen, ändern wir das Passwort, um sicherzugehen, dass es sicher ist.

Navigate to the Jenkins admin password page

Klicken Sie oben rechts auf "admin" und wählen Sie "Configure" aus dem Dropdown-Menü. Geben Sie das neue Passwort ein, bestätigen Sie es und klicken Sie auf "Speichern". Sie können das Jenkins-Webinterface jetzt sicher verwenden.

Fazit

In diesem Tutorial haben wir Nginx nach Abschluss der Voraussetzungen als Reverse-Proxy für den integrierten Webserver von Jenkins konfiguriert, um unsere Anmeldeinformationen und andere über die Weboberfläche übertragenen Informationen zu sichern. Jetzt, da Jenkins sicher ist, können Siehow to set up a continuous integration pipeline lernen, um Codeänderungen automatisch zu testen. Andere Ressourcen, die Sie berücksichtigen sollten, wenn Sie Jenkins noch nicht kennen, sindthe Jenkins project’s “Getting Started: Create your first Pipeline Tutorial oderthe library of community-contributed plugins.