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
.
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.
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.
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.
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.
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.
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.