introduction
Par défaut,Jenkins est livré avec son propre serveur Web Winstone intégré écoutant sur le port8080
, ce qui est pratique pour démarrer. Cependant, il est également judicieux de sécuriser Jenkins avec SSL pour protéger les mots de passe et les données sensibles transmises via l’interface Web.
Dans ce didacticiel, vous allez configurer Nginx en tant que proxy inverse pour diriger les demandes des clients vers Jenkins.
Conditions préalables
Pour commencer, vous aurez besoin des éléments suivants:
-
Un serveur Ubuntu 18.04 configuré avec un utilisateur sudo non root et un pare-feu, suivant lesUbuntu 18.04 initial server setup guide.
-
Jenkins installé, en suivant les étapes deHow to Install Jenkins on Ubuntu 18.04
-
Nginx installé, en suivant les étapes enHow to Install Nginx on Ubuntu 18.04
-
Un certificat SSL pour un domaine fourni parLet’s Encrypt. SuivezHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04 pour obtenir ce certificat. Notez que vous aurez besoin d'unregistered domain name que vous possédez ou contrôlez. Ce didacticiel utilisera le nom de domaineexample.com partout.
[[step-1 -—- configuring-nginx]] == Étape 1 - Configuration de Nginx
Dans le didacticiel prérequisHow to Secure Nginx with Let’s Encrypt on Ubuntu 18.04, vous avez configuré Nginx pour utiliser SSL dans le fichier/etc/nginx/sites-available/example.com
. Ouvrez ce fichier pour ajouter vos paramètres de proxy inverse:
sudo nano /etc/nginx/sites-available/example.com
Dans le blocserver
avec les paramètres de configuration SSL, ajoutez les journaux d'accès et d'erreurs spécifiques à Jenkins:
/etc/nginx/sites-available/example.com
. . .
server {
. . .
# SSL Configuration
#
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
access_log /var/log/nginx/jenkins.access.log;
error_log /var/log/nginx/jenkins.error.log;
. . .
}
Ensuite, configurons les paramètres du proxy. Puisque nous envoyons toutes les requêtes à Jenkins, nous allons commenter la ligne par défauttry_files
, qui renverrait autrement une erreur 404 avant que la requête n'atteigne Jenkins:
/etc/nginx/sites-available/example.com
. . .
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
# try_files $uri $uri/ =404; }
. . .
Ajoutons maintenant les paramètres de proxy, qui incluent:
-
proxy_params
: Le fichier/etc/nginx/proxy_params
est fourni par Nginx et garantit que les informations importantes, y compris le nom d'hôte, le protocole de la demande du client et l'adresse IP du client, sont conservées et disponibles dans les fichiers journaux. -
proxy_pass
: Ceci définit le protocole et l'adresse du serveur proxy, qui dans ce cas sera le serveur Jenkins accédé vialocalhost
sur le port8080
. -
proxy_read_timeout
: Cela permet une augmentation de la valeur par défaut de 60 secondes de Nginx à la valeur de 90 secondes recommandée par Jenkins. -
proxy_redirect
: Cela garantit queresponses are correctly rewritten inclut le nom d'hôte correct.
Assurez-vous de remplacer votre nom de domaine sécurisé SSL parexample.com
dans la ligneproxy_redirect
ci-dessous:
/etc/nginx/sites-available/example.com
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 setup is broken" error.
proxy_redirect http://localhost:8080 https://example.com;
Une fois ces modifications effectuées, enregistrez le fichier et quittez l’éditeur. Nous ne tiendrons pas compte du redémarrage de Nginx après la configuration de Jenkins, mais nous pouvons maintenant tester notre configuration:
sudo nginx -t
Si tout va bien, la commande retournera:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Sinon, corrigez toutes les erreurs signalées jusqu'à la réussite du test.
[.Remarque]##
Note:
Si vous configurez mal lesproxy_pass
(en ajoutant une barre oblique à la fin, par exemple), vous obtiendrez quelque chose de similaire à ce qui suit dans votre page JenkinsConfiguration.
Si vous voyez cette erreur, revérifiez vos paramètresproxy_pass
etproxy_redirect
dans la configuration Nginx.
[[step-2 -—- configuring-jenkins]] == Étape 2 - Configuration de Jenkins
Pour que Jenkins fonctionne avec Nginx, vous devrez mettre à jour la configuration Jenkins afin que le serveur Jenkins n'écoute que sur l'interfacelocalhost
plutôt que sur toutes les interfaces (0.0.0.0
). Si Jenkins écoute sur toutes les interfaces, il est potentiellement accessible sur son port d'origine non chiffré (8080
).
Modifions le fichier de configuration de/etc/default/jenkins
pour effectuer ces ajustements:
sudo nano /etc/default/jenkins
Localisez la ligneJENKINS_ARGS
et ajoutez--httpListenAddress=127.0.0.1
aux arguments existants:
/etc/default/jenkins
. . .
JENKINS_ARGS="--webroot=/var/cache/$NAME/war --httpPort=$HTTP_PORT --httpListenAddress=127.0.0.1"
Enregistrez et quittez le fichier.
Pour utiliser les nouveaux paramètres de configuration, redémarrez Jenkins:
sudo systemctl restart jenkins
Étant donné quesystemctl
n'affiche pas la sortie, vérifiez l'état:
sudo systemctl status jenkins
Vous devriez voir l'état deactive (exited)
dans la ligneActive
:
Output● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; generated)
Active: active (exited) since Mon 2018-07-09 20:26:25 UTC; 11s ago
Docs: man:systemd-sysv-generator(8)
Process: 29766 ExecStop=/etc/init.d/jenkins stop (code=exited, status=0/SUCCESS)
Process: 29812 ExecStart=/etc/init.d/jenkins start (code=exited, status=0/SUCCESS)
Redémarrez Nginx:
sudo systemctl restart nginx
Vérifiez le statut:
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 Mon 2018-07-09 20:27:23 UTC; 31s ago
Docs: man:nginx(8)
Process: 29951 ExecStop=/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid (code=exited, status=0/SUCCESS)
Process: 29963 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Process: 29952 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
Main PID: 29967 (nginx)
Une fois les deux serveurs redémarrés, vous devriez pouvoir accéder au domaine via HTTP ou HTTPS. Les requêtes HTTP seront automatiquement redirigées vers HTTPS et le site Jenkins sera servi en toute sécurité.
[[step-3 -—- testing-the-configuration]] == Étape 3 - Test de la configuration
Maintenant que vous avez activé le cryptage, vous pouvez tester la configuration en réinitialisant le mot de passe administrateur. Commençons par visiter le site via HTTP pour vérifier que vous pouvez atteindre Jenkins et que vous êtes redirigé vers HTTPS.
Dans votre navigateur Web, entrezhttp://example.com
, en remplaçant votre domaine parexample.com
. Après avoir appuyé surENTER
, l'URL doit commencer parhttps
et la barre d'adresse doit indiquer que la connexion est sécurisée.
Vous pouvez entrer le nom d'utilisateur administratif que vous avez créé dansHow To Install Jenkins on Ubuntu 18.04 dans le champUser et le mot de passe que vous avez sélectionné dans le champPassword.
Une fois connecté, vous pouvez changer le mot de passe pour vous assurer qu’il est sécurisé.
Cliquez sur votre nom d'utilisateur dans le coin supérieur droit de l'écran. Sur la page principale du profil, sélectionnezConfigure dans la liste sur le côté gauche de la page:
Cela vous mènera à une nouvelle page, où vous pourrez entrer et confirmer un nouveau mot de passe:
Confirmez le nouveau mot de passe en cliquant surSave. Vous pouvez maintenant utiliser l'interface Web Jenkins en toute sécurité.
Conclusion
Dans ce didacticiel, vous avez configuré Nginx en tant que proxy inverse du serveur Web intégré de Jenkins pour sécuriser vos informations d’identité et autres informations transmises via l’interface Web. Maintenant que Jenkins est sécurisé, vous pouvez apprendre àhow to set up a continuous integration pipeline à tester automatiquement les modifications de code. Les autres ressources à prendre en compte si vous êtes nouveau dans Jenkins sont le tutorielthe Jenkins project’s “Creating your first Pipeline” outhe library of community-contributed plugins.