Comment configurer Jenkins avec SSL à l'aide d'un proxy inverse Nginx sur Ubuntu 22.04

De Get Docs
Aller à :navigation, rechercher

Introduction

Par défaut, Jenkins est livré avec son propre serveur Web Winstone intégré écoutant sur le port 8080, ce qui est pratique pour démarrer. C'est aussi une bonne idée, cependant, 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 :

Étape 1 - Configuration de Nginx

Dans le tutoriel prérequis Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 22.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 bloc server 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;
        . . .
        }

Configurez ensuite les paramètres du proxy. Étant donné que toutes les requêtes sont envoyées à Jenkins, commentez la ligne par défaut try_files, qui renverrait sinon 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 mandaté, qui dans ce cas sera le serveur Jenkins accessible via localhost sur le port 8080.
  • 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 que les réponses sont correctement réécrites pour inclure le nom d'hôte approprié.

Assurez-vous de remplacer votre nom de domaine sécurisé par SSL par example.com dans la ligne proxy_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 attendrons le redémarrage de Nginx jusqu'à ce que nous ayons configuré Jenkins, mais nous pouvons tester notre configuration maintenant :

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

Si ce n'est pas le cas, corrigez les erreurs signalées jusqu'à ce que le test réussisse.

Remarque : Si vous configurez de manière incorrecte le proxy_pass (en ajoutant une barre oblique à la fin, par exemple), vous obtiendrez quelque chose de similaire à ce qui suit dans votre page Jenkins Configuration.

Si vous voyez cette erreur, revérifiez vos paramètres proxy_pass et proxy_redirect dans la configuration Nginx.


Étape 2 - Configuration de Jenkins

Pour que Jenkins fonctionne avec Nginx, vous devrez mettre à jour la configuration de Jenkins afin que le serveur Jenkins n'écoute que sur l'interface localhost 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 /etc/default/jenkins pour effectuer ces ajustements :

sudo nano /etc/default/jenkins

Localisez la ligne JENKINS_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é que systemctl n'affiche pas de sortie, vérifiez l'état :

sudo systemctl status jenkins

Vous devriez voir le statut active (exited) dans la ligne Active :

Output● jenkins.service - Jenkins Continuous Integration Server
     Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-04-18 16:35:49 UTC; 2s ago
   Main PID: 89751 (java)
      Tasks: 44 (limit: 4665)
     Memory: 358.9M
        CPU: 20.195s
     CGroup: /system.slice/jenkins.service
             └─89751 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080

Redémarrez Nginx :

sudo systemctl restart nginx

Vérifiez l'état :

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 2022-04-18 16:36:17 UTC; 7s ago
       Docs: man:nginx(8)
    Process: 89866 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 89869 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 89870 (nginx)
      Tasks: 3 (limit: 4665)
     Memory: 4.1M
        CPU: 51ms
     CGroup: /system.slice/nginx.service
             ├─89870 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"

Avec les deux serveurs redémarrés, vous devriez pouvoir visiter le domaine en utilisant HTTP ou HTTPS. Les requêtes HTTP seront automatiquement redirigées vers HTTPS et le site Jenkins sera servi en toute sécurité.

Étape 3 - Test de la configuration

Maintenant que vous avez activé le chiffrement, 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 joindre Jenkins et que vous êtes redirigé vers HTTPS.

Dans votre navigateur Web, entrez http://example.com, en remplaçant votre domaine par example.com. Après avoir appuyé sur ENTER, l'URL doit commencer par https 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éé dans Comment installer Jenkins sur Ubuntu 22.04 dans le champ Utilisateur et le mot de passe que vous avez sélectionné dans le champ Mot de passe.

Une fois connecté, vous pouvez modifier 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 de profil principale, sélectionnez Configurer dans la liste sur le côté gauche de la page :

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

Confirmez le nouveau mot de passe en cliquant sur Enregistrer. 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'identification et autres informations transmises via l'interface Web. Maintenant que Jenkins est sécurisé, vous pouvez apprendre comment configurer un pipeline d'intégration continue pour tester automatiquement les changements de code. D'autres ressources à considérer si vous débutez avec Jenkins sont le tutoriel "Créer votre premier pipeline" du projet Jenkins ou la bibliothèque de plugins fournis par la communauté.