Come Configurare Nginx con SSL come Proxy Inverso per Jenkins

Introduzione

Di default, Jenkins viene fornito con il suo proprio server web integrato, che ascolta sulla porta 8080. Questo è conveniente se si esegue un’istanza privata di Jenkins, o se è necessario mettere qualcosa in piedi rapidamente e non si preoccupa della sicurezza. Tuttavia, una volta che hai dati di produzione reali che vanno al tuo host, è una buona idea utilizzare un server web più sicuro come Nginx per gestire il traffico.

Questo post dettaglierà come avvolgere il tuo sito con SSL utilizzando il server web Nginx come proxy inverso per la tua istanza Jenkins. Questo tutorial presume una certa familiarità con i comandi Linux, un’installazione funzionante di Jenkins e un’installazione di Ubuntu 20.04.

È possibile installare Jenkins successivamente in questo tutorial, se non lo si ha ancora installato.

Prerequisiti

Questa guida assume che tu stia utilizzando Ubuntu 20.04. Prima di iniziare, dovresti avere un account utente non root con privilegi sudo configurato sul tuo sistema. Puoi imparare come fare seguendo il tutorial di configurazione iniziale del server Ubuntu 20.04. Avrai anche bisogno del server Nginx installato e che ospita il tuo dominio. Puoi imparare come fare con il Tutorial su come installare Nginx su Ubuntu 20.04.

Inoltre, è molto importante assicurarsi che la tua istanza Jenkins sia protetta da SSL. Se è visibile su Internet, puoi proteggerla con Let’s Encrypt. Puoi imparare come fare con il Tutorial su come proteggere Nginx con Let’s Encrypt su Ubuntu 22.04.
Come già detto in precedenza, questo tutorial assume che Jenkins sia già installato. Questo tutorial ti mostrerà come installare Jenkins se necessario. Probabilmente dovrai passare all’utente root per quell’articolo.

Passaggio 1 — Configura Nginx

Nginx è diventato un server web preferito per la sua velocità e flessibilità negli ultimi anni, il che lo rende una scelta ideale per la nostra applicazione.

Modifica la configurazione

Dovrai quindi modificare il file di configurazione predefinito di Nginx. L’esempio seguente utilizza nano.

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

Ecco come potrebbe apparire la configurazione finale; le sezioni sono suddivise e brevemente spiegate di seguito. Puoi aggiornare o sostituire il file di configurazione esistente, anche se potresti voler fare prima una copia di backup.

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

Dovrai aggiornare le righe server_name e proxy_redirect con il tuo nome di dominio. C’è anche un po’ di magia aggiuntiva di Nginx che indica alle richieste di essere lette da Nginx e riscritte sul lato della risposta per garantire che il proxy inverso stia funzionando.

Salva e chiudi il file. Se hai usato nano, puoi farlo premendo Ctrl + X, Y, e poi Invio.

La prima sezione dice al server Nginx di ascoltare qualsiasi richiesta in ingresso sulla porta 80 (HTTP predefinito) e reindirizzarle a HTTPS.

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

Dopo di ciò, avviene il proxying. Fondamentalmente prende qualsiasi richiesta in ingresso e la inoltra all’istanza di Jenkins che è legata/ascolta sulla porta 8080 sull’interfaccia di rete 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;
}
...

Nota: Se desideri saperne di più sul proxying in Nginx, questo tutorial contiene alcune buone informazioni sulle impostazioni di proxy di 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.

Quindi, se visualizzi questo errore, controlla nuovamente le impostazioni di proxy_pass e proxy_redirect nella configurazione di Nginx!

Passo 2 — Configura Jenkins

Per far funzionare Jenkins con Nginx, è necessario aggiornare la configurazione di Jenkins in modo che ascolti solo sull’indirizzo localhost invece di tutti (0.0.0.0), per garantire che il traffico venga gestito correttamente. Questo è un passaggio di sicurezza importante perché se Jenkins continua ad ascoltare su tutti gli indirizzi, potrebbe ancora essere accessibile attraverso la sua porta originale (8080). Modificheremo il file di configurazione /etc/default/jenkins per apportare queste modifiche.

  1. sudo nano /etc/default/jenkins

Trova la linea JENKINS\_ARGS e aggiornala in modo che assomigli a quanto segue:

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

Nota che l’impostazione –httpListenAddress=127.0.0.1 deve essere aggiunta o modificata.

Successivamente, riavvia Jenkins e Nginx.

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

Ora dovresti essere in grado di visitare il tuo dominio utilizzando HTTPS e il sito di Jenkins sarà servito in modo sicuro.

Opzionale — Aggiorna gli URL OAuth

Se stai utilizzando GitHub o un altro plugin OAuth per l’autenticazione, probabilmente sarà interrotto in questo momento. Ad esempio, quando si tenta di visitare l’URL, si otterrà un “Impossibile aprire la pagina” con un URL simile a http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string.

Per risolvere questo problema, sarà necessario aggiornare alcune impostazioni all’interno di Jenkins, comprese le impostazioni del plugin OAuth. In primo luogo, aggiorna l’URL di Jenkins nell’interfaccia grafica di Jenkins; può essere trovato nel menu Jenkins -> Gestione Jenkins -> Configura sistema -> Posizione di Jenkins.

Aggiorna l’URL di Jenkins per utilizzare HTTPS – https://jenkins.domain.com/

Successivamente, aggiorna le impostazioni OAuth con il provider esterno. Questo esempio è per GitHub. Su GitHub, questo può essere trovato sotto Impostazioni -> Applicazioni -> Applicazioni sviluppatore, sul sito di GitHub.

Dovrebbe esserci una voce per Jenkins. Aggiorna l’URL della homepage e l’URL di richiamo dell’autorizzazione per riflettere le impostazioni HTTPS. Potrebbe assomigliare a quanto segue:

Conclusione

L’unica cosa che rimane da fare è verificare che tutto sia stato configurato correttamente. Come già menzionato, ora dovresti essere in grado di navigare verso il tuo URL appena configurato – jenkins.domain.com – sia tramite HTTP che HTTPS. Dovresti essere reindirizzato al sito sicuro e dovresti vedere alcune informazioni sul sito, inclusa la tua configurazione SSL appena aggiornata. Come già notato in precedenza, se non stai utilizzando nomi host tramite DNS, il tuo reindirizzamento potrebbe non funzionare come desiderato. In tal caso, dovrai modificare la sezione proxy_pass nel file di configurazione di Nginx.

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