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

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:

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

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

Navigate to Jenkins password page

Cela vous mènera à une nouvelle page, où vous pourrez entrer et confirmer un nouveau mot de passe:

Jenkins create password page

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.