La stratégie de sécurité open source d’Astral
(astral.sh)- Astral, qui développe des outils comme Ruff, uv et ty utilisés par des développeurs du monde entier, fait de la sécurité et de la fiabilité de tous ses produits une valeur centrale
- Face à la récente hausse des attaques de la chaîne d’approvisionnement, l’entreprise a publié ses méthodes internes pour renforcer la sécurité sur l’ensemble du processus de build, de déploiement et de release
- Dans son CI/CD basé sur GitHub Actions, elle applique une protection multicouche avec épinglage par hash, privilèges minimaux et séparation des secrets
- Au stade de la release, elle garantit l’intégrité de la distribution avec Trusted Publishing, les attestations Sigstore et les Immutable Releases
- À travers cette approche, Astral vise à élever le niveau de sécurité de l’ensemble de l’écosystème open source et à construire un dispositif de défense durable
L’approche d’Astral en matière de sécurité open source
- Astral développe des outils comme Ruff, uv et ty, utilisés par des millions de développeurs dans le monde, et fait de leur sécurité et fiabilité une valeur fondamentale
- Alors que les attaques de la chaîne d’approvisionnement se multiplient, comme l’ont montré les piratages récents de Trivy et LiteLLM, Astral a publié ses techniques internes pour garantir la sécurité de ses outils ainsi que de ses processus de build et de déploiement
- L’entreprise partage ainsi des bonnes pratiques de sécurité utiles aux utilisateurs, aux mainteneurs open source et aux développeurs de systèmes CI/CD
Sécurité du CI/CD
- Astral automatise le développement et le déploiement via des workflows CI/CD étendus fondés sur GitHub Actions, qu’elle considère comme un composant clé de sa sécurité
- Les builds et les tests sont ainsi exécutés dans un environnement contrôlé et observable, et non en local
- Consciente que les paramètres de sécurité par défaut de GitHub Actions sont faibles, elle applique les renforcements suivants
- interdiction totale des triggers dangereux comme
pull_request_targetetworkflow_run - épinglage de toutes les actions sur un hash de commit (SHA) précis, avec vérification croisée pour détecter les impostor commits
- usage combiné de zizmor pour les audits
unpinned-usesetimpostor-commit, ainsi que des politiques GitHub - épinglage par hash de l’ensemble du graphe de dépendances, y compris les actions indirectes qu’il n’est pas possible d’épingler directement
- interdiction totale des triggers dangereux comme
- L’épinglage par hash ne suffisant pas à lui seul, Astral procède à des revues manuelles pour détecter les failles d’immuabilité et, si nécessaire, travaille avec les projets amont pour les corriger
- Exemple : mapper les URL de téléchargement de binaires à leurs hashes pour les intégrer de manière immuable
- Les permissions des workflows sont limitées en lecture seule par défaut, et seuls les privilèges minimaux nécessaires sont accordés à chaque job
- Les GitHub Secrets sont gérés comme des variables d’environnement de déploiement séparées par environnement, afin que les tâches de test et de lint n’aient pas accès aux secrets de release
- Comme outils auxiliaires, Astral utilise zizmor (analyse statique) et pinact (épinglage automatique par hash)
Sécurité des dépôts et de l’organisation
- Astral réduit au minimum le nombre de comptes disposant de privilèges administrateur dans l’organisation, et la plupart des membres n’ont des droits de lecture/écriture que sur les dépôts nécessaires
- Tous les membres doivent utiliser une authentification à deux facteurs (2FA) forte, avec au minimum un niveau TOTP
- Si GitHub n’autorise plus que les méthodes résistantes au phishing (WebAuthn, Passkeys), la transition sera immédiate
- Des règles de protection des branches sont appliquées à l’échelle de toute l’organisation
- sur la branche
main, les force push sont interdits et toutes les modifications doivent passer par des PR - la création de certains motifs de branches comme
advisory-*ouinternal-*est interdite
- sur la branche
- Des règles de protection des tags garantissent qu’un tag ne peut être créé qu’après le succès du déploiement d’une release
- modification et suppression des tags interdites, releases possibles uniquement depuis la branche
main
- modification et suppression des tags interdites, releases possibles uniquement depuis la branche
- Même les administrateurs des dépôts ne peuvent pas contourner les règles de protection : elles sont imposées au niveau de l’organisation
- Astral publie cet ensemble de règles sous forme de gist afin que d’autres projets puissent s’en inspirer
Automatisation
- Avec GitHub Actions, certaines tâches comme laisser un commentaire sur une PR tierce ne peuvent pas être effectuées en toute sécurité
- Pour cela, Astral utilise la GitHub App astral-sh-bot afin de traiter certains événements en dehors d’Actions, de manière sécurisée
- La GitHub App reçoit les mêmes données d’événement, mais s’exécute dans un environnement où le code et les données sont séparés
- Cela ne signifie pas pour autant que l’App supprime les identifiants sensibles
- Des vulnérabilités comme les SQLi ou les injections de prompt peuvent exister ; il faut donc la développer avec le même niveau d’exigence de sécurité qu’un logiciel classique
- L’usage d’une GitHub App ne signifie pas automatiquement que l’exécution de code non fiable est sûre
- L’approche par GitHub App est avantageuse sur le plan de la sécurité, mais elle accroît la complexité
- il faut développer et héberger l’App, ce qui peut représenter une charge pour les développeurs individuels ou les petits projets
- le framework Python Gidgethub simplifie ce développement
- Astral prévoit de publier astral-sh-bot en open source et recommande comme ressource la documentation de Mariatta
Sécurité des releases
- Les outils d’Astral sont distribués non seulement via GitHub, mais aussi sur PyPI, Homebrew et sous forme d’images Docker, entre autres canaux
- Pour prévenir les attaques de la chaîne d’approvisionnement, les mesures suivantes sont mises en œuvre
- utilisation de Trusted Publishing pour supprimer les identifiants de registre
- création d’attestations basées sur Sigstore afin de garantir le lien cryptographique entre les artefacts de build et les workflows
- recours à la fonction Immutable Releases de GitHub pour empêcher toute modification après publication
- désactivation du cache de build afin d’éviter les attaques par empoisonnement du cache
- isolement du processus de release dans un environnement de déploiement dédié
- activation de l’environnement de release soumise à l’approbation d’un autre membre de l’équipe, pour éviter qu’un seul compte compromis ne permette une release malveillante
- maintien d’une approbation à plusieurs niveaux avec l’environnement
release-gateet un relais d’approbation basé sur une GitHub App - les tags ne peuvent être créés qu’après le succès de la release
- le standalone installer vérifie l’intégrité des binaires grâce à des checksums intégrés
- après la release, les mises à jour de la documentation, des manifests de version et des hooks pre-commit sont effectuées via un compte bot dédié et des PAT finement cloisonnés
- ajout prévu à l’avenir de la signature de code pour macOS et Windows
Sécurité des dépendances
- Astral utilise Dependabot et Renovate pour gérer les mises à jour de dépendances et les alertes de vulnérabilité
- Une période de cooldown retarde les mises à jour juste après une nouvelle release afin de réduire le risque d’attaques temporaires sur la chaîne d’approvisionnement
- Renovate prend en charge des cooldowns par groupe, avec un assouplissement pour les dépendances internes
- Astral mène une collaboration continue et des contributions de sécurité auprès de projets amont importants
- Exemple : contribution au renforcement de la sécurité CI/CD de apache/opendal-reqsign
- L’entreprise collabore avec la Python Packaging Authority et la Python Security Response Team pour partager des informations de sécurité
- L’ajout de nouvelles dépendances est examiné avec prudence, avec un effort continu pour supprimer celles qui sont inutiles
- en particulier, évitement des dépendances contenant des blobs binaires et désactivation des fonctionnalités superflues
- Via l’OSS Fund, Astral apporte un soutien financier à des projets open source essentiels
Conclusion et enseignements clés
- La sécurité open source est un ensemble de problèmes à la fois techniques et sociaux, qui exige une réponse continue
- Principes clés mis en avant par Astral
- reconnaître les limites du CI/CD et, quand c’est inévitable, utiliser une isolation externe comme les GitHub Apps
- supprimer et minimiser les identifiants de longue durée, en s’appuyant sur Trusted Publishing et l’authentification OIDC
- renforcer le processus de release avec des règles d’approbation, de tags et de branches, ainsi qu’avec Immutable Releases
- garder une conscience active des dépendances et renforcer aussi la sécurité des projets amont grâce aux outils et à la coopération
- Astral continuera d’évaluer et d’améliorer ces techniques, avec une évolution de son dispositif de défense au rythme des changements dans les méthodes des attaquants
Résumé des notes
- La PEP 740 de PyPI autorise l’envoi d’attestations, mais elle n’est pas encore compatible avec l’implémentation actuelle de Trusted Publishing chez Astral, donc son adoption est en attente
- Les checksums dans les scripts d’installation ont une efficacité limitée lors d’une exécution directe via
curl ... | bash, mais ils sont utiles lorsqu’ils sont vendorisés dans un pipeline CI/CD
1 commentaires
Commentaires sur Hacker News
On a l'impression qu'il faut passer par beaucoup trop d'étapes pour utiliser le CI de GitHub en toute sécurité.
Avec une telle architecture, j'ai l'impression qu'il est impossible de l'exploiter de manière vraiment sûre du point de vue sécurité.
Construire la sécurité de la chaîne d'approvisionnement sur un système qui ne respecte même pas des principes de base comme la séparation des privilèges ou l'isolation semble voué à l'échec.
Mais la configuration est tellement délicate que ça ne ressemble pas à une approche scalable. Ce serait bien mieux si les valeurs par défaut étaient plus sûres.
Après avoir tout lu, je me dis que cette complexité est peut-être un problème intrinsèque à ce domaine.
La plupart ne prennent pas en charge les releases immuables, et même lorsqu'ils le font, ils récupèrent automatiquement les nouvelles versions, ce qui les rend vulnérables aux attaques.
Pour être vraiment sûr, il faudrait gérer dans son propre registre des dépendances vérifiées avec des versions figées, mais c'est le genre de chose que seul Google peut vraiment se permettre.
Le binaire uv de stagex que notre équipe a créé est le seul au monde à être construit avec un bootstrap intégral depuis les sources et des artefacts déterministes multi-signés.
Il utilise un système de signature sur carte à puce relié à un réseau de confiance vieux de 25 ans et à plus de 5 000 clés.
Ce qui est frustrant, c'est de voir que ce sont les bénévoles qui prennent la sécurité de la chaîne d'approvisionnement le plus au sérieux.
Même si des outils comme OpenClaw peuvent faire fuiter des clés et des secrets, les utilisateurs continuent de les utiliser.
Vous essayez de réduire la surface d'attaque, alors que le marché, lui, l'élargit.
Sans bénévoles, des projets comme Debian n'existeraient pas non plus. Il faut rivaliser avec de meilleurs résultats plutôt qu'avec des plaintes.
Si, au final, vous fournissez des artefacts construits par un tiers, il n'est pas clair quel est exactement le modèle de menace.
Tous les builds de uv proviennent d'une résolution verrouillée et fournissent des artefacts signés. La valeur de commits signés avec un autre ensemble d'identités n'est pas évidente.
OpenAI n'a aucune raison particulière de dépenser de l'argent pour renforcer la sécurité de la chaîne d'approvisionnement.
Je comprends les critiques techniques, mais à ce moment-là, il me semble excessif d'en faire porter la responsabilité à OpenAI.
À noter que le Trusted Publishing de PyPI a été mis en œuvre par William Woodruff avec l'équipe de Trail of Bits.
J'aimerais poser une question à l'équipe d'Astral. Comment gérez-vous le fait de dépendre aussi fortement de GitHub malgré tous ces efforts ?
Que faites-vous si GitHub est compromis ou si un bug modifie vos paramètres ?
L'écosystème open source est résilient, mais le sandboxing de code tiers reste insuffisant.
Chaque fois que j'utilise uv, on met en avant la facilité avec laquelle il permet de gérer plusieurs versions de Python, mais cela signifie aussi qu'il s'exécute directement sur la machine hôte sans isolation, ce qui m'inquiète.
Le grand problème actuel de la chaîne d'approvisionnement, c'est que beaucoup d'outils et de dépendances sont téléchargés sans vérification de provenance.
C'est pour cela que je développe asfaload, une solution open source de vérification de fichiers multi-signatures.
C'est une architecture qui pourrait éviter des incidents comme celui d'axios.
Même si l'on épingle GitHub Actions sur un SHA de commit, cela reste risqué si l'action va ensuite chercher d'autres dépendances.
La vraie solution, dans un pipeline CI, c'est de posséder directement le code ou de forker puis maintenir soi-même.
Nous auditons toutes les actions et, s'il y a des dépendances variables, nous les corrigeons ou les remplaçons (je travaille chez Astral).
Gérer soi-même toute la stack est ce qu'il y a de plus sûr, mais ce n'est pas réaliste.
Le verrouillage par hash est une amélioration de sécurité quasiment gratuite.
Au final, l'important est de bien savoir jusqu'où va la confiance que l'on accorde.
Quand on voit les récents incidents autour de Trivy et litellm, il est clair qu'il faut vraiment des guides de sécurité pour les processus de release.
Les conseils de cet article sont concrets et directement applicables.
L'essentiel de la sécurité de la chaîne d'approvisionnement dépend du niveau de sûreté des paramètres par défaut des plateformes dont nous dépendons.
C'est un excellent aperçu. Cela pourrait servir de référence utile à d'autres projets open source.
Je maintiens
repomatic, un CLI Python et outil de workflows réutilisables.Il intègre par défaut la plupart des pratiques de sécurité décrites dans cet article.
L'objectif est de créer un environnement où la sécurité est le choix par défaut.
Après avoir lu l'article, j'ai ajouté une vérification de la politique d'approbation des PR de forks.
Plus de détails dans le dépôt GitHub.