Comment configurer Nginx avec SSL en tant que proxy inverse pour Jenkins

Introduction

Par défaut, Jenkins est livré avec son propre serveur web intégré, qui écoute sur le port 8080. C’est pratique si vous exécutez une instance Jenkins privée, ou si vous avez juste besoin de mettre quelque chose en place rapidement et que la sécurité ne vous importe pas. Une fois que vous avez de vraies données de production envoyées à votre hôte, cependant, il est judicieux d’utiliser un serveur web plus sécurisé tel que Nginx pour gérer le trafic.

Cet article détaillera comment envelopper votre site avec SSL en utilisant le serveur web Nginx comme proxy inverse pour votre instance Jenkins. Ce tutoriel suppose une certaine familiarité avec les commandes Linux, une installation Jenkins fonctionnelle et une installation Ubuntu 20.04.

Vous pouvez installer Jenkins plus tard dans ce tutoriel, si vous ne l’avez pas encore installé.

Prérequis

Ce guide suppose que vous utilisez Ubuntu 20.04. Avant de commencer, vous devez disposer d’un compte utilisateur non root avec des privilèges sudo configurés sur votre système. Vous pouvez apprendre comment faire cela en suivant le tutoriel de configuration initiale du serveur Ubuntu 20.04. Vous aurez également besoin du serveur Nginx installé et hébergeant votre domaine. Vous pouvez apprendre comment faire cela avec le tutoriel d’installation de Nginx sur Ubuntu 20.04.

De plus, il est très important de sécuriser votre instance Jenkins avec SSL. S’il est visible sur Internet, vous pouvez le sécuriser avec Let’s Encrypt. Vous pouvez apprendre comment faire cela avec le tutoriel sur la sécurisation de Nginx avec Let’s Encrypt sur Ubuntu 22.04.
Comme mentionné précédemment, ce tutoriel suppose que Jenkins est déjà installé. Ce tutoriel vous montrera comment installer Jenkins si nécessaire. Vous devrez probablement passer à l’utilisateur root pour cet article.

Étape 1 — Configurer Nginx

Nginx est devenu un serveur web favori ces dernières années en raison de sa rapidité et de sa flexibilité, ce qui en fait un choix idéal pour notre application.

Modifier la configuration

Ensuite, vous devrez modifier le fichier de configuration par défaut de Nginx. L’exemple suivant utilise nano.

  1. sudo nano etc/nginx/sites-enabled/default

Voici à quoi pourrait ressembler la configuration finale ; les sections sont découpées et brièvement expliquées ci-dessous. Vous pouvez mettre à jour ou remplacer le fichier de configuration existant, bien que vous souhaitiez peut-être en faire une copie de sauvegarde au préalable.

server {23
    listen 80;
    return 301 https://$host$request_uri;
}

server {

    listen 443;
    server_name jenkins.domain.com;

    access_log            /var/log/nginx/jenkins.access.log;

    location / {

      proxy_set_header        Host $host;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        X-Forwarded-Proto $scheme;

      proxy_pass          http://localhost:8080;
      proxy_read_timeout  90;

      proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
    }
    
    ...
}

Vous devrez mettre à jour les lignes server_name et proxy_redirect avec votre propre nom de domaine. Il y a également une certaine magie supplémentaire de Nginx qui indique aux requêtes d’être lues par Nginx et réécrites côté réponse pour garantir que le proxy inverse fonctionne.

Enregistrez et fermez le fichier. Si vous avez utilisé nano, vous pouvez le faire en appuyant sur Ctrl + X, puis sur Y, et enfin sur Entrée.

La première section indique au serveur Nginx d’écouter toutes les demandes arrivant sur le port 80 (HTTP par défaut) et de les rediriger vers HTTPS.

...
server {
   listen 80;
   return 301 https://$host$request_uri;
}
...

Ensuite, le proxying se produit. Il prend essentiellement toutes les demandes entrantes et les redirige vers l’instance Jenkins qui est liée/écoutant sur le port 8080 de l’interface réseau locale.

...
location / {

    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;

    proxy_pass          http://localhost:8080;
    proxy_read_timeout  90;

    proxy_redirect      http://localhost:8080 https://jenkins.domain.com;
}
...

Remarque : Si vous souhaitez en savoir plus sur le proxying dans Nginx, cet tutoriel contient des informations utiles sur les paramètres de proxy Nginx.

A few quick things to point out here. If you don’t have a domain name that resolves to your Jenkins server, then the proxy_redirect statement above won’t function correctly without modification, so keep that in mind. Also, if you misconfigure the proxy_pass (by adding a trailing slash for example), you will get something similar to the following in your Jenkins Configuration page.

Donc, si vous voyez cette erreur, vérifiez à nouveau vos paramètres proxy_pass et proxy_redirect dans la configuration de Nginx!

Étape 2 — Configurer Jenkins

Pour que Jenkins fonctionne avec Nginx, nous devons mettre à jour la configuration de Jenkins pour qu’elle n’écoute que sur l’adresse localhost au lieu de toutes (0.0.0.0), afin de garantir que le trafic soit correctement géré. C’est une étape de sécurité importante car si Jenkins écoute toujours sur toutes les adresses, alors il sera potentiellement accessible via son port d’origine (8080). Nous allons modifier le fichier de configuration /etc/default/jenkins pour apporter ces ajustements.

  1. sudo nano /etc/default/jenkins

Trouvez la ligne JENKINS\_ARGS et mettez-la à jour pour qu’elle ressemble à ce qui suit:

JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpListenAddress=127.0.0.1 --httpPort=$HTTP_PORT -ajp13Port=$AJP_PORT"

Remarquez que le paramètre –httpListenAddress=127.0.0.1 doit être ajouté ou modifié.

Ensuite, redémarrez Jenkins et Nginx.

  1. sudo service jenkins restart
  2. sudo service nginx restart

Vous devriez maintenant pouvoir visiter votre domaine en utilisant HTTPS, et le site Jenkins sera servi de manière sécurisée.

Facultatif — Mettre à jour les URL OAuth

Si vous utilisez GitHub ou un autre plugin OAuth pour l’authentification, il sera probablement cassé à ce stade. Par exemple, lorsque vous essayez de visiter l’URL, vous obtiendrez une erreur « Impossible d’ouvrir la page » avec une URL similaire à http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string.

Pour résoudre ce problème, vous devrez mettre à jour quelques paramètres dans Jenkins, y compris vos paramètres de plugin OAuth. Tout d’abord, mettez à jour l’URL de Jenkins dans l’interface graphique de Jenkins ; vous pouvez la trouver dans le menu Jenkins -> Gérer Jenkins -> Configurer le système -> Emplacement de Jenkins.

Mettez à jour l’URL de Jenkins pour utiliser HTTPS – https://jenkins.domain.com/

Ensuite, mettez à jour vos paramètres OAuth avec le fournisseur externe. Cet exemple concerne GitHub. Sur GitHub, cela se trouve sous Paramètres -> Applications -> Applications de développeur, sur le site GitHub.

Il devrait y avoir une entrée pour Jenkins. Mettez à jour l’URL de la page d’accueil (Homepage URL) et l’URL de rappel d’autorisation (Authorization callback URL) pour refléter les paramètres HTTPS. Cela pourrait ressembler à ce qui suit :

Conclusion

La seule chose qui reste à faire est de vérifier que tout fonctionne correctement. Comme mentionné ci-dessus, vous devriez maintenant pouvoir accéder à votre URL nouvellement configurée – jenkins.domain.com – via HTTP ou HTTPS. Vous devriez être redirigé vers le site sécurisé et devriez voir des informations sur le site, y compris vos paramètres SSL nouvellement mis à jour. Comme mentionné précédemment, si vous n’utilisez pas les noms d’hôtes via DNS, alors votre redirection pourrait ne pas fonctionner comme souhaité. Dans ce cas, vous devrez modifier la section proxy_pass dans le fichier de configuration Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-with-ssl-as-a-reverse-proxy-for-jenkins