<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged pipeline</title>
<link>https://coderlegion.com/tag/pipeline</link>
<description>Powered by Question2Answer</description>
<item>
<title>Segurança em CI/CD: a importância de estudar, auditar e aprender com pipelines de bons projetos</title>
<link>https://coderlegion.com/33090/seguranca-em-ci-cd-importancia-de-estudar-auditar-aprender-com-pipelines-de-bons-projetos</link>
<description>&lt;p&gt;Pipelines de CI/CD são frequentemente tratados como simples mecanismos de automação: executam testes, compilam aplicações, geram artefatos e realizam deploys. Entretanto, eles também representam uma das superfícies de ataque mais importantes de um ambiente de desenvolvimento moderno.&lt;/p&gt;
&lt;p&gt;Um pipeline possui acesso a repositórios, tokens, credenciais, registries, ambientes de produção, dependências externas e, em muitos casos, permissões para modificar recursos de infraestrutura. Isso significa que uma falha na configuração de um workflow pode ultrapassar os limites do processo de build e comprometer toda a cadeia de entrega de software.&lt;/p&gt;
&lt;p&gt;Por esse motivo, estudar a segurança de pipelines deve fazer parte da rotina de engenharia, assim como revisar código, analisar dependências e avaliar configurações de infraestrutura.&lt;/p&gt;
&lt;p&gt;Mais importante do que simplesmente executar ferramentas de análise é compreender por que determinada configuração representa um risco, em quais condições ela pode ser explorada e quais mecanismos realmente mitigam esse risco.&lt;/p&gt;
&lt;h3 id=&quot;1-por-que-estudar-pipelines-t-o-importante-&quot;&gt;1. Por que estudar pipelines é tão importante?&lt;/h3&gt;
&lt;p&gt;Um pipeline inseguro pode transformar uma alteração aparentemente simples em um vetor de comprometimento.&lt;/p&gt;
&lt;p&gt;Considere alguns exemplos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um Pull Request pode introduzir código executado em um runner que possui acesso a credenciais.&lt;/li&gt;
&lt;li&gt;Uma interpolação insegura de contextos do GitHub pode permitir injeção de comandos no shell.&lt;/li&gt;
&lt;li&gt;Uma dependência comprometida pode executar código durante a instalação.&lt;/li&gt;
&lt;li&gt;Um token com permissões excessivas pode permitir alterações não autorizadas no repositório.&lt;/li&gt;
&lt;li&gt;Uma publicação sem mecanismos adequados de autorização pode disponibilizar uma versão não aprovada de um pacote.&lt;/li&gt;
&lt;li&gt;Um workflow mal configurado pode executar código de terceiros com privilégios superiores aos necessários.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esses cenários demonstram que o pipeline não é apenas uma ferramenta operacional. Ele faz parte da infraestrutura de segurança da organização.&lt;/p&gt;
&lt;p&gt;A segurança precisa considerar todo o ciclo de execução: desde o evento que dispara o workflow até as permissões disponíveis, dependências instaladas, artefatos produzidos e operações realizadas.&lt;/p&gt;
&lt;h3 id=&quot;2-utilize-scanners-mas-n-o-terceirize-o-julgamento-t-cnico&quot;&gt;2. Utilize scanners, mas não terceirize o julgamento técnico&lt;/h3&gt;
&lt;p&gt;Existem ferramentas especializadas em identificar configurações inseguras em workflows.&lt;/p&gt;
&lt;p&gt;Algumas opções relevantes que eu utilizo no dia a dia para scans do pipeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;zizmor:&lt;/strong&gt; analisa workflows do GitHub Actions e identifica problemas como template injection, permissões inadequadas, uso inseguro de eventos e instalações de dependências fora de manifests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Checkov:&lt;/strong&gt; realiza análise estática de configurações de infraestrutura como código e também identifica problemas em configurações de CI/CD.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;actionlint:&lt;/strong&gt; valida a sintaxe, expressões, referências e possíveis problemas estruturais em workflows do GitHub Actions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenSSF Scorecard:&lt;/strong&gt; avalia práticas de segurança de projetos e repositórios, incluindo dependências, permissões, manutenção e configuração de workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trivy:&lt;/strong&gt; além de analisar imagens e dependências, consegue avaliar configurações e arquivos de infraestrutura.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Essas ferramentas são importantes porque automatizam a identificação de padrões conhecidos de risco.&lt;/p&gt;
&lt;p&gt;Entretanto, existe uma diferença fundamental entre encontrar uma configuração potencialmente insegura e demonstrar que ela é explorável.&lt;/p&gt;
&lt;p&gt;Um scanner identifica padrões. O engenheiro precisa compreender o contexto.&lt;/p&gt;
&lt;h4 id=&quot;exemplo-template-injection&quot;&gt;Exemplo: template injection&lt;/h4&gt;
&lt;p&gt;Considere:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- name: Check changelog
  run: scripts/check-changelog-frozen.sh &quot;origin/${{ github.base_ref }}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O scanner pode identificar uma possível injeção de comandos porque o contexto é interpolado diretamente no código executado pelo shell.&lt;/p&gt;
&lt;p&gt;O risco existe porque o GitHub Actions realiza a expansão da expressão antes de executar o script.&lt;/p&gt;
&lt;p&gt;Entretanto, é necessário entender a origem do dado.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;github.base_ref&lt;/code&gt; representa a branch de destino do Pull Request, enquanto &lt;code&gt;github.head_ref&lt;/code&gt; representa a branch de origem.&lt;/p&gt;
&lt;p&gt;Um colaborador externo normalmente controla o nome da própria branch, mas não controla livremente a branch de destino.&lt;/p&gt;
&lt;p&gt;Portanto, embora exista um padrão vulnerável, a explorabilidade depende das permissões e das condições do workflow.&lt;/p&gt;
&lt;p&gt;A correção recomendada é transportar o valor por uma variável de ambiente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- name: Check changelog
  env:
    BASE_REF: ${{ github.base_ref }}
  run: scripts/check-changelog-frozen.sh &quot;origin/$BASE_REF&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O valor passa a ser tratado como dado, em vez de ser inserido diretamente no código interpretado pelo shell.&lt;/p&gt;
&lt;p&gt;Esse exemplo demonstra por que é necessário estudar os findings: o scanner identifica corretamente o padrão, mas a análise de impacto exige conhecimento sobre os contextos do GitHub Actions.&lt;/p&gt;
&lt;h3 id=&quot;3-aprenda-a-diferenciar-vulnerabilidades-reais-de-findings-parcialmente-mitigados&quot;&gt;3. Aprenda a diferenciar vulnerabilidades reais de findings parcialmente mitigados&lt;/h3&gt;
&lt;p&gt;Nem todo alerta representa uma vulnerabilidade diretamente explorável.&lt;/p&gt;
&lt;p&gt;Um exemplo interessante é a instalação de dependências durante o pipeline.&lt;/p&gt;
&lt;p&gt;Considere:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;env:
  CLAUDE_CODE_VERSION: &quot;2.1.296&quot;
  CODEX_VERSION: &quot;0.162.1&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;E posteriormente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;- name: Install CLIs
  run: |
    npm install --global \
      &quot;@anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}&quot; \
      &quot;@openai/codex@${CODEX_VERSION}&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um scanner como o zizmor pode identificar o padrão &lt;code&gt;adhoc-packages&lt;/code&gt;, pois os pacotes são instalados globalmente sem um manifesto e lockfile controlando a instalação.&lt;/p&gt;
&lt;p&gt;Entretanto, existe uma particularidade: as versões principais já estão explicitamente fixadas.&lt;/p&gt;
&lt;p&gt;Isso significa que o workflow não está simplesmente instalando a última versão disponível a cada execução.&lt;/p&gt;
&lt;p&gt;Ainda existe uma fragilidade: a árvore completa de dependências não está necessariamente reproduzível, pois as dependências transitivas não são controladas por um lockfile versionado.&lt;/p&gt;
&lt;p&gt;É importante distinguir:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Versão principal fixada: controla qual versão direta será solicitada.&lt;/li&gt;
&lt;li&gt;Manifesto: declara as dependências do projeto.&lt;/li&gt;
&lt;li&gt;Lockfile: registra a resolução das dependências e suas integridades.&lt;/li&gt;
&lt;li&gt;Instalação reproduzível: utiliza a resolução registrada para reconstruir o ambiente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A ausência de lockfile continua sendo um finding válido, mas não significa automaticamente que existe uma instalação de versão flutuante ou que um pacote esteja comprometido.&lt;/p&gt;
&lt;p&gt;O objetivo da análise não é eliminar alertas indiscriminadamente, mas determinar quais riscos permanecem e quais controles já existem.&lt;/p&gt;
&lt;h3 id=&quot;4-estude-como-projetos-maduros-resolvem-problemas-de-seguran-a&quot;&gt;4. Estude como projetos maduros resolvem problemas de segurança&lt;/h3&gt;
&lt;p&gt;Uma das formas mais eficientes de evoluir na segurança de pipelines é estudar workflows de projetos open source bem mantidos.&lt;/p&gt;
&lt;p&gt;Em vez de começar sempre do zero, investigue como projetos com grande exposição pública estruturam seus processos de CI/CD.&lt;/p&gt;
&lt;p&gt;Alguns exemplos interessantes para estudo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes:&lt;/strong&gt; organização de workflows, testes, automação e governança de contribuições.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terraform:&lt;/strong&gt; validação, testes, releases e publicação de artefatos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trivy:&lt;/strong&gt; análise de segurança, integração de scanners e automação de releases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenTelemetry:&lt;/strong&gt; testes distribuídos, validação de componentes e publicação de versões.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;actions/checkout:&lt;/strong&gt; implementação e manutenção de GitHub Actions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sigstore:&lt;/strong&gt; assinatura, verificação e estabelecimento de confiança em artefatos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ao estudar esses projetos, não observe apenas quais actions são utilizadas. Investigue as decisões arquiteturais.&lt;/p&gt;
&lt;p&gt;Pergunte:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Como o workflow é disparado?&lt;/li&gt;
&lt;li&gt;Ele aceita Pull Requests de forks?&lt;/li&gt;
&lt;li&gt;Quais permissões são concedidas ao &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Existem secrets disponíveis durante a execução?&lt;/li&gt;
&lt;li&gt;Como as dependências são instaladas?&lt;/li&gt;
&lt;li&gt;As GitHub Actions são referenciadas por tags ou hashes SHA completos?&lt;/li&gt;
&lt;li&gt;Como os artefatos são assinados e verificados?&lt;/li&gt;
&lt;li&gt;Como as publicações são autorizadas?&lt;/li&gt;
&lt;li&gt;Existem ambientes protegidos e aprovações humanas?&lt;/li&gt;
&lt;li&gt;Como o projeto separa testes, validação e publicação?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;O objetivo é compreender o motivo de cada decisão, e não simplesmente copiar configurações.&lt;/p&gt;
&lt;p&gt;Uma configuração segura em determinado contexto pode ser inadequada em outro.&lt;/p&gt;
&lt;h3 id=&quot;5-construa-uma-rotina-de-auditoria-de-pipelines&quot;&gt;5. Construa uma rotina de auditoria de pipelines&lt;/h3&gt;
&lt;p&gt;A análise não deve acontecer somente quando um scanner encontra um problema.&lt;/p&gt;
&lt;p&gt;Uma rotina de auditoria pode ser incorporada ao próprio processo de engenharia.&lt;/p&gt;
&lt;p&gt;Uma abordagem prática:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Etapa 1 — Inventário&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mapear todos os workflows existentes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CI.&lt;/li&gt;
&lt;li&gt;CD.&lt;/li&gt;
&lt;li&gt;Release.&lt;/li&gt;
&lt;li&gt;Publicação de pacotes.&lt;/li&gt;
&lt;li&gt;Provisionamento de infraestrutura.&lt;/li&gt;
&lt;li&gt;Automação de dependências.&lt;/li&gt;
&lt;li&gt;Segurança e compliance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Etapa 2 — Análise automatizada&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Executar ferramentas como:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;zizmor .github/workflows
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;actionlint
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;checkov -d .github/workflows
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scorecard --repo=github.com/ORG/REPOSITORY
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Os comandos devem ser ajustados à versão e à forma de instalação de cada ferramenta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Etapa 3 — Investigação dos findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Para cada alerta:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Identificar o trecho responsável.&lt;/li&gt;
&lt;li&gt;Entender a regra acionada.&lt;/li&gt;
&lt;li&gt;Identificar a origem dos dados.&lt;/li&gt;
&lt;li&gt;Verificar se existe controle compensatório.&lt;/li&gt;
&lt;li&gt;Avaliar a possibilidade de exploração.&lt;/li&gt;
&lt;li&gt;Determinar o impacto potencial.&lt;/li&gt;
&lt;li&gt;Definir a correção ou justificar uma exceção.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Etapa 4 — Correção&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Priorizar problemas que permitam execução de código não confiável, exposição de credenciais, elevação de privilégios e comprometimento de releases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Etapa 5 — Prevenção&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Incorporar os scanners ao próprio CI para impedir que configurações inseguras sejam introduzidas novamente.&lt;/p&gt;
&lt;h3 id=&quot;6-crie-um-laborat-rio-utilizando-projetos-reais&quot;&gt;6. Crie um laboratório utilizando projetos reais&lt;/h3&gt;
&lt;p&gt;Uma estratégia especialmente interessante é escolher projetos open source e realizar auditorias independentes em seus workflows.&lt;/p&gt;
&lt;p&gt;Não é necessário encontrar uma vulnerabilidade para que o estudo seja útil.&lt;/p&gt;
&lt;p&gt;O exercício consiste em:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Selecionar um repositório ativo e bem mantido.&lt;/li&gt;
&lt;li&gt;Baixar ou clonar seus workflows.&lt;/li&gt;
&lt;li&gt;Executar os scanners.&lt;/li&gt;
&lt;li&gt;Investigar os findings.&lt;/li&gt;
&lt;li&gt;Consultar a documentação das regras acionadas.&lt;/li&gt;
&lt;li&gt;Comparar a implementação com as recomendações oficiais.&lt;/li&gt;
&lt;li&gt;Identificar controles compensatórios.&lt;/li&gt;
&lt;li&gt;Propor correções.&lt;/li&gt;
&lt;li&gt;Registrar os resultados em um pequeno relatório técnico.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;É possível inclusive comparar diferentes projetos para entender como cada equipe resolve o mesmo problema.&lt;/p&gt;
&lt;p&gt;Por exemplo: como diferentes projetos implementam Trusted Publishing, como controlam dependências de terceiros ou como protegem workflows executados por Pull Requests externos.&lt;/p&gt;
&lt;p&gt;Esse exercício desenvolve uma habilidade importante: sair da posição de alguém que apenas corrige alertas e passar a compreender a arquitetura de segurança do processo de entrega.&lt;/p&gt;
&lt;p&gt;Segurança de CI/CD exige conhecimento sobre GitHub Actions, shell, permissões, autenticação, dependências, infraestrutura e supply chain security.&lt;/p&gt;
&lt;p&gt;É justamente por isso que estudar workflows de projetos maduros é tão valioso: eles oferecem exemplos concretos de decisões de engenharia, problemas reais e estratégias de mitigação que podem ser adaptadas a outros ambientes.&lt;/p&gt;
&lt;h3 id=&quot;conclus-o&quot;&gt;Conclusão&lt;/h3&gt;
&lt;p&gt;Scanners são instrumentos de diagnóstico, não substitutos do conhecimento técnico.&lt;/p&gt;
&lt;p&gt;Executar um scanner e aplicar todas as correções sugeridas sem entender os findings pode gerar configurações desnecessárias, exceções mal justificadas e até novos problemas.&lt;/p&gt;
&lt;p&gt;O caminho mais consistente é combinar análise automatizada, estudo da documentação, investigação técnica e comparação com implementações de projetos reconhecidos.&lt;/p&gt;
&lt;p&gt;Estudar pipelines de bons projetos é uma forma de aprender com decisões de engenharia que já foram colocadas à prova.&lt;/p&gt;
&lt;p&gt;Afinal, um pipeline seguro não é aquele que simplesmente passa em todas as verificações. É aquele cuja arquitetura foi compreendida, cujos riscos são conhecidos e cujos mecanismos de proteção foram implementados de maneira consciente.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/33090/seguranca-em-ci-cd-importancia-de-estudar-auditar-aprender-com-pipelines-de-bons-projetos</guid>
<pubDate>Fri, 30 Oct 2026 12:10:32 +0000</pubDate>
</item>
</channel>
</rss>