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

introduction

Par défaut, Jenkins est fourni avec son propre serveur Web intégré, qui écoute sur le port 8080. C’est pratique si vous exécutez une instance privée de Jenkins ou si vous avez juste besoin d’obtenir rapidement quelque chose et que vous ne vous souciez pas de la sécurité. Une fois que vous avez de vraies données de production qui sont transmises à votre hôte, c’est une bonne idée d’utiliser un serveur Web plus sécurisé comme Nginx.

Cet article détaille comment encapsuler votre site avec SSL en utilisant le serveur Web Nginx en tant que proxy inverse pour votre instance Jenkins. * Ce tutoriel suppose une certaine familiarité avec les commandes Linux, une installation fonctionnelle de Jenkins et une installation d’Ubuntu 14.04. *

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

Première étape - Configurer Nginx

Nginx est devenu un serveur Web privilégié pour sa rapidité et sa flexibilité ces dernières années. C’est le serveur Web que nous allons utiliser.

Les commandes de cette section supposent que vous avez un utilisateur configuré avec https://www.digitalocean.com/community/tutorials/how-to-add-and-delete-users-on-an-ubuntu-14-04- vps [accès sudo].

Installer Nginx

Mettez à jour vos listes de paquets et installez Nginx:

sudo apt-get update
sudo apt-get install nginx

Ce n’est pas crucial, mais vous voudrez peut-être vérifier la version de Nginx au cas où vous auriez à résoudre d’autres problèmes. Les nouvelles versions de Nginx fournissent également quelques fonctionnalités supplémentaires.

nginx -v

Obtenir un certificat

Ensuite, vous devrez acheter ou créer un certificat SSL. Ces commandes sont pour un certificat auto-signé, mais vous devriez obtenir officiellement un https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs [ certificat signé] si vous souhaitez éviter les avertissements du navigateur.

Déplacez-vous dans le répertoire approprié et générez un certificat:

cd /etc/nginx
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/cert.key -out /etc/nginx/cert.crt

Vous serez invité à entrer des informations sur le certificat. Vous pouvez remplir ceci comme vous le souhaitez; Sachez simplement que les informations seront visibles dans les propriétés du certificat. Nous avons défini le nombre de bits sur 2048, ce qui est le minimum nécessaire pour le faire signer par une autorité de certification. Si vous souhaitez faire signer le certificat, vous devez créer un CSR.

Editer la configuration

Ensuite, vous devrez éditer le fichier de configuration par défaut de Nginx.

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

Voici à quoi pourrait ressembler la configuration finale; les sections sont détaillé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 d’abord en faire une copie rapide.

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

server {

   listen 443;
   server_name ;

   ssl_certificate           /etc/nginx/cert.crt;
   ssl_certificate_key       /etc/nginx/cert.key;

   ssl on;
   ssl_session_cache  builtin:1000  shared:SSL:10m;
   ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
   ssl_prefer_server_ciphers on;

   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;

     # Fix the “It appears that your reverse proxy set up is broken" error.
     proxy_pass          http://localhost:8080;
     proxy_read_timeout  90;

     proxy_redirect      http://localhost:8080 https://;
   }
 }

Dans notre configuration, les paramètres et reflètent l’emplacement où nous avons créé notre certificat SSL. Vous devrez mettre à jour les lignes et proxyredirect avec votre propre nom de domaine. Une certaine magie supplémentaire de Nginx est également en cours, indiquant que les demandes doivent être lues par Nginx et réécrites du côté de la réponse pour assurer le fonctionnement du proxy inverse.

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

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

Ensuite, nous avons les paramètres SSL. Ceci est un bon ensemble de valeurs par défaut, mais peut certainement être développé. Pour plus d’explications, veuillez consulter cet tutoriel.

...
 listen 443;
 server_name ;

 ssl_certificate           /etc/nginx/cert.crt;
 ssl_certificate_key       /etc/nginx/cert.key;

 ssl on;
 ssl_session_cache  builtin:1000  shared:SSL:10m;
 ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
 ssl_prefer_server_ciphers on;
 ...

La dernière section est l’endroit où se déroule la procuration. Il prend essentiellement toutes les demandes entrantes et les envoie à l’instance Jenkins qui est liée / écoute le port 8080 sur l’interface de réseau local. La situation est légèrement différente, mais cet tutoriel a de bons côtés. informations sur les paramètres de proxy Nginx.

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

   # Fix the “It appears that your reverse proxy set up is broken" error.
   proxy_pass          http://localhost:8080;
   proxy_read_timeout  90;

   proxy_redirect      http://localhost:8080 https://;
}
...

Quelques petites choses à souligner ici. Si vous ne possédez pas de nom de domaine pouvant être résolu sur votre serveur Jenkins, la déclaration ci-dessus ne fonctionnera pas correctement sans modification. Gardez cela à l’esprit. De plus, si vous configurez mal la page (en ajoutant une barre oblique par exemple), vous obtiendrez un résultat similaire à celui-ci sur votre page de configuration Jenkins.

image: https: //assets.digitalocean.com/articles/nginx_jenkins/1.jpg [Erreur Jenkins: la configuration du proxy inverse est interrompue]

Donc, si vous voyez cette erreur, revérifiez vos paramètres et dans la configuration de Nginx!

Deuxième étape - Configurer Jenkins

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

Pour que Jenkins fonctionne avec Nginx, nous devons mettre à jour la configuration Jenkins afin d’écouter uniquement sur l’interface localhost au lieu de la totalité (0.0.0.0), afin de nous assurer que le trafic est correctement géré. Il s’agit d’une étape importante, car si Jenkins écoute toujours sur toutes les interfaces, elle sera toujours potentiellement accessible via son port d’origine (8080). Nous allons modifier le fichier de configuration pour effectuer ces ajustements.

sudo nano /etc/default/jenkins

Localisez la ligne + JENKINS \ ARGS et mettez-la à jour comme suit:

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

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

Ensuite, redémarrez Jenkins et Nginx.

sudo service jenkins restart
sudo service nginx restart

Vous devriez maintenant pouvoir visiter votre domaine en utilisant HTTP ou HTTPS, et le site Jenkins sera servi en toute sécurité. Vous verrez un avertissement de certificat si vous avez utilisé un certificat auto-signé.

Facultatif - Mettre à jour les URL OAuth

Si vous utilisez le GitHub ou un autre plugin OAuth pour l’authentification, il sera probablement cassé à ce stade. Par exemple, lorsque vous tentez de visiter l’URL, vous obtiendrez un message «Impossible d’ouvrir la page» avec une URL similaire à celle-ci:

http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string

Pour résoudre ce problème, vous devrez mettre à jour quelques paramètres, y compris les paramètres de votre plug-in OAuth. Commencez par mettre à jour l’URL Jenkins (dans l’interface graphique Jenkins); Il peut être trouvé ici:

  • Jenkins → Gérer Jenkins → Configurer le système → Emplacement Jenkins *

Mettez à jour l’URL Jenkins pour qu’elle utilise HTTPS - + https: // +

image: https: //assets.digitalocean.com/articles/nginx_jenkins/2.jpg [URL Jenkins]

Ensuite, mettez à jour vos paramètres OAuth avec le fournisseur externe. Cet exemple est pour GitHub. Sur GitHub, vous pouvez le trouver sous * Paramètres → Applications → Applications pour développeurs *, sur le site GitHub.

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

image: https: //assets.digitalocean.com/articles/nginx_jenkins/3.jpg [Paramètres Jenkins sur GitHub; https: // a été utilisé avec les deux URL]

Conclusion

La seule chose qui reste à faire est de vérifier que tout fonctionne correctement. Comme mentionné ci-dessus, vous devriez maintenant être en mesure de naviguer vers votre URL nouvellement configurée - via HTTP ou HTTPS. Vous devez être redirigé vers le site sécurisé et voir certaines informations du site, notamment vos paramètres SSL récemment mis à jour. Comme indiqué précédemment, si vous n’utilisez pas de noms d’hôte via DNS, votre redirection risque de ne pas fonctionner correctement. Dans ce cas, vous devrez modifier la section dans le fichier de configuration Nginx.

Vous pouvez également utiliser votre navigateur pour examiner votre certificat. Vous devriez pouvoir cliquer sur le verrou pour consulter les propriétés du certificat à partir de votre navigateur.