Comment configurer Jenkins avec SSL à l’aide d’un proxy inverse Nginx

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:

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

Jenkins error: Reverse proxy set up is broken

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.

Verify Jenkins is being served over https

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

Navigate to the Jenkins admin password page

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.