Melhores Práticas para Gerenciamento Seguro de Credenciais no Jenkins
Armazene segredos do Jenkins com segurança usando o Plugin de Credenciais, escopo de pasta, withCredentials, RBAC, rotação e cofres externos.
Melhores Práticas para Gerenciamento Seguro de Credenciais no Jenkins
Os jobs do Jenkins frequentemente precisam de segredos próximos à produção: tokens de nuvem, senhas de registro, chaves de deploy, certificados de assinatura e credenciais de API. Se esses segredos acabarem em um Jenkinsfile, log de console ou parâmetro de job, seu sistema CI/CD se torna um caminho direto para comprometimento.
Use o Plugin de Credenciais, mantenha as credenciais com escopo restrito e injete-as apenas na etapa que precisa delas.
A Base: O Plugin de Credenciais do Jenkins
O Plugin de Credenciais é o mecanismo padrão que o Jenkins usa para armazenar dados sensíveis. Ele fornece um repositório centralizado e criptografado para credenciais, garantindo que os segredos nunca sejam expostos em logs de build, controle de versão ou arquivos de configuração.
Quando o Jenkins armazena credenciais, ele as criptografa usando material de chave no controlador Jenkins, incluindo arquivos em JENKINS_HOME/secrets. Qualquer pessoa com amplo acesso ao sistema de arquivos do controlador e à configuração do Jenkins pode potencialmente recuperar segredos, portanto, o acesso ao sistema de arquivos e do administrador deve ser rigorosamente controlado.
Tipos Chave de Credenciais
Entender os tipos de credenciais disponíveis é o primeiro passo para uma implementação segura. Escolha o tipo que mapeia com mais precisão para o segredo que está sendo armazenado:
- Texto Secreto: Usado para valores de texto genéricos e curtos, como tokens de API, chaves de acesso, tokens OAuth ou segredos de webhook.
- Nome de Usuário e Senha: Combinação padrão usada para autenticação em serviços como repositórios Maven, registros privados (Docker Hub, Artifactory) ou aplicações internas.
- Nome de Usuário SSH com Chave Privada: Essencial para acessar agentes remotos, clonar repositórios Git privados ou executar comandos em infraestrutura remota. A chave privada pode ser inserida diretamente, fornecida como um caminho ou gerenciada pelo controlador Jenkins.
- Arquivo Secreto: Usado para enviar arquivos inteiros que são sensíveis, como keystores, certificados (
.pem,.crt) ou arquivos de configuração contendo segredos.
Dica: Sempre use o tipo de credencial mais granular possível. Por exemplo, se você só precisa de uma chave de API, use Texto Secreto em vez de tentar encaixá-la em um campo de Nome de Usuário e Senha.
Princípio do Menor Privilégio: Escopo de Credenciais
O escopo da credencial determina onde ela é acessível dentro do ambiente Jenkins. Aplicar o princípio do menor privilégio—concedendo apenas o acesso necessário para o trabalho—é crucial.
1. Escopo do Sistema
Credenciais com escopo de sistema (armazenadas em Gerenciar Jenkins > Gerenciar Credenciais > Jenkins) estão disponíveis globalmente para todos os jobs, pastas e pipelines na instância Jenkins.
- Uso: Use o escopo de Sistema apenas para segredos necessários para toda a operação do Jenkins, como credenciais usadas por plugins de configuração global ou segredos necessários para todas as conexões de agente.
- Aviso: Minimize o uso do escopo de Sistema. Qualquer job comprometido pode potencialmente acessar todos os segredos globalmente disponíveis.
2. Escopo de Pasta
Credenciais com escopo de pasta são definidas dentro de uma pasta específica (criada usando o plugin Folder ou através de pastas de Organização). Esses segredos são visíveis e utilizáveis apenas por jobs que residem dentro dessa pasta e suas subpastas.
- Recomendação: Sempre prefira o escopo de Pasta. Isso compartimentaliza o acesso e limita o raio de explosão se um projeto for comprometido.
Injeção Segura em Pipelines Declarativos
Não codifique credenciais em scripts de pipeline. Variáveis de ambiente são aceitáveis apenas quando o Jenkins as injeta para um bloco restrito e mascara valores de segredos conhecidos nos logs.
O método seguro para acessar credenciais em um Pipeline Declarativo é usar a etapa withCredentials embutida. Esta etapa carrega a credencial especificada em uma variável de ambiente com escopo que está disponível apenas durante a execução do bloco.
Exemplo 1: Injetando Texto Secreto (Token de API)
Este exemplo recupera com segurança uma credencial de Texto Secreto (MY_API_TOKEN) e atribui seu valor à variável interna SECRET_TOKEN. Assim que o bloco withCredentials termina, SECRET_TOKEN é automaticamente removido do ambiente.
pipeline {
agent any
stages {
stage('Deploy via API') {
steps {
script {
withCredentials([string(credentialsId: 'MY_API_TOKEN', variable: 'SECRET_TOKEN')]) {
sh "echo 'Chamando API externa...'"
sh '''
curl -X POST \
-H "Authorization: Bearer $SECRET_TOKEN" \
https://api.minhaempresa.com/deploy
'''
}
}
}
}
}
}
Exemplo 2: Injetando Nome de Usuário e Senha
Ao usar credenciais de Nome de Usuário e Senha, a etapa withCredentials divide o segredo em duas variáveis: uma para o nome de usuário e outra para a senha, tipicamente sufixadas por _USR e _PSW (ou nomes personalizados).
pipeline {
agent any
stages {
stage('Login no Registro') {
steps {
withCredentials([usernamePassword(credentialsId: 'DOCKER_REGISTRY_CRED', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
sh '''
printf '%s' "$DOCKER_PASS" | docker login \
--username "$DOCKER_USER" \
--password-stdin meu.registro.com
'''
}
}
}
}
}
Aviso de Segurança: Supressão de Log
O Jenkins tenta mascarar valores de credenciais conhecidos nos logs de build, mas a máscara não substitui scripts cuidadosos. Não imprima segredos, passe senhas em linhas de comando ou execute rastreamento de shell (
set -x) ao redor do uso de segredos.
Integração Avançada de Segurança
Para ambientes de alta segurança, confiar apenas na chave mestre local do Jenkins é frequentemente insuficiente. Integrar com um sistema de gerenciamento de segredos externo fornece separação de responsabilidades, auditoria centralizada e capacidades de criptografia aprimoradas.
Armazenamentos de Credenciais Externos
Integrações populares incluem:
- HashiCorp Vault: Usando o Plugin Vault, o Jenkins pode solicitar dinamicamente segredos do Vault em tempo de execução. Isso significa que os segredos nunca são armazenados permanentemente no controlador Jenkins, apenas temporariamente na memória durante a fase de execução.
- AWS Secrets Manager/Azure Key Vault: Plugins nativos da nuvem permitem que pipelines recuperem segredos diretamente desses serviços usando funções IAM ou entidades de serviço, minimizando a exposição de credenciais estáticas.
Usar armazenamentos externos está alinhado com as melhores práticas de segurança ao:
- Separar o Armazenamento: A infraestrutura de segredos é desacoplada do servidor CI/CD.
- Acesso Dinâmico: Os segredos podem ser rotacionados frequentemente sem exigir atualizações manuais de configuração do Jenkins.
- Auditoria Aprimorada: Todas as tentativas de acesso a segredos são registradas dentro do sistema de cofre externo.
Controle de Acesso Baseado em Funções (RBAC)
Implementar um plugin RBAC (como Estratégia de Autorização Baseada em Funções) permite que administradores controlem não apenas quem pode executar um job, mas também quem pode configurar e visualizar credenciais específicas.
- Restrinja as permissões de configuração de job para que apenas usuários confiáveis possam vincular credenciais em pipelines.
- Restrinja a capacidade de modificar ou criar credenciais de nível de Sistema a um pequeno grupo de administradores de segurança ou plataforma.
Melhores Práticas de Gerenciamento de Credenciais
| Prática | Descrição | Benefício de Segurança |
|---|---|---|
| Usar Escopo de Pasta | Limite o acesso a credenciais aos jobs/pastas específicos que precisam delas. | Limita a exposição e o raio de explosão. |
| Evitar Codificação | Nunca coloque segredos em Jenkinsfile, scripts de build ou controle de versão. |
Elimina vulnerabilidade no código-fonte. |
Usar withCredentials |
Injete segredos com segurança nas etapas do pipeline usando a API oficial do Jenkins. | Garante a ocultação automática de logs e a limpeza do ambiente. |
| Integrar Cofre Externo | Use Vault, AWS Secrets Manager ou Azure Key Vault para implantações empresariais. | Desacopla o armazenamento e permite rotação dinâmica. |
| Aplicar RBAC | Use plugins de autorização para restringir quem pode configurar, visualizar e usar credenciais. | Reforça o princípio do menor privilégio entre os usuários. |
| Rotação Regular | Rotacione chaves de API e senhas regularmente (idealmente automatizado via um cofre externo). | Minimiza a janela de tempo para que segredos comprometidos sejam explorados. |
| Controlador Seguro | Garanta permissões estritas de sistema de arquivos no controlador Jenkins para proteger master.key. |
Protege o mecanismo central de criptografia. |
Trate as credenciais do Jenkins como segredos de produção. Escolha-as com escopo restrito, vincule-as brevemente, rotacione-as regularmente e mantenha o acesso ao controlador limitado a pessoas autorizadas a recuperar esses segredos.