Protection des référentiels GitHub contre les validations malveillantes

Mozilla essaie de protéger ses référentiels sur GitHub contre les modifications malveillantes. Comme le récent incident Gentoo l'a montré, de telles attaques sont réelles.


Mozilla a initialement utilisĂ© GitHub comme hĂ©bergement de sauvegarde. Comme Gentoo, les rĂ©fĂ©rentiels d'origine ont Ă©tĂ© stockĂ©s sur leur propre infrastructure. Bien que la plupart du code Firefox soit toujours distribuĂ© avec sa propre infrastructure, de nombreux projets n'existent que sur GitHub. Certains ne sont que des expĂ©riences, tandis que d'autres sont utilisĂ©s en production (par exemple, les comptes Firefox ). Ces rĂ©fĂ©rentiels «sensibles» doivent ĂȘtre protĂ©gĂ©s contre les modifications malveillantes, sans compliquer les commits pour les personnes normales.

Les étapes réelles sont décrites ici contre la distribution (ou le déploiement) de code à partir d'un référentiel compromis. Nous partageons l'expérience et certains outils d' audit. Une telle protection n'interfÚre presque pas avec les flux de travail normaux dans GitHub.

Nous considérons ici le risque de pirater un compte GitHub à travers les mécanismes uniques de ce site. Comme le cas Gentoo et d'autres incidents l'ont montré, en cas de piratage, tout le code auquel l'utilisateur a accÚs est compromis.

L'essence du problĂšme


GitHub est un excellent Ă©cosystĂšme avec de nombreuses extensions ou «applications» pour simplifier des workflows spĂ©cifiques. Les applications reçoivent l'autorisation de l'utilisateur d'effectuer des actions en son nom. Ils peuvent demander des autorisations, y compris la modification ou l'ajout de comptes supplĂ©mentaires. GitHub affiche clairement ces demandes: l'utilisateur doit les approuver via l'interface web, mais tout le monde n'est pas au courant des consĂ©quences. Beaucoup ne comprennent pas que l'autorisation d'accĂ©der Ă  un rĂ©fĂ©rentiel personnel donne le mĂȘme accĂšs Ă  n'importe quel rĂ©fĂ©rentiel sur GitHub au nom de l'utilisateur.

Les autorisations excessives mettent en danger les rĂ©fĂ©rentiels avec des informations confidentielles, tandis que l'administrateur du rĂ©fĂ©rentiel ne voit rien. La meilleure chose qu'il puisse faire est de remarquer un commit malveillant aprĂšs coup. Ni GitHub ni Git ne peuvent ĂȘtre configurĂ©s pour empĂȘcher ou marquer ce type de commit malveillant. Surveillance externe uniquement.

Implémentation


Les recommandations suivantes sont tirées de notre systÚme de sécurité , seules les fonctionnalités spécifiques de Mozilla ont été supprimées pour cet article. Dans la mesure du possible, nous empruntons les meilleures pratiques d'Internet, utilisons les fonctions de GitHub et essayons de ne pas trop compliquer la vie des développeurs.

Recommandations aux organisations


  • 2FA obligatoire pour tous les employĂ©s.
  • Pour tous ou au moins les utilisateurs avec des autorisations plus Ă©levĂ©es:
    • Fournissez un contact (e-mail, messagerie instantanĂ©e) Ă  l'organisation ou Ă  l'administrateur (GitHub vous permet de masquer les informations de contact pour la confidentialitĂ©).
    • Assurez-vous d'informer l'organisation ou l'administrateur de la compromission possible de votre compte (par exemple, en cas de vol d'un ordinateur portable).

Lignes directrices pour les référentiels


  • Les rĂ©fĂ©rentiels importants ne doivent ĂȘtre hĂ©bergĂ©s que dans une organisation qui suit les recommandations ci-dessus.
  • DĂ©finissez et configurez les branches de production:
    • Ban forcĂ© de pousser.
    • Autorisation de valider uniquement pour un petit nombre d'utilisateurs.
    • Appliquez Ă©galement ces restrictions aux administrateurs et propriĂ©taires.
    • Signez toutes les validations avec des clĂ©s GPG prĂ©cĂ©demment connues.

Recommandations de workflow


  • Les dĂ©ploiements, versions et autres Ă©vĂ©nements dignes d'un audit doivent ĂȘtre notĂ©s avec une balise signĂ©e avec une clĂ© GPG prĂ©cĂ©demment connue.
  • Tous les dĂ©ploiements et versions doivent ĂȘtre Ă©mis uniquement aprĂšs un audit de toutes les validations et balises signĂ©es pour les clĂ©s correctes.

La mise en Ɠuvre de ces mesures de protection entraĂźne certains coĂ»ts, notamment en lien avec la signature des engagements. Nous avons dĂ©veloppĂ© des outils pour l'audit des configurations et prĂ©voyons de publier des outils pour l'audit des commits. Tous sont dans notre rĂ©fĂ©rentiel .



Voici un exemple d'audit. Tout d'abord, nous obtenons une copie locale des données pour l'organisation octo_org , puis un rapport est compilé pour chaque référentiel:

 $ ./get_branch_protections.py octo_org 2018-07-06 13:52:40,584 INFO: Running as ms_octo_cat 2018-07-06 13:52:40,854 INFO: Gathering branch protection data. (calls remaining 4992). 2018-07-06 13:52:41,117 INFO: Starting on org octo_org. (calls remaining 4992). 2018-07-06 13:52:59,116 INFO: Finished gathering branch protection data (calls remaining 4947). 

Maintenant, avec des données mises en cache localement, vous pouvez générer des rapports. Par exemple, un rapport montre la conformité avec les recommandations ci-dessus:

 $ ./report_branch_status.py --header octo_org.db.json name,protected,restricted,enforcement,signed,team_used octo_org/react-starter,True,False,False,False,False octo_org/node-starter,False,False,False,False,False 

Comme vous pouvez le voir, seul octo_org/react-starter comprenait une protection contre les poussées forcées sur la branche de production. Le résultat est au format CSV à insérer facilement dans une feuille de calcul.

Comment pouvez-vous aider


Nous mettons toujours en Ɠuvre ces recommandations et apprenons en cours de route. Si vous pensez que nos recommandations de sĂ©curitĂ© de rĂ©fĂ©rentiel vous conviennent, contribuez Ă  simplifier la mise en Ɠuvre. Partagez votre expĂ©rience sur la page des conseils ou ouvrez un ticket dans le rĂ©fĂ©rentiel GitHub-Audit .

Source: https://habr.com/ru/post/fr423321/


All Articles