O Que É Least Privilege?
Least privilege significa que um job de CI recebe exatamente as permissões de que precisa para fazer seu trabalho - e nada mais - para que um comprometimento tenha um raio de impacto pequeno.
Um pipeline que pode fazer qualquer coisa é um pipeline que, se comprometido, permite que um atacante faça qualquer coisa. O princípio do least privilege mantém as permissões de cada job mínimas e específicas, para que o dano de um token vazado ou de uma dependência maliciosa fique contido.
O princípio
Conceda o menor conjunto de permissões suficiente para a tarefa. Um job de teste raramente precisa de acesso de escrita a qualquer coisa; um job de deploy precisa fazer deploy de um serviço, não administrar a conta.
Aplicando no CI
- Reduza o escopo do token da plataforma - por exemplo
permissions: contents: readpor padrão, ampliando apenas onde necessário. - Dê às roles de OIDC uma política de confiança restrita e permissões de nuvem mínimas.
- Separe jobs de leitura de jobs de escrita para que a maior parte do pipeline não tenha acesso de escrita.
Um pequeno exemplo
Definir permissions: contents: read no nível do workflow torna o token padrão somente leitura. Um único job que precisa comentar em um PR adiciona pull-requests: write apenas para si mesmo - o resto do pipeline não consegue escrever nada.
Por que importa mais no CI
O CI executa código quase não confiável: actions de terceiros, dependências e pull requests. O least privilege assume que qualquer um deles pode ser hostil e garante que, mesmo assim, o job não consiga ir além de sua atribuição restrita.
Auditando privilégios
As permissões se acumulam com o tempo. Revise periodicamente o que cada workflow e role pode fazer e corte tudo o que não é usado - o acesso que um pipeline nunca exerce é puro prejuízo se ele um dia for comprometido.
Principais conclusões
- Least privilege dá a um job apenas as permissões de que ele precisa.
- Deixe os tokens como somente leitura por padrão e amplie de forma restrita onde necessário.
- Isso limita o raio de impacto de um token vazado ou de uma dependência hostil.