introduction
Par défaut, Jenkins est livré avec son propre serveur Web Winstone intégré qui écoute sur le port 8080, ce qui est pratique pour commencer. Dès que vous envisagez sérieusement d’utiliser Jenkins, vous devez le sécuriser avec SSL pour protéger les mots de passe et autres données sensibles transmises via l’interface Web.
Dans ce didacticiel, nous montrerons comment configurer Nginx en tant que proxy inverse pour diriger les demandes des clients vers Jenkins. Pour commencer, vous devez remplir chacun des prérequis ci-dessous.
Conditions préalables
One Ubuntu 16.04 server configuré avec un utilisateursudo
non root et un pare-feu en suivant lesUbuntu 16.04 initial server setup guide avec Jenkins et Nginx installés et configurés à l'aide des guides suivants:
-
How to Secure Nginx with Let’s Encrypt on Ubuntu 16.04. Notez que ce tutoriel nécessite un nom de domaine enregistré que vous possédez ou contrôlez.
Lorsque vous avez rempli ces conditions, vous êtes prêt à commencer.
[[step-one -—- configuring-nginx]] == Étape un - Configuration de Nginx
Dans le didacticiel des prérequis,How to Secure Nginx with Let’s Encrypt on Ubuntu 16.04, nous avons configuré Nginx pour utiliser SSL dans le fichier/etc/nginx/sites-available/default
, nous allons donc ouvrir ce fichier pour ajouter nos paramètres de proxy inverse.
sudo nano /etc/nginx/sites-available/default
Tout d'abord, nous allons ajouter des journaux d'accès et d'erreurs spécifiques dans le blocserver
avec les paramètres de configuration SSL:
/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;
Ensuite, nous allons configurer les paramètres du proxy. Puisque nous envoyons toutes les requêtes à Jenkins, nous allons commenter la ligne par défauttry_files
qui, telle qu'elle est écrite, renverra une erreur 404 avant que la requête n'atteigne Jenkins.
/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; }
. . .
Ensuite, nous ajouterons les paramètres de proxy réels. La configuration commence par inclure lesproxy_params
fournis par Nginx qui garantissent que des informations telles que le nom d'hôte, le protocole de la demande du client et l'adresse IP du client sont conservées seront disponibles dans nos fichiers journaux. Ensuite, leproxy_pass
définit le protocole et l'adresse du serveur proxy, qui dans notre cas est le serveur Jenkins accédé sur l'hôte local sur le port 8080. Ensuite, nous augmentons lesproxy_read_timeout
de 60 secondes par défaut de Nginx à la valeur recommandée de 90 secondes du projet. Et enfin, nous ajoutons lesproxy_redirect
pour nous assurer que lesresponses are properly rewritten incluent le nom d'hôte correct.
Assurez-vous de remplacer votre nom de domaine sécurisé SSL dans la ligneproxy_redirect
ci-dessous:
/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;
Une fois ces modifications apportées, enregistrez et quittez le fichier. Nous n’allons pas redémarrer Nginx avant d’avoir configuré Jenkins, mais nous allons 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 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 de configuration Jenkins.
Si vous voyez cette erreur, revérifiez vos paramètresproxy_pass
etproxy_redirect
dans la configuration Nginx.
[[step-two -—- configuring-jenkins]] == Deuxième étape - Configuration de Jenkins
Pour que Jenkins fonctionne avec Nginx, nous devons 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, alors il est potentiellement accessible sur son port d'origine non chiffré (8080
).
Nous modifierons 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, nous allons redémarrer Jenkins et Nginx.
sudo systemctl restart jenkins
Étant donné quesystemctl
n'affiche pas la sortie, nous vérifierons l'état:
sudo systemctl status jenkins
Nous devrions voir l'état deactive (exited)
dans la ligneActive
:
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)
Nous allons répéter ces étapes pour 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)
Maintenant que nous avons redémarré les deux serveurs, nous devrions pouvoir visiter le 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-three -—- testing-the-configuration]] == Étape trois - Test de la configuration
Nous allons tester la configuration en réinitialisant le mot de passe administratif maintenant que nous avons activé le cryptage. Nous allons commencer par visiter le site viahttp
pour vérifier que nous atteignons Jenkins et que nous sommes redirigés vershttps
comme prévu:
Dans votre navigateur Web, saisissez «http: //your.ssl.domain.name», en remplaçant votre domaine paryour.ssl.domain.name
. Après avoir appuyé sur entrée, l'URL doit commencer parhttps
et la barre d'adresse doit indiquer que la connexion est sécurisée.
Nous allons entreradmin
dans le champ "Utilisateur" et le mot de passe généré automatiquement que Jenkins a créé et stocké lors de son installation.
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
Si vous avez réinitialisé le mot de passe de l’administrateur, entrez-le plutôt. Dans tous les cas, une fois que nous nous sommes connectés, nous modifierons le mot de passe pour nous assurer qu’il est sécurisé.
Cliquez sur «admin» dans le coin supérieur droit et sélectionnez «Configurer» dans le menu déroulant. Entrez et confirmez le nouveau mot de passe et cliquez sur «Enregistrer». Vous pouvez maintenant utiliser l'interface Web Jenkins en toute sécurité.
Conclusion
Dans ce didacticiel, une fois les conditions préalables remplies, nous avons configuré Nginx en tant que proxy inverse du serveur Web intégré de Jenkins afin de sécuriser nos 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 “Getting Started: Create your first Pipeline outhe library of community-contributed plugins.