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 apenas colocar algo rapidamente e não se importar com a segurança. No entanto, uma vez que você tenha dados de produção reais indo 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 envolver seu site com SSL usando o servidor web Nginx como um proxy reverso para sua instância do Jenkins. Este tutorial assume 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á usando o Ubuntu 20.04. Antes de começar, você deve ter uma conta de usuário não root com privilégios sudo
configurados 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 Proteger o Nginx com Let’s Encrypt no Tutorial do Ubuntu 22.04.
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 se tornou um servidor web favorito por sua velocidade e flexibilidade nos últimos anos, 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 divididas e brevemente explicadas abaixo. Você pode atualizar ou substituir o arquivo de configuração existente, embora seja recomendável fazer uma cópia de backup primeiro.
Você precisará atualizar as linhas server_name e proxy_redirect
com seu próprio nome de domínio. Também há algum tipo de magia adicional do Nginx que diz 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 o nano
, pode fazer isso pressionando Ctrl + X
, Y
, e depois Enter
.
A primeira seção indica ao servidor Nginx para escutar todas as solicitações que chegam na porta 80 (HTTP padrão) e redirecioná-las para HTTPS.
Depois disso, ocorre a proxyficação. Basicamente, ela pega todas as solicitações recebidas 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 a proxyficação no Nginx, este tutorial tem algumas informações úteis 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, porque se o Jenkins ainda estiver ouvindo em todos os endereços, ainda poderá ser acessível 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ê deve conseguir visitar seu domínio usando HTTPS, e o site do Jenkins será servido com segurança.
Opcional — Atualizar URLs do OAuth
Se estiver a utilizar o GitHub ou outro plugin OAuth para autenticação, provavelmente estará com problemas neste momento. Por exemplo, ao tentar visitar o URL, irá obter um “Falha ao abrir página” com um URL semelhante a http://jenkins.domain.com:8080/securityRealm/finishLogin?code=random-string
.
Para resolver isso, será necessário atualizar algumas configurações dentro do Jenkins, incluindo as configurações do plugin OAuth. Primeiro, atualize o URL do Jenkins na interface gráfica do Jenkins; pode ser encontrado no menu Jenkins -> Gerenciar Jenkins -> Configurar Sistema -> Localização do Jenkins.
Atualize o URL do Jenkins para usar HTTPS – https://jenkins.domain.com/
Em seguida, atualize as configurações do 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.
Deverá existir uma entrada para o Jenkins. Atualize o URL da Página Inicial e URL de Callback de Autorização para refletir as configurações de HTTPS. Pode parecer semelhante ao seguinte:
Conclusão
A única coisa que resta fazer é verificar se tudo funcionou corretamente. Como mencionado acima, agora você deve conseguir navegar até o seu URL recém-configurado – jenkins.domain.com – tanto via HTTP quanto HTTPS. Você deverá ser redirecionado para o site seguro e deverá ver algumas informações do site, incluindo suas configurações SSL recém-atualizadas. Como observado anteriormente, se você não estiver usando nomes de host via DNS, então seu redirecionamento pode não funcionar conforme desejado. Nesse caso, será necessário modificar a seção proxy_pass no arquivo de configuração do Nginx.