Hoe u Nginx kunt configureren met SSL als omgekeerde proxy voor Jenkins

Introductie

Standaard wordt Jenkins geleverd met zijn eigen ingebouwde webserver, die luistert op poort 8080. Dit is handig als je een privé Jenkins-instantie draait, of als je snel iets wilt opzetten en niet geeft om beveiliging. Zodra je echter echte productiegegevens naar je host stuurt, is het een goed idee om een meer beveiligde webserver zoals Nginx te gebruiken om het verkeer af te handelen.

In deze post wordt gedetailleerd beschreven hoe je je site kunt omwikkelen met SSL met behulp van de Nginx-webserver als omgekeerde proxy voor je Jenkins-instantie. Deze tutorial gaat ervan uit dat je enige bekendheid hebt met Linux-commando’s, een werkende Jenkins-installatie en een Ubuntu 20.04-installatie.

Je kunt Jenkins later in deze tutorial installeren als je het nog niet hebt geïnstalleerd.

Vereisten

Deze handleiding gaat ervan uit dat je Ubuntu 20.04 gebruikt. Voordat je begint, moet je een niet-root gebruikersaccount hebben met sudo-rechten ingesteld op je systeem. Je kunt leren hoe je dit doet door de Ubuntu 20.04 initiële serverinstallatiehandleiding te volgen. Je hebt ook de Nginx-server geïnstalleerd en je domein gehost nodig. Je kunt leren hoe je dit doet met de Hoe Nginx te installeren op Ubuntu 20.04 handleiding.

Bovendien is het erg belangrijk dat je Jenkins-instantie beveiligd is met SSL. Als het zichtbaar is op het internet, kun je het beveiligen met Let’s Encrypt. Je kunt leren hoe je dit doet met de Hoe Nginx te beveiligen met Let’s Encrypt op Ubuntu 22.04 handleiding.
Zoals eerder vermeld, gaat deze handleiding ervan uit dat Jenkins al is geïnstalleerd. Deze handleiding laat je zien hoe je Jenkins installeert indien nodig. Je moet waarschijnlijk overschakelen naar de rootgebruiker voor dat artikel.

Stap 1 — Nginx configureren

Nginx is de afgelopen jaren een favoriete webserver geworden vanwege zijn snelheid en flexibiliteit, wat het een ideaal keuze maakt voor onze toepassing.

Bewerk de configuratie

Daarna moet je het standaard Nginx-configuratiebestand bewerken. Het volgende voorbeeld gebruikt nano.

  1. sudo nano etc/nginx/sites-enabled/default

Dit is hoe de uiteindelijke configuratie eruit zou kunnen zien; de secties worden hieronder afgebroken en kort uitgelegd. Je kunt het bestaande configuratiebestand bijwerken of vervangen, hoewel je misschien eerst een back-upkopie wilt maken.

server {23
    listen 80;
    return 301 https://$host$request_uri;
}

server {

    listen 443;
    server_name jenkins.domain.com;

    access_log            /var/log/nginx/jenkins.access.log;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;

      proxy_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
    }
    
    ...
}

Je moet de regels server_name en proxy_redirect bijwerken met je eigen domeinnaam. Er gebeurt ook wat extra Nginx-magie die verzoeken vertelt om te worden gelezen door Nginx en herschreven aan de responszijde om ervoor te zorgen dat de omgekeerde proxy werkt.

Sla het bestand op en sluit het. Als je nano hebt gebruikt, kun je dat doen door op Ctrl + X, Y en vervolgens Enter te drukken.

De eerste sectie vertelt de Nginx-server om te luisteren naar alle verzoeken die binnenkomen op poort 80 (standaard HTTP) en ze door te sturen naar HTTPS.

...
server {
   listen 80;
   return 301 https://$host$request_uri;
}
...

Daarna vindt de proxy plaats. Het neemt in feite alle inkomende verzoeken en stuurt ze door naar de Jenkins-instantie die gebonden is / luistert op poort 8080 op de lokale netwerkinterface.

...
location / {

    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;

    proxy_pass          http://localhost:8080;
    proxy_read_timeout  90;

    proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
...

Opmerking: Als je meer wilt weten over proxy’s in Nginx, heeft deze tutorial goede informatie over de Nginx-proxy-instellingen.

A few quick things to point out here. If you don’t have a domain name that resolves to your Jenkins server, then the proxy_redirect statement above won’t function correctly without modification, so keep that in mind. Also, if you misconfigure the proxy_pass (by adding a trailing slash for example), you will get something similar to the following in your Jenkins Configuration page.

Dus, als je deze fout ziet, controleer dan je proxy_pass en proxy_redirect instellingen in de Nginx configuratie!

Stap 2 — Jenkins configureren

Om Jenkins te laten werken met Nginx, moeten we de Jenkins-configuratie bijwerken om alleen te luisteren op het localhost-adres in plaats van op alles (0.0.0.0), om ervoor te zorgen dat het verkeer correct wordt afgehandeld. Dit is een belangrijke beveiligingsstap omdat als Jenkins nog steeds luistert op alle adressen, het nog steeds mogelijk toegankelijk zal zijn via zijn oorspronkelijke poort (8080). We zullen het /etc/default/jenkins configuratiebestand aanpassen om deze wijzigingen aan te brengen.

  1. sudo nano /etc/default/jenkins

Zoek de JENKINS\_ARGS regel en update deze naar het volgende:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"

Let op dat de –httpListenAddress=127.0.0.1 instelling moet worden toegevoegd of gewijzigd.

Vervolgens kun je Jenkins en Nginx opnieuw starten.

  1. sudo service jenkins restart
  2. sudo service nginx restart

Je zou nu je domein moeten kunnen bezoeken met HTTPS, en de Jenkins-site zal veilig worden geserveerd.

Optioneel — Update OAuth URLs

Als u de GitHub of een andere OAuth-plugin voor authenticatie gebruikt, zal deze waarschijnlijk op dit moment defect zijn. Bijvoorbeeld, bij het proberen te bezoeken van de URL, krijgt u een “Pagina openen mislukt” met een URL vergelijkbaar met http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string.

Om dit op te lossen moet u een paar instellingen binnen Jenkins bijwerken, inclusief uw OAuth-plugininstellingen. Werk eerst de Jenkins-URL bij in de Jenkins-GUI; deze kan worden gevonden in het Jenkins -> Beheer Jenkins -> Systeem configureren -> Jenkins-locatie menu.

Werk de Jenkins-URL bij om HTTPS te gebruiken – https://jenkins.domain.com/

Vervolgens, werk uw OAuth-instellingen bij met de externe provider. Dit voorbeeld is voor GitHub. Op GitHub is dit te vinden onder Instellingen -> Applicaties -> Ontwikkelaarstoepassingen, op de GitHub-site.

Er zou een vermelding moeten zijn voor Jenkins. Werk de Homepage URL en Authorisatie-terugroep-URL bij om overeen te komen met de HTTPS-instellingen. Het kan er als volgt uitzien:

Conclusie

Het enige wat nog rest is verifiëren dat alles correct werkte. Zoals hierboven vermeld, zou je nu moeten kunnen surfen naar je nieuw geconfigureerde URL – jenkins.domain.com – via zowel HTTP als HTTPS. Je zou moeten worden omgeleid naar de beveiligde site en enkele sitegegevens moeten zien, inclusief je recent bijgewerkte SSL-instellingen. Zoals eerder opgemerkt, als je geen hostnamen via DNS gebruikt, kan je omleiding mogelijk niet werken zoals gewenst. In dat geval moet je de proxy_pass-sectie in het Nginx-configuratiebestand aanpassen.

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-with-ssl-as-a-reverse-proxy-for-jenkins