Como configurar o Nginx com SSL como um proxy reverso para o Jenkins

Introdução

Por padrão, o Jenkins vem com seu próprio servidor web integrado, que escuta na porta 8080. Isso é conveniente se você executar uma instância privada do Jenkins ou se precisar colocar algo rapidamente e não se preocupar com a segurança. No entanto, uma vez que você tenha dados de produção reais sendo enviados para seu host, é uma boa ideia usar um servidor web mais seguro, como o Nginx, para lidar com o tráfego.

Este post detalhará como proteger seu site com SSL usando o servidor web Nginx como um proxy reverso para sua instância do Jenkins. Este tutorial pressupõe alguma familiaridade com comandos Linux, uma instalação funcional do Jenkins e uma instalação do Ubuntu 20.04.

Você pode instalar o Jenkins posteriormente neste tutorial, se ainda não o tiver instalado.

Pré-requisitos

Este guia pressupõe que você está utilizando o Ubuntu 20.04. Antes de começar, você deve ter uma conta de usuário não root configurada com privilégios sudo em seu sistema. Você pode aprender como fazer isso seguindo o tutorial de configuração inicial do servidor Ubuntu 20.04. Você também precisará do servidor Nginx instalado e hospedando seu domínio. Você pode aprender como fazer isso com o Tutorial de Instalação do Nginx no Ubuntu 20.04.

Além disso, ter sua instância do Jenkins protegida por SSL é muito importante. Se estiver visível na internet, você pode protegê-lo com o Let’s Encrypt. Você pode aprender como fazer isso com o Como Segurar o Nginx com Let’s Encrypt no Ubuntu 22.04 tutorial.
Como mencionado anteriormente, este tutorial pressupõe que o Jenkins já está instalado. Este tutorial irá mostrar como instalar o Jenkins, se necessário. Você provavelmente precisará alternar para o usuário root para esse artigo.

Passo 1 — Configurar o Nginx

O Nginx tornou-se um servidor web favorito nos últimos anos por sua velocidade e flexibilidade, o que o torna uma escolha ideal para nossa aplicação.

Editar a Configuração

Em seguida, você precisará editar o arquivo de configuração padrão do Nginx. O exemplo a seguir usa nano.

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

Aqui está como a configuração final pode parecer; as seções estão quebradas e brevemente explicadas abaixo. Você pode atualizar ou substituir o arquivo de configuração existente, embora possa querer fazer uma cópia de backup primeiro.

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

Você precisará atualizar as linhas server_name e proxy_redirect com o seu próprio nome de domínio. Também há um pouco de mágica adicional do Nginx acontecendo, que indica para as solicitações serem lidas pelo Nginx e reescritas no lado da resposta para garantir que o proxy reverso esteja funcionando.

Salve e feche o arquivo. Se você usou nano, pode fazer isso pressionando Ctrl + X, Y, e então Enter.

A primeira seção diz ao servidor Nginx para escutar quaisquer solicitações que cheguem na porta 80 (HTTP padrão) e redirecioná-las para HTTPS.

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

Depois disso, ocorre o processo de proxy. Basicamente, ele pega qualquer solicitação de entrada e as encaminha para a instância do Jenkins que está vinculada/ouvindo na porta 8080 na interface de rede local.

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

Observação: Se você deseja aprender mais sobre o processo de proxy no Nginx, este tutorial tem algumas boas informações sobre as configurações de proxy do 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.

Portanto, se você encontrar esse erro, verifique novamente suas configurações de proxy_pass e proxy_redirect no arquivo de configuração do Nginx!

Passo 2 — Configurar o Jenkins

Para que o Jenkins funcione com o Nginx, precisamos atualizar a configuração do Jenkins para ouvir apenas no endereço localhost em vez de todos (0.0.0.0), para garantir que o tráfego seja tratado corretamente. Este é um passo de segurança importante, pois se o Jenkins ainda estiver ouvindo em todos os endereços, ele ainda poderá ser acessível potencialmente através de sua porta original (8080). Vamos modificar o arquivo de configuração /etc/default/jenkins para fazer esses ajustes.

  1. sudo nano /etc/default/jenkins

Localize a linha JENKINS\_ARGS e atualize para ficar como o seguinte:

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

Observe que a configuração –httpListenAddress=127.0.0.1 deve ser adicionada ou modificada.

Em seguida, reinicie o Jenkins e o Nginx.

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

Agora você deverá ser capaz de visitar seu domínio usando HTTPS, e o site do Jenkins será servido de forma segura.

Opcional — Atualizar URLs de OAuth

Se você estiver utilizando o GitHub ou outro plugin OAuth para autenticação, provavelmente estará quebrado neste ponto. Por exemplo, ao tentar visitar a URL, você receberá um “Falha ao abrir a página” com uma URL semelhante a http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string.

Para corrigir isso, será necessário atualizar algumas configurações dentro do Jenkins, incluindo suas configurações de plugin OAuth. Primeiro, atualize a URL do Jenkins na interface gráfica do Jenkins; ela pode ser encontrada no menu Jenkins -> Gerenciar Jenkins -> Configurar Sistema -> Localização do Jenkins.

Atualize a URL do Jenkins para usar HTTPS – https://jenkins.domain.com/

Em seguida, atualize suas configurações OAuth com o provedor externo. Este exemplo é para o GitHub. No GitHub, isso pode ser encontrado em Configurações -> Aplicativos -> Aplicativos de Desenvolvedor, no site do GitHub.

Deve haver uma entrada para o Jenkins. Atualize a URL da Página Inicial e URL de Autorização de Retorno para refletir as configurações HTTPS. Pode parecer semelhante ao seguinte:

Conclusão

A única coisa que resta a fazer é verificar se tudo funcionou corretamente. Como mencionado anteriormente, você deve agora conseguir acessar a sua nova URL configurada – jenkins.domain.com – tanto via HTTP quanto via HTTPS. Você deverá ser redirecionado para o site seguro e deverá ver algumas informações do site, incluindo as suas configurações SSL atualizadas. Como mencionado anteriormente, se você não estiver usando nomes de host via DNS, então o seu redirecionamento pode não funcionar como desejado. Nesse caso, será necessário modificar a seção proxy_pass no arquivo de configuração do Nginx.

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