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