Pular para o conteúdo
Categoria: Hardening11 min de leitura

Endurecer pipelines CI/CD contra comprometimento

Compartilhar

Por Lucas Andrade ·

Guia defensivo para proteger CI/CD: a superficie de ataque, como ocorre o comprometimento, sinais de deteccao e uma lista de endurecimento.

Neste artigo

Um pipeline de integracao e entrega continua e um dos sistemas mais poderosos de qualquer organizacao de engenharia. Ele guarda credenciais de producao, pode enviar codigo para milhoes de usuarios e roda em grande parte sem supervisao. Essa combinacao o torna um alvo primario: comprometa o pipeline uma vez e voce herda o alcance dele. Este artigo e para defensores, engenheiros de plataforma e responsaveis por releases. Ele explica por que CI/CD e um alvo de tao alto valor, como um comprometimento tende a se desenrolar em nivel conceitual e — o grosso do texto — os sinais de deteccao e controles de endurecimento que mantem confiavel o seu caminho de build e deploy. O enquadramento e defensivo em todo momento: entender o risco para fecha-lo, nao para explora-lo.

Por que CI/CD e um alvo de alto valor

Um pipeline concentra privilegios de uma forma que poucos outros sistemas igualam. Ele normalmente guarda credenciais de implantacao, papeis de nuvem, tokens de registro de pacotes, chaves de assinatura e acesso a fonte da verdade do seu codigo. Ele tambem executa codigo arbitrario por design: cada build executa o que o repositorio manda. Um atacante que influencia o que roda, ou que rouba o que o pipeline pode alcancar, obtem um caminho direto para a producao que contorna muitos dos controles que protegem a propria aplicacao. Pior, as mudancas introduzidas pelo build sao confiadas pelos consumidores posteriores: um artefato adulterado e assinado, publicado e implantado com a propria reputacao da organizacao por tras. Essa e a essencia de um risco de cadeia de suprimentos, e por isso a seguranca do pipeline merece o mesmo rigor que o acesso a producao.

Como um comprometimento de pipeline tende a se desenrolar

Em alto nivel, os defensores devem entender um punhado de caminhos recorrentes para poder instrumentar contra eles. Um caminho e a mudanca maliciosa ou comprometida: um atacante que obtem acesso de commit, ou que passa uma mudanca pela revisao, altera a definicao de build para exfiltrar segredos ou injetar codigo. Um segundo e a dependencia envenenada: um pacote que o build incorpora tem um backdoor a montante ou via typosquatting, e roda com os privilegios do pipeline. Um terceiro e o segredo exposto: um token de vida longa commitado no repositorio, impresso em um log ou legivel por um build de pull request de um fork nao confiavel. Um quarto e o runner comprometido: uma maquina de build compartilhada ou auto-hospedada que retem estado entre jobs, permitindo que um job adultere o proximo. Conhecer essas formas diz exatamente onde colocar controles e telemetria.

A superficie de ataque do pipeline

Mapeie a superficie antes de defende-la. Ela abrange o sistema de controle de codigo-fonte (protecoes de branch, quem pode fazer push e merge, quem pode alterar arquivos de fluxo de trabalho), a configuracao de CI em si (que e codigo e deve ser revisada como codigo), os runners de build (hospedados ou auto-hospedados, efemeros ou persistentes), os segredos e credenciais que o pipeline pode ler, as dependencias e imagens base puxadas em tempo de build, o registro de artefatos onde as saidas sao armazenadas e o alvo de implantacao que o pipeline pode alcancar. Acoes, plugins e orbs de terceiros tambem fazem parte dessa superficie, porque executam dentro do seu build com os seus privilegios. Cada um desses e um lugar onde a confianca pode estar mal depositada, e cada um merece um controle explicito em vez de uma suposicao implicita de seguranca.

Proteger a fonte e o processo de mudanca

O pipeline e tao confiavel quanto o codigo que ele constroi, entao comece no repositorio. Imponha protecao de branch nos branches de release: exija pull requests, ao menos uma revisao independente e verificacoes de status aprovadas antes do merge, sem pushes diretos e sem force-push. Exija commits assinados ou autoria verificada para que a identidade nao possa ser forjada. Trate os arquivos de configuracao de CI como codigo protegido: uma mudanca em um fluxo de trabalho deve exigir a mesma revisao que uma mudanca na logica de producao, porque pode fazer mais. Restrinja quem pode modificar as definicoes do pipeline e quem pode aprovar implantacoes, e separe essas funcoes onde puder. Por fim, proteja as proprias contas com autenticacao multifator forte e metodos resistentes a phishing, porque uma sessao de mantenedor roubada e uma rota direta para o build.

Proteger segredos e credenciais

Segredos sao o premio, entao minimize tanto o numero quanto o poder deles. Prefira credenciais de identidade de carga de trabalho de vida curta — federacao OpenID Connect do pipeline para o seu provedor de nuvem — em vez de chaves estaticas de vida longa, para que nao haja um segredo duradouro a roubar. Limite cada credencial ao menor privilegio e ao recurso mais estreito de que precisa, e nunca conceda a um build amplos direitos administrativos 'por seguranca'. Armazene qualquer segredo restante em um cofre gerenciado e injete-o em tempo de execucao; nunca o commite e configure a plataforma para mascarar segredos nos logs de modo que um echo descuidado nao possa vaza-los. Fundamental: nao exponha segredos de implantacao a builds acionados por pull requests de forks, que executam codigo nao confiavel. Rotacione as credenciais de forma programada e imediatamente a qualquer suspeita, e registre cada acesso a segredo para poder auditar quem leu o que.

Endurecer e isolar os runners de build

Runners executam codigo nao confiavel por padrao, entao isole-os como tal. Prefira runners efemeros criados do zero para cada job e destruidos depois, sem deixar estado que um job passe para o proximo. Se voce precisar usar runners auto-hospedados, mantenha-os fora de qualquer caminho de rede para sistemas sensiveis, execute-os como usuarios sem privilegios em containers ou maquinas virtuais isolados, e nunca compartilhe um runner auto-hospedado persistente entre cargas de trabalho confiaveis e nao confiaveis: o pull request de um fork publico nao deve aterrissar na mesma maquina que guarda credenciais de producao. Fixe a imagem do runner e aplique patches continuamente. Restrinja o acesso de rede de saida para que um build comprometido nao possa exfiltrar dados livremente, e desative os recursos que nao sao necessarios. O objetivo e que ate um job totalmente hostil nao ganhe nada duradouro nem alcance nada sensivel.

Cadeia de suprimentos: dependencias e integridade de artefatos

A maior parte do que um build executa e codigo que voce nao escreveu. Defenda essa fronteira deliberadamente. Fixe as dependencias em versoes exatas com um arquivo de bloqueio e verifique os hashes de integridade, para que uma troca a montante nao possa mudar em silencio o que voce compila. Puxe as acoes de CI de terceiros por digest de commit imutavel em vez de uma tag mutavel, ja que uma tag pode ser reapontada para codigo malicioso. Escaneie as dependencias em busca de vulnerabilidades conhecidas e de mudancas suspeitas, e mantenha uma lista de permissoes de fontes confiaveis quando for pratico. Do lado da saida, gere uma lista de materiais de software para saber exatamente o que foi enviado, e assine seus artefatos e imagens de container para que sistemas posteriores possam verificar integridade e procedencia antes de implantar. Mire na atestacao de procedencia — um registro verificavel de como e a partir de que um artefato foi construido — para que uma saida adulterada falhe na verificacao em vez de ser enviada.

Deteccao — sinais e telemetria

O endurecimento reduz as chances; a deteccao pega o que escapa. Envie os logs de build, os eventos de auditoria dos runners e os logs de auditoria do controle de codigo-fonte para o seu SIEM e observe sinais especificos. Do lado da fonte: mudancas em arquivos de fluxo de trabalho protegidos, segredos de pipeline novos ou modificados, chaves de deploy adicionadas, protecao de branch desativada e pushes fora do horario normal ou de identidades desconhecidas. Do lado do build: conexoes de rede de saida inesperadas de um runner, um job que le segredos de que nunca precisou antes, ferramentas ou pacotes novos buscados em tempo de build e duracao ou uso de recursos anomalos. Do lado da saida: um artefato publicado sem um registro de procedencia assinado correspondente, ou uma implantacao que nao se originou de uma execucao de pipeline aprovada. Trate a desativacao de um controle de seguranca — um scan, uma verificacao obrigatoria, o encaminhamento de logs — como um alerta de alta severidade, ja que atacantes rotineiramente desligam o que os pegaria.

Armadilhas comuns

As equipes minam bons pipelines de formas familiares. As credenciais de pipeline superprivilegiadas sao as mais comuns: um unico token amplo usado em todo lugar transforma qualquer pequeno comprometimento em um total. Confiar em referencias mutaveis — tags flutuantes em acoes e imagens base — permite que atacantes mudem seu build sem tocar no seu repositorio. Executar pull requests de forks com segredos entrega suas chaves a codigo nao confiavel. Os runners compartilhados persistentes deixam um job envenenar outro. Ignorar a configuracao de CI como codigo significa que mudancas de fluxo de trabalho sao enviadas sem revisao. E registrar segredos — por saida de depuracao ou tratamento de erros verboso — vaza em silencio credenciais para lugares que muitas pessoas podem ler. Cada um desses e um padrao conveniente que troca muita seguranca por pouca conveniencia, e cada um tem uma alternativa mais segura e simples.

Lista de verificacao de endurecimento

Use isto como linha de base. Fonte: protecao de branch com revisao obrigatoria, arquivos de fluxo de trabalho protegidos, commits assinados e MFA forte em todas as contas de mantenedores. Segredos: credenciais OIDC de vida curta em vez de chaves estaticas, escopo de menor privilegio, armazenamento em cofre, mascaramento de logs, sem segredos em builds de forks e rotacao programada. Runners: efemeros por padrao, sem privilegios e isolados, nunca compartilhados atraves de fronteiras de confianca, com patches e imagem fixada, com saida restrita. Cadeia de suprimentos: dependencias fixadas com verificacao de hash, acoes fixadas por digest, escaneamento de vulnerabilidades, uma lista de materiais por build e artefatos assinados com procedencia. Deteccao: encaminhe todos os logs de auditoria de pipeline e de fonte, alerte sobre mudancas de controle e comportamento de build anomalo, e exija procedencia assinada antes do deploy. Processo: separe as funcoes de commitar, aprovar e implantar, e revise esses controles apos cada mudanca significativa do pipeline.

Perguntas frequentes

Runners hospedados sao mais seguros que auto-hospedados? Muitas vezes sim, porque runners hospedados costumam ser efemeros e gerenciados pelo provedor, o que remove o fardo do estado persistente e dos patches. Runners auto-hospedados podem ser protegidos, mas exigem isolamento disciplinado, efemeridade e segmentacao de rede, e nunca devem ser compartilhados entre cargas de trabalho confiaveis e nao confiaveis. Escolha auto-hospedado apenas quando tiver uma necessidade real e a maturidade operacional para opera-los com seguranca.

Por que fixar as acoes de CI por digest de commit em vez de uma tag de versao? Porque uma tag e mutavel: quem controla a acao pode reapontar a mesma tag para codigo novo, possivelmente malicioso, e seu build o puxaria em silencio. Um digest de commit imutavel nomeia conteudo exato que nao pode mudar sem que voce saiba, de modo que um comprometimento a montante nao pode alterar o que seu pipeline executa sem uma mudanca visivel e revisavel do seu lado.

Conclusao

Seu pipeline CI/CD fica no centro de uma grande quantidade de confianca: ele pode alcancar a producao, guarda credenciais poderosas e suas saidas sao acreditadas por todos os consumidores posteriores. Defende-lo nao e um controle, mas uma postura em camadas: proteja a fonte e o processo de mudanca, minimize e encurte a vida dos segredos, isole os runners para que nenhum job possa prejudicar o proximo, verifique tudo o que o build incorpora, assine e ateste tudo o que ele produz, e instrumente todo o caminho para que a adulteracao apareca na sua telemetria. Nenhum desses passos e exotico, e cada um fecha um caminho que intrusoes reais ja usaram. Trate o pipeline como infraestrutura de producao, cobre dele o mesmo padrao, e voce negara aos atacantes um dos pontos de apoio mais poderosos de uma organizacao de software moderna.

Compartilhar

Compartilhar

Leituras relacionadas

Nenhum comentário ainda

Seja o primeiro a comentar.

Deixe seu comentário

Entre com sua conta Canverly para comentar. Você pode usar a mesma conta em qualquer site da rede.

Entrar com Canverly