Protegendo Seu Servidor Jenkins: Melhores Práticas Essenciais
Fortaleça o Jenkins com acesso de privilégio mínimo, HTTPS, higiene de plugins, pipelines seguros, controles de credenciais e monitoramento.
Protegendo Seu Servidor Jenkins: Práticas Essenciais Recomendadas
Proteger seu servidor Jenkins é importante porque ele pode acessar seu código-fonte, destinos de implantação, credenciais e artefatos de build. Se o Jenkins estiver exposto ou mal configurado, um invasor pode ler repositórios, alterar builds, roubar segredos ou usar agentes de build como um caminho para sua rede.
As configurações mais seguras do Jenkins usam camadas: identidade forte, permissões de privilégio mínimo, acesso criptografado, gerenciamento cuidadoso de plugins, padrões seguros de pipeline e logs de auditoria úteis. Comece com os controles abaixo antes de expor o Jenkins a uma equipe maior ou conectá-lo a sistemas de produção.
Gerenciamento de Usuários e Controle de Acesso
Um gerenciamento robusto de usuários é a primeira linha de defesa. O Jenkins permite um controle refinado sobre o que os usuários podem ver e fazer. Implementar o princípio do privilégio mínimo garante que usuários e serviços tenham apenas as permissões necessárias para realizar suas tarefas, minimizando os danos potenciais de contas comprometidas.
Autenticação
O Jenkins pode se integrar a vários sistemas de autenticação. Para ambientes de equipe, use autenticação centralizada em vez de depender apenas do banco de dados interno de usuários do Jenkins.
- Integração LDAP ou Active Directory: Use seus grupos de diretório existentes e controles de ciclo de vida de contas.
- SAML ou OpenID Connect: Use login único através do seu provedor de identidade quando seu conjunto de plugins do Jenkins suportar.
- Contas locais: Mantenha uma conta de administrador de emergência cuidadosamente protegida, mas não torne contas locais compartilhadas seu modelo de acesso normal.
Estratégias de Autorização
Uma vez que os usuários são autenticados, a autorização determina seus níveis de acesso.
- Segurança Baseada em Matriz: Esta estratégia integrada permite atribuir permissões a usuários ou grupos. Funciona bem para configurações pequenas, mas pode se tornar difícil de auditar à medida que as equipes crescem.
- Estratégia Baseada em Funções: O plugin Role-Based Authorization Strategy permite definir funções como
Desenvolvedor,OperadoreAdmin, e então mapear usuários ou grupos para essas funções.
Exemplo: Configurando Autorização Baseada em Funções
- Instale o plugin Role-Based Authorization Strategy no gerenciador de plugins do Jenkins.
- Vá para
Gerenciar Jenkins>Segurança. - Em
Autorização, selecioneEstratégia Baseada em Funções. - Defina funções como
desenvolvedor,gerente-de-releaseejenkins-admin. - Dê a cada função apenas as permissões necessárias, como
Job/Ler,Job/ConstruirouCredenciais/Visualizar. - Atribua grupos de diretório a funções em vez de pessoas individuais, quando possível.
Protegendo a Comunicação do Jenkins
Garantir que os dados transmitidos para e do seu servidor Jenkins sejam criptografados é crucial, especialmente ao lidar com credenciais e informações sensíveis de build.
Configuração HTTPS
Configure o Jenkins para usar HTTPS para criptografar toda a comunicação entre clientes e o servidor. Isso impede espionagem e ataques man-in-the-middle.
O padrão de produção mais comum é colocar o Jenkins atrás de um proxy reverso como Nginx, Apache, HAProxy ou um balanceador de carga em nuvem. Termine o TLS no proxy, redirecione HTTP para HTTPS e defina a URL pública do Jenkins em Gerenciar Jenkins > Sistema.
Se você executar o servidor web integrado do Jenkins com HTTPS diretamente, configure-o através das opções de inicialização do Jenkins, como --httpsPort, --httpsKeyStore e --httpsKeyStorePassword, ou através da configuração de serviço específica do pacote. O arquivo exato difere conforme o método de instalação, então verifique como seu serviço Jenkins é iniciado antes de alterá-lo.
Certifique-se também de que o proxy reverso envia os cabeçalhos encaminhados corretos. Cabeçalhos de proxy quebrados podem causar URLs de redirecionamento incorretas, verificações CSRF falhas ou links que apontam de volta para HTTP simples.
Segurança do Jenkins e Plugins
A extensibilidade do Jenkins através de plugins é um de seus maiores pontos fortes, mas também introduz riscos potenciais de segurança se não for gerenciada com cuidado.
Mantenha o Jenkins e os Plugins Atualizados
Versões desatualizadas do núcleo do Jenkins e de seus plugins são uma fonte comum de vulnerabilidades. Atualize regularmente ambos para corrigir falhas de segurança conhecidas.
- Atualizações do núcleo do Jenkins: Siga os avisos de segurança do Jenkins e planeje janelas de manutenção regulares.
- Atualizações de plugins: Revise as notificações de atualização com frequência. Teste atualizações críticas de plugins em um controlador que não seja de produção, quando possível.
Lista de Permissões e Auditoria de Plugins
Nem todos os plugins são criados iguais. Alguns plugins podem ter vulnerabilidades de segurança ou não serem mantidos.
- Use plugins confiáveis: Prefira plugins mantidos do centro de atualizações do Jenkins.
- Limite a instalação de plugins: Cada plugin adiciona código que é executado dentro do seu controlador.
- Remova plugins não utilizados: Audite plugins trimestralmente ou após grandes mudanças de processo.
Gerenciando Avisos de Segurança de Plugins
O Jenkins pode avisá-lo sobre plugins instalados com avisos de segurança conhecidos. Preste muita atenção aos avisos em Gerenciar Jenkins e atualize, substitua ou remova os plugins afetados.
Segurança do Jenkinsfile
Os Jenkinsfiles definem seus pipelines de build. Protegê-los é crítico para evitar injeção de código malicioso em seu processo de build.
- Armazene Jenkinsfiles no controle de versão: Revise as mudanças no pipeline da mesma forma que você revisa o código da aplicação.
- Trate o código do pipeline como código executável: Um Jenkinsfile pode executar comandos shell, publicar artefatos e solicitar credenciais.
- Tenha cuidado com a aprovação de scripts: O plugin Script Security pode exigir que administradores aprovem certos métodos ou scripts Groovy. Aprove apenas código que você entende.
- Evite scripts de pipeline inline na interface do usuário: Prefira
Jenkinsfiles armazenados em repositórios com revisão de código.
Exemplo: Aprovando Scripts
Quando um pipeline encontra uma assinatura Groovy não aprovada, o Jenkins a lista em Gerenciar Jenkins > Aprovação de Script In-Process. Revise a assinatura solicitada e o trabalho que a acionou antes de aprovar. Uma aprovação ampla pode afetar mais de um trabalho.
Gerenciamento de Credenciais do Jenkins
O Jenkins frequentemente precisa armazenar credenciais sensíveis como chaves de API, senhas e chaves SSH para acessar outros serviços. Gerenciá-las de forma segura é crucial.
- Use o armazenamento de credenciais do Jenkins: Armazene tokens de API, senhas, certificados e chaves SSH como credenciais, não como texto simples nas definições de trabalho.
- Evite segredos codificados: Não coloque segredos em
Jenkinsfiles, scripts shell, logs de build ou variáveis de repositório. - Escopo restrito das credenciais: Use pastas e permissões para manter as credenciais de produção longe de trabalhos que não precisam delas.
- Rotacione credenciais: Rotacione chaves de implantação e tokens de serviço quando pessoas saem, trabalhos são excluídos ou um segredo pode ter aparecido em logs.
Exemplo: Usando Credenciais em um Pipeline
pipeline {
agent any
stages {
stage('Implantar') {
steps {
withCredentials([sshUserPrivateKey(credentialsId: 'chave-deploy-prod', keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER')]) {
sh 'ssh -i "$SSH_KEY" -o IdentitiesOnly=yes "[email protected]" "comando_deploy"'
}
}
}
}
}
Neste exemplo, chave-deploy-prod é o ID de uma credencial de chave privada SSH armazenada. O Jenkins escreve a chave em um arquivo temporário durante a duração da etapa e mascara valores de segredo suportados nos logs.
Segurança de Rede e Controle de Acesso
Além da segurança interna do Jenkins, proteger o servidor no nível de rede é essencial.
- Regras de firewall: Restrinja o acesso ao Jenkins a redes confiáveis, intervalos de VPN ou pontos de entrada de proxy com reconhecimento de identidade.
- Controles de proxy reverso: Use um proxy reverso para TLS, redirecionamentos HTTP para HTTPS, limites de requisição e cabeçalhos consistentes.
- Isolamento de agentes: Não execute builds não confiáveis no controlador. Use agentes descartáveis ou estritamente controlados para cargas de trabalho arriscadas.
- Segmentação de rede: Mantenha o Jenkins longe do amplo acesso à rede interna, a menos que um trabalho realmente precise.
Auditoria e Monitoramento
Revisar regularmente os logs do Jenkins e monitorar a atividade pode ajudar a detectar e responder a incidentes de segurança.
- Ative o log de auditoria: Registre logins, mudanças de permissão, alterações de credenciais, edições de trabalho e ações administrativas. Plugins como Audit Trail podem ajudar.
- Monitore os logs do Jenkins: Revise os logs do controlador e os logs de build para uso inesperado de credenciais, novas contas de administrador, edições incomuns de trabalho ou logins repetidos com falha.
- Faça backup da configuração: Faça backup do home do Jenkins, configuração de trabalho, listas de plugins e metadados de credenciais de acordo com seu plano de recuperação. Proteja os backups como segredos de produção.
Mantenha o Jenkins Monótono
O objetivo é um servidor Jenkins onde o acesso é previsível, as mudanças são revisadas, os plugins são conhecidos e as credenciais não vazam para trabalhos ou logs. Comece com SSO, funções de privilégio mínimo, HTTPS, atualizações de plugins e uso seguro de credenciais. Em seguida, agende revisões regulares para que a exceção temporária de ontem não se torne o incidente de amanhã.