A estratégia de segurança open source da Astral
(astral.sh)- A Astral, que desenvolve ferramentas como Ruff, uv e ty, usadas por desenvolvedores no mundo todo, mantém a segurança e a confiabilidade de todos os seus produtos como valor central
- Em resposta ao recente aumento de ataques à cadeia de suprimentos, a empresa divulgou técnicas internas para reforçar a segurança em todo o processo de build, distribuição e release
- Em pipelines de CI/CD baseados em GitHub Actions, aplica um sistema de proteção em múltiplas camadas, incluindo fixação por hash, privilégio mínimo e segregação de segredos
- Na etapa de release, garante a integridade da distribuição com Trusted Publishing, Sigstore attestations e Immutable Releases
- Com essa abordagem, a Astral busca elevar o nível de segurança de todo o ecossistema open source e construir um sistema de defesa sustentável
Abordagem de segurança open source da Astral
- A Astral desenvolve ferramentas como Ruff, uv e ty, usadas por milhões de desenvolvedores no mundo todo, e mantém a segurança e a confiabilidade dessas ferramentas como valor central
- Com o aumento recente de ataques à cadeia de suprimentos, incluindo casos como os hacks de Trivy e LiteLLM, a Astral divulgou técnicas internas de segurança para garantir a proteção de suas ferramentas e de seus processos de build e distribuição
- Também compartilha boas práticas de segurança que podem servir de referência para usuários, mantenedores de open source e desenvolvedores de sistemas CI/CD
Segurança em CI/CD
- A Astral automatiza desenvolvimento e distribuição por meio de amplos workflows de CI/CD baseados em GitHub Actions, usando-os como componente central de segurança
- Isso garante que builds e testes sejam executados em um ambiente controlado e observável, e não em ambientes locais
- Reconhecendo que as configurações padrão de segurança do GitHub Actions são frágeis, a empresa adota as seguintes medidas de reforço
- proibição total de triggers perigosos como
pull_request_targeteworkflow_run - fixação de todas as actions em um hash de commit específico (SHA), com validação cruzada para verificar a presença de impostor commits
- uso conjunto das ferramentas de auditoria
unpinned-useseimpostor-commitdo zizmor, além de políticas do GitHub - fixação por hash de todo o grafo de dependências, incluindo actions indiretas em que a fixação por hash não é possível diretamente
- proibição total de triggers perigosos como
- Como apenas fixar hashes não é suficiente, a Astral também faz revisão manual para detectar falhas de imutabilidade e, quando necessário, trabalha com projetos upstream para corrigi-las
- Exemplo: mapear URLs de download de binários e seus hashes para embuti-los em estado imutável
- As permissões dos workflows são limitadas por padrão a somente leitura, e cada job recebe apenas os privilégios mínimos necessários
- GitHub Secrets são gerenciados como variáveis de ambiente de deploy separadas por ambiente, impedindo que tarefas de teste e lint acessem segredos de release
- Como ferramentas auxiliares, a Astral usa zizmor (análise estática) e pinact (fixação automática por hash)
Segurança de repositório e organização
- Dentro da organização Astral, o número de contas com privilégios de administrador é minimizado, e a maioria dos membros tem apenas permissões de leitura e escrita nos repositórios de que realmente precisa
- Todos os membros são obrigados a usar autenticação forte em dois fatores (2FA), com no mínimo métodos no nível de TOTP
- Se o GitHub passar a permitir apenas métodos resistentes a phishing (WebAuthn, Passkeys), a migração será imediata
- Regras de proteção de branch são aplicadas em toda a organização
- a branch
mainnão permite force push, e toda mudança só pode entrar via PR - é proibida a criação de certos padrões de branch, como
advisory-*einternal-*
- a branch
- Regras de proteção de tags garantem que tags só possam ser criadas após a conclusão bem-sucedida da distribuição de uma release
- modificação e exclusão de tags são proibidas, e releases só podem ocorrer a partir da branch
main
- modificação e exclusão de tags são proibidas, e releases só podem ocorrer a partir da branch
- Nem administradores do repositório podem contornar as regras de proteção; toda proteção é imposta no nível da organização
- A Astral publicou esse conjunto de regras em um gist, para que outros projetos possam usá-lo como referência
Automação
- Com GitHub Actions, não é possível executar com segurança certas tarefas, como deixar comentários em PRs de terceiros
- Para isso, a Astral usa o GitHub App astral-sh-bot para tratar eventos com segurança fora do Actions
- O GitHub App recebe os mesmos dados de evento, mas executa em um ambiente onde código e dados ficam separados
- Ainda assim, o App não elimina credenciais sensíveis
- Vulnerabilidades como SQLi e prompt injection ainda podem existir, portanto ele deve ser desenvolvido com o mesmo nível de segurança exigido de um software comum
- Usar um App não significa, por si só, garantia de segurança na execução de código não confiável
- A abordagem com GitHub App é vantajosa em segurança, mas aumenta a complexidade
- é necessário desenvolver e hospedar o App, o que pode ser um peso para desenvolvedores individuais ou projetos pequenos
- o framework Gidgethub para Python simplifica o desenvolvimento
- A Astral pretende publicar o astral-sh-bot como open source e recomenda como referência o tutorial da Mariatta
Segurança de release
- As ferramentas da Astral são distribuídas por vários canais além do GitHub, como PyPI, Homebrew e imagens Docker
- Para evitar ataques à cadeia de suprimentos, a empresa adota as seguintes medidas
- uso de Trusted Publishing para eliminar credenciais de registries
- geração de attestations com base em Sigstore para garantir a vinculação criptográfica entre artefatos de build e workflows
- uso do recurso Immutable Releases do GitHub para impedir alterações após a publicação
- não utilização de cache de build, bloqueando ataques por contaminação de cache
- isolamento do processo de release em um deployment environment dedicado
- exigência de aprovação de outros membros da equipe para ativar o ambiente de release, evitando releases maliciosas por comprometimento de uma única conta
- manutenção de aprovações em múltiplas etapas com o ambiente
release-gatee encaminhamento de aprovação baseado em GitHub App - tags só podem ser criadas após o sucesso da release
- o instalador standalone verifica a integridade dos binários com checksums embutidos
- após a release, atualização de documentação, manifests de versão e hooks do pre-commit são feitas com uma conta de bot dedicada e PATs granulares
- no futuro, está prevista a adição de assinatura de código para macOS e Windows
Segurança de dependências
- A Astral usa Dependabot e Renovate para gerenciar atualizações de dependências e alertas de vulnerabilidade
- Um período de cooldown é aplicado para adiar atualizações logo após novos releases, reduzindo o risco de ataques temporários à cadeia de suprimentos
- o Renovate oferece suporte a configuração de cooldown por grupo, e essa flexibilização é aplicada às dependências próprias
- A empresa mantém colaboração contínua e contribuições de segurança com projetos upstream importantes
- Exemplo: contribuição para reforçar a segurança de CI/CD em apache/opendal-reqsign
- Também coopera com a Python Packaging Authority e a Python Security Response Team para compartilhar informações de segurança
- A inclusão de novas dependências é analisada com cautela, e há esforço para remover dependências desnecessárias
- em especial, evita dependências que incluam blobs binários e desativa funcionalidades desnecessárias
- Por meio do OSS Fund, fornece apoio financeiro a projetos open source essenciais
Conclusão e principais lições
- A segurança em open source é uma combinação de problemas técnicos e sociais e exige resposta contínua
- Princípios principais enfatizados pela Astral
- reconhecer os limites do CI/CD e, quando inevitável, usar abordagens externas e isoladas, como GitHub Apps
- eliminar e minimizar credenciais de longo prazo, usando Trusted Publishing e autenticação OIDC
- fortalecer o processo de release, com regras de aprovação, tags, branches e Immutable Releases
- manter consciência sobre dependências, reforçando também a segurança de projetos upstream por meio de ferramentas e colaboração
- A Astral continuará avaliando e aprimorando essas técnicas, com a intenção de evoluir suas defesas conforme muda o comportamento dos atacantes
Resumo das notas
- A PEP 740 do PyPI permite upload de attestations, mas no momento ainda não é compatível com a implementação de Trusted Publishing da Astral, por isso sua adoção está em espera
- Embora checksums no script de instalação tenham efeito limitado quando executados diretamente com
curl ... | bash, eles ainda são úteis ao fazer vendoring dentro de CI/CD
1 comentários
Opiniões no Hacker News
Parece que há etapas demais para usar o CI do GitHub com segurança
Com uma estrutura assim, acho impossível operar de forma segura do ponto de vista de segurança
Dá a sensação de que não dá para construir segurança de cadeia de suprimentos sobre um sistema que nem segue princípios básicos como separação de privilégios ou isolamento
Mas a configuração é tão delicada que não parece uma abordagem escalável. Se os padrões fossem mais seguros, isso já ajudaria muito
Depois de ler tudo, fiquei pensando se essa complexidade talvez seja um problema inerente dessa área
A maioria não oferece suporte a releases imutáveis e, mesmo quando oferece, a estrutura de puxar automaticamente versões novas continua vulnerável a ataques
Para ser realmente seguro, seria preciso gerenciar dependências verificadas em versões fixas num registry próprio, mas isso é algo que só uma empresa como o Google consegue fazer
O binário uv do stagex que nossa equipe criou é o único no mundo construído com bootstrap completo a partir do código-fonte e artefatos determinísticos com múltiplas assinaturas
Ele usa um sistema de assinaturas com smartcard ligado a uma rede de confiança de 25 anos e mais de 5.000 chaves
Mesmo assim, é frustrante ver voluntários levando esse tipo de segurança de cadeia de suprimentos mais a sério
Mesmo que ferramentas como OpenClaw façam vazar chaves e segredos, os usuários continuam usando
Você tenta reduzir a superfície de ataque, mas o mercado está ampliando ela
Sem voluntários, projetos como o Debian também não existiriam. Em vez de reclamar, é melhor competir com resultados melhores
No fim, se você está fornecendo artefatos construídos por terceiros, não está claro qual é o modelo de ameaça
Todos os builds do uv saem de resolução travada e fornecem artefatos assinados. O valor de commits assinados por outro conjunto de identidades não é claro
Não há motivo para a OpenAI gastar dinheiro reforçando a segurança da cadeia de suprimentos
Entendo a crítica técnica, mas pela linha do tempo acho forçado jogar isso nas costas da OpenAI
Para referência, o Trusted Publishing do PyPI foi implementado em conjunto por William Woodruff e a equipe da Trail of Bits
Queria perguntar à equipe da Astral como ela lida com uma dependência tão grande do próprio GitHub, mesmo com todo esse esforço
Como vocês responderiam se o GitHub fosse comprometido ou se uma configuração mudasse por causa de um bug?
O ecossistema open source é resiliente, mas ainda faltam soluções de sandbox para código de terceiros
Sempre que uso o uv, destacam como é fácil gerenciar várias versões de Python, mas isso também significa que ele é executado na máquina host sem isolamento, o que me deixa desconfortável
Um grande problema atual da cadeia de suprimentos é que muitas ferramentas e dependências são baixadas sem verificação de procedência
Por isso estou desenvolvendo o asfaload, uma solução open source de autenticação de arquivos com multissig
É uma estrutura que pode evitar incidentes como o do axios
Mesmo fixando o GitHub Actions por commit SHA, ainda há risco se a action puxar outras dependências
A solução de verdade é posse direta do código no pipeline de CI, ou então fazer fork e manter internamente
Auditamos todas as actions e, se houver dependências mutáveis, nós as corrigimos ou substituímos (sou da Astral)
Gerenciar toda a stack por conta própria é o mais seguro, mas não é realista
Fixar por hash é um reforço de segurança que quase sai de graça
No fim, o importante é ter clareza sobre até onde vai sua confiança
Vendo os casos recentes do Trivy e do litellm, fica claro que um guia de segurança para processos de release é realmente necessário
O conselho deste texto é prático e pode ser aplicado imediatamente
No fundo, a segurança da cadeia de suprimentos depende de quão seguras são as configurações padrão das plataformas das quais dependemos
Excelente visão geral. Parece que pode servir como material de referência útil para outros projetos open source
Eu mantenho o
repomatic, uma CLI em Python e ferramenta de workflow reutilizávelEla já inclui por padrão a maior parte das práticas de segurança citadas neste texto
O objetivo é criar um ambiente em que segurança seja o padrão
Depois de ler o texto, adicionei uma verificação de política de aprovação de PRs de forks
Mais detalhes no repositório no GitHub