Skip to main content

Meilleures pratiques pour la crĂ©ation d’une application GitHub

Suivez ces bonnes pratiques pour améliorer la sécurité et les performances de votre GitHub App.

Sélectionner les autorisations minimales requises

Lorsque vous inscrivez une GitHub App, sĂ©lectionnez les autorisations minimales dont votre GitHub App a besoin. Si des clĂ©s ou des jetons pour votre application sont compromis, cela limitera la quantitĂ© de dommages susceptibles de se produire. Pour plus d’informations sur le choix des autorisations, consultez « Choix des autorisations pour une application GitHub Â».

Lorsque votre GitHub App crĂ©e un jeton d’accĂšs d’installation ou un jeton d’accĂšs utilisateur, vous pouvez limiter davantage les dĂ©pĂŽts auxquels l’application peut accĂ©der et les autorisations dont dispose le jeton. Pour plus d’informations, consultez « GĂ©nĂ©ration d’un jeton d’accĂšs d’installation pour une application GitHub Â» et « GĂ©nĂ©ration d’un jeton d’accĂšs utilisateur pour une application GitHub Â».

Rester sous la limite de débit

Abonnez-vous aux Ă©vĂ©nements de webhook au lieu d’interroger l’API pour rechercher des donnĂ©es. Cela aidera votre GitHub App Ă  rester dans la limite du taux d’API. Pour plus d’informations, consultez « Utilisation de webhooks avec des applications GitHub Â» et « GĂ©nĂ©ration d’une application GitHub qui rĂ©pond aux Ă©vĂ©nements de webhook Â».

Envisagez d’utiliser des requĂȘtes conditionnelles pour vous aider Ă  rester dans la limite de dĂ©bit. Pour plus d’informations sur les demandes conditionnelles, consultez « Meilleures pratiques pour utiliser l'API REST Â».

Si possible, envisagez d’utiliser des requĂȘtes GraphQL consolidĂ©es plutĂŽt que des requĂȘtes d’API REST pour vous aider Ă  respecter les limites de dĂ©bit. Pour plus d’informations, consultez « Comparaison de l’API REST de GitHub et de l’API GraphQL Â» et « Documentation sur l’API GraphQL GitHub Â».

Si vous atteignez une limite de dĂ©bit et que vous devez rĂ©essayer une requĂȘte d’API, utilisez les en-tĂȘtes de rĂ©ponse x-ratelimit-reset ou Retry-After. Si ces en-tĂȘtes ne sont pas disponibles, attendez une augmentation exponentielle du temps entre les nouvelles tentatives et levez une erreur aprĂšs un nombre spĂ©cifique de nouvelles tentatives. Pour plus d’informations, consultez « Meilleures pratiques pour utiliser l'API REST Â».

SĂ©curiser les informations d’identification de votre application

Vous pouvez gĂ©nĂ©rer une clĂ© privĂ©e et une clĂ© secrĂšte client pour votre GitHub App. Les clĂ©s privĂ©es sont utilisĂ©es pour gĂ©nĂ©rer des jetons d'accĂšs Ă  l'installation, tandis que les secrets clients sont utilisĂ©s pour obtenir des jetons d'accĂšs utilisateur et des jetons d'actualisation. Ces jetons peuvent ĂȘtre utilisĂ©s pour effectuer des demandes d’API pour le compte d’un utilisateur ou d’une installation d’application.

Vous devez stocker des clés privées, des jetons et des secrets clients en toute sécurité. Cependant, le mécanisme de stockage et sa sécurité relative dépendent de votre architecture d'intégration et de la plateforme sur laquelle elle fonctionne. En général, vous devez utiliser un mécanisme de stockage destiné à stocker des données sensibles sur la plateforme que vous utilisez.

Clés privées

La clĂ© privĂ©e de votre GitHub App accorde l’accĂšs Ă  chaque compte sur lequel l’application est installĂ©e. Il doit ĂȘtre stockĂ© en toute sĂ©curitĂ© et ne jamais ĂȘtre partagĂ© Ă  grande Ă©chelle.

Envisagez de stocker la clé privée de votre GitHub App dans un coffre de clés, comme Azure Key Vault, et de la configurer en signature seule.

Vous pouvez Ă©galement stocker la clĂ© en tant que variable d’environnement. Cependant, cette mĂ©thode n’est pas aussi sĂ©curisĂ©e que le stockage de la clĂ© dans un coffre de clĂ©s. Si un attaquant obtient l’accĂšs Ă  l’environnement, il peut lire la clĂ© privĂ©e et obtenir une authentification persistante en tant que GitHub App.

Vous ne devez jamais coder en dur votre clĂ© privĂ©e dans votre application, mĂȘme si votre code est stockĂ© dans un dĂ©pĂŽt privĂ©. Si votre application est un client natif, une application cĂŽtĂ© client ou s'exĂ©cute sur un appareil utilisateur (par opposition Ă  une exĂ©cution sur vos serveurs), vous ne devez jamais expĂ©dier votre clĂ© privĂ©e avec votre application.

Vous ne devez pas gĂ©nĂ©rer plus de clĂ©s privĂ©es que nĂ©cessaire. Vous devez supprimer les clĂ©s privĂ©es qui ne sont plus utilisĂ©es. Pour plus d’informations, consultez « Gestion des clĂ©s privĂ©es pour les applications GitHub Â».

Clés secrÚtes client

Les secrets client sont nĂ©cessaires pour gĂ©nĂ©rer des jetons d'accĂšs utilisateur pour votre application, sauf si celle-ci utilise le flux de l'appareil. Pour plus d’informations, consultez « GĂ©nĂ©ration d’un jeton d’accĂšs utilisateur pour une application GitHub Â».

Si votre application est un client confidentiel, c'est-à-dire qu'elle peut sécuriser le secret client en toute sécurité, envisagez de stocker votre secret client dans un coffre-fort de clés, tel queAzure Key Vault, ou sous forme de variable d'environnement cryptée ou de secret sur votre serveur.

Si votre application est un client public (une application native qui s’exĂ©cute sur l’appareil de l’utilisateur, l’utilitaire CLI ou l’application web monopage), vous ne pouvez pas sĂ©curiser votre clĂ© secrĂšte client. Vous devrez expĂ©dier la clĂ© secrĂšte client dans le code de l’application, et vous devez utiliser PKCE pour mieux sĂ©curiser le flux d’authentification. Vous devez faire preuve de prudence si vous prĂ©voyez de contrĂŽler l'accĂšs Ă  vos propres services Ă  l'aide de jetons gĂ©nĂ©rĂ©s par votre application, car les clients publics sont facilement usurpables : n'importe qui peut rĂ©utiliser l'ID client de votre application pour se connecter.

N’activez pas le flux d’appareil sans raison

Il est prĂ©fĂ©rable d’utiliser le code d’autorisation avec PKCE sur le flux d’appareil, si vous ĂȘtes intĂ©ressĂ© par l’utilisation de la clĂ© secrĂšte client dans un client public. Le flux d’appareil ne nĂ©cessite pas du tout d’URI de redirection, ce qui signifie qu’un attaquant peut utiliser le flux d’appareil pour emprunter Ă  distance l’identitĂ© de votre application dans le cadre d’une attaque par hameçonnage. Pour cette raison, n'activez pas le flux de pĂ©riphĂ©riques pour votre application, sauf si vous utilisez l'application dans un environnement contraint (CLI, pĂ©riphĂ©riques IoT ou systĂšmes sans affichage).

Jetons d’accùs d’installation, jetons d’accùs utilisateur et jetons d’actualisation

Les jetons d’accĂšs d’installation sont utilisĂ©s pour effectuer des requĂȘtes d’API pour le compte d’une installation d’application. Les jetons d’accĂšs utilisateur sont utilisĂ©s pour effectuer des requĂȘtes d’API pour le compte d’un utilisateur. Les jetons d’actualisation sont utilisĂ©s pour rĂ©gĂ©nĂ©rer les jetons d’accĂšs utilisateur. Votre application peut utiliser sa clĂ© privĂ©e pour gĂ©nĂ©rer un jeton d’accĂšs d’installation. Votre application peut utiliser sa clĂ© secrĂšte client pour gĂ©nĂ©rer un jeton d’accĂšs utilisateur et un jeton d’actualisation.

Si votre application est un site web ou une application web, vous devez chiffrer les jetons sur votre back-end et vous assurer qu’il existe une sĂ©curitĂ© autour des systĂšmes qui peuvent accĂ©der aux jetons. Envisagez de stocker les jetons d’actualisation dans un emplacement distinct des jetons d’accĂšs actifs.

Si votre application est un client natif, une application cĂŽtĂ© client ou s’exĂ©cute sur un appareil utilisateur (par opposition Ă  l’exĂ©cution sur vos serveurs), il se peut que vous ne puissiez pas sĂ©curiser les jetons ainsi qu’une application qui s’exĂ©cute sur vos serveurs. Vous ne devez pas gĂ©nĂ©rer de jetons d’accĂšs d’installation, car cela nĂ©cessite une clĂ© privĂ©e. Au lieu de cela, vous devez gĂ©nĂ©rer des jetons d’accĂšs utilisateur. Vous devez stocker les jetons via le mĂ©canisme recommandĂ© pour la plateforme de votre application, et garder Ă  l’esprit que le mĂ©canisme de stockage peut ne pas ĂȘtre entiĂšrement sĂ©curisĂ©.

Utiliser le type de jeton approprié

Une GitHub Apps peut gĂ©nĂ©rer des jetons d’accĂšs d’installation ou des jetons d’accĂšs utilisateur afin d’effectuer des requĂȘtes d’API authentifiĂ©es.

Les jetons d’accĂšs d’installation attribuent l’activitĂ© Ă  votre application. Ils sont utiles pour les automatisations qui agissent indĂ©pendamment des utilisateurs.

Les jetons d’accĂšs utilisateur attribuent l’activitĂ© Ă  un utilisateur et Ă  votre application. Ils sont utiles pour effectuer des actions basĂ©es sur l’entrĂ©e utilisateur ou pour le compte d’un utilisateur.

Un jeton d’accĂšs Ă  l’installation est restreint en fonction des autorisations et de l’accĂšs de l’GitHub App. Un jeton d’accĂšs utilisateur est restreint en fonction de l’autorisation et de l’accĂšs de l’GitHub App, ainsi que de l’autorisation et de l’accĂšs de l’utilisateur. Par consĂ©quent, si votre GitHub App effectue une action au nom d’un utilisateur, elle doit toujours utiliser un jeton d’accĂšs utilisateur au lieu d’un jeton d’accĂšs d’installation. Sinon, votre application peut permettre Ă  un utilisateur de voir ou de faire des choses qu’il ne devrait pas ĂȘtre en mesure de voir ou faire.

Votre application ne doit jamais utiliser un personal access token ou un mot de passe GitHub pour s’authentifier.

VĂ©rifiez minutieusement, durablement et frĂ©quemment l’autorisation

AprĂšs la connexion d'un utilisateur, les dĂ©veloppeurs d'applications doivent prendre des mesures supplĂ©mentaires pour s'assurer que l'utilisateur est censĂ© avoir accĂšs aux donnĂ©es de votre systĂšme. Vous devez vĂ©rifier rĂ©guliĂšrement que leurs adhĂ©sions, leurs accĂšs et leur statut d’authentification unique actuel leur permettent toujours d’accĂ©der Ă  votre application et aux ressources qu’elle protĂšge.

Utiliser l’unique et durable id pour stocker l'utilisateur

Lorsqu’un utilisateur se connecte et effectue des actions dans votre application, vous devez mĂ©moriser l’utilisateur qui a effectuĂ© cette action pour lui accorder l’accĂšs aux mĂȘmes ressources la prochaine fois qu’il se connecte.

Pour enregistrer correctement les utilisateurs dans votre base de donnĂ©es, utilisez toujours l’id de l’utilisateur. Cette valeur ne changera jamais pour l’utilisateur ou sera utilisĂ©e pour pointer vers un autre utilisateur. Ainsi, elle garantit que vous fournissez l’accĂšs Ă  l’utilisateur voulu. Vous pouvez trouver l’id de l’utilisateur avec le point de terminaison de l’API REST GET /user. Consultez Points de terminaison d’API REST pour les utilisateurs.

Si vous stockez des références aux référentiels, organisations et entreprises, utilisez leur id également pour vous assurer que vos liens restent exacts.

N’utilisez jamais d’identifiants qui peuvent changer au fil du temps, y compris les descripteurs d’utilisateur, les champs de donnĂ©es dynamiques d’organisation ou les adresses e-mail.

Valider l’accùs de l’organisation pour chaque nouvelle authentification

Lorsque vous connectez un utilisateur, vous devez suivre les organisations pour lesquelles le jeton de l’utilisateur est autorisĂ©. Cela peut changer au fil du temps aprĂšs la connexion, car les utilisateurs peuvent ĂȘtre supprimĂ©s des organisations. Si une organisation utilise l’authentification unique SAML et qu’un utilisateur n’a pas effectuĂ© d’authentification unique SAML, le jeton d’accĂšs utilisateur n’aura pas accĂšs Ă  cette organisation. Vous devez utiliser rĂ©guliĂšrement le point de terminaison GET /user/installations de l’API REST pour vĂ©rifier Ă  quelles organisations un jeton d’accĂšs utilisateur a accĂšs. Si l’utilisateur n’est pas autorisĂ© Ă  accĂ©der Ă  une organisation, vous devez empĂȘcher son accĂšs aux donnĂ©es appartenant Ă  l’organisation au sein de votre propre application jusqu’à ce qu’il procĂšde Ă  l’authentification unique SAML ou rejoigne l’organisation. Pour plus d’informations, consultez « Points d’accĂšs Ă  l’API REST pour les installations GitHub App Â».

Stocker les données des utilisateurs dans le contexte de l'organisation et de l'entreprise

Outre le suivi de l’identitĂ© de l’utilisateur via le champ id, vous devez conserver les donnĂ©es relatives Ă  l’organisation ou Ă  l’entreprise dont relĂšve chaque utilisateur. Cela vous permettra de vous assurer qu’il n’y a pas de fuite d’informations sensibles si un utilisateur change de rĂŽle.

Par exemple :

  1. Un utilisateur fait partie de l’organisation Mona, qui nĂ©cessite une authentification unique SAML, et se connecte Ă  votre application aprĂšs avoir effectuĂ© l’authentification unique. Votre application a dĂ©sormais accĂšs Ă  ce que fait l’utilisateur dans Mona.
  2. L’utilisateur extrait un nombre de codes d’un rĂ©fĂ©rentiel dans Mona et l’enregistre dans votre application Ă  des fins d’analyse.
  3. UltĂ©rieurement, l’utilisateur bascule d’une tĂąche Ă  l’autre et est supprimĂ© de l’organisation Mona.

Quand l’utilisateur accĂšde Ă  votre application, peut-il toujours voir le code et l’analyse de l’organisation Mona dans son compte d’utilisateur ?

C’est pourquoi il est essentiel de suivre la source des donnĂ©es que votre application enregistre. Dans le cas contraire, votre application devient une menace Ă  la protection des donnĂ©es pour les organisations qui seront susceptibles d’interdire votre application si elles ne peuvent lui faire confiance et ce afin de protĂ©ger correctement leurs donnĂ©es.

Expiration des jetons

GitHub vous encourage vivement Ă  utiliser des jetons d’accĂšs utilisateur qui expirent. Si vous avez prĂ©cĂ©demment refusĂ© l’utilisation de jetons d’accĂšs utilisateur qui expirent, mais que vous souhaitez rĂ©activer cette fonctionnalitĂ©, consultez « Activation de fonctionnalitĂ©s facultatives pour les applications GitHub Â».

Les jetons d’accĂšs d’installation expirent aprĂšs une heure, les jetons d’accĂšs utilisateur aprĂšs huit heures et les jetons d’actualisation aprĂšs six mois. Toutefois, vous pouvez Ă©galement rĂ©voquer des jetons dĂšs que vous n’en avez plus besoin. Pour plus d’informations, consultez « DELETE /installation/token Â» pour rĂ©voquer un jeton d’accĂšs d’installation, et « DELETE /applications/{client_id}/token Â» pour rĂ©voquer un jeton d’accĂšs utilisateur.

Mettre en cache des jetons

Les jetons d’accĂšs d’utilisateur et les jetons d’accĂšs d’installation sont destinĂ©s Ă  ĂȘtre utilisĂ©s jusqu’à leur expiration. Vous devez mettre en cache les jetons que vous crĂ©ez. Avant de crĂ©er un jeton, vĂ©rifiez votre cache pour voir si vous disposez dĂ©jĂ  d’un jeton valide. La rĂ©utilisation des jetons rend votre application plus rapide, car celle-ci fait moins de demandes pour gĂ©nĂ©rer des jetons.

Planifier la gestion des violations de sécurité

Vous devez avoir un plan en place afin de pouvoir gérer les violations de sécurité en temps opportun.

Dans le cas oĂč la clĂ© privĂ©e ou le secret de votre application est compromis, vous devez gĂ©nĂ©rer une nouvelle clĂ© ou un nouveau secret, mettre Ă  jour votre application pour utiliser la nouvelle clĂ© ou le nouveau secret, et supprimer votre ancienne clĂ© ou ancien secret.

Dans le cas oĂč les jetons d’accĂšs d’installation, les jetons d’accĂšs utilisateur ou les jetons d’actualisation sont compromis, vous devez immĂ©diatement rĂ©voquer ces jetons. Pour plus d’informations, consultez « DELETE /installation/token Â» pour rĂ©voquer un jeton d’accĂšs d’installation, et « DELETE /applications/{client_id}/token Â» pour rĂ©voquer un jeton d’accĂšs utilisateur.

Effectuer des analyses de vulnérabilité réguliÚres

Vous devez effectuer des analyses de vulnĂ©rabilitĂ© rĂ©guliĂšres pour votre application. Par exemple, vous pouvez configurer l’analyse du code et l’analyse des secrets pour le dĂ©pĂŽt qui hĂ©berge le code de votre application. Pour plus d’informations, consultez « Ă€ propos de l’analyse du code Â» et « Ă€ propos de l’analyse des secrets Â».

Choisir un environnement approprié

Si votre application s’exĂ©cute sur un serveur, vĂ©rifiez que votre environnement serveur est sĂ©curisĂ© et qu’il peut gĂ©rer le volume de trafic attendu pour votre application.

S’abonner aux webhooks minimum

Abonnez-vous uniquement aux Ă©vĂ©nements de webhook dont votre application a besoin. Cela permet de rĂ©duire la latence, car votre application ne reçoit pas de charges utiles dont elle n’a pas besoin.

Utiliser un secret de webhook

Vous devez dĂ©finir un secret webhook pour votre GitHub App et vĂ©rifier que la signature des Ă©vĂ©nements webhook entrants correspond au secret. Cela permet de s’assurer que l’évĂ©nement webhook entrant est un Ă©vĂ©nement GitHub valide.

Pour plus d’informations, consultez « Utilisation de webhooks avec des applications GitHub Â». Pour obtenir un exemple, consultez « GĂ©nĂ©ration d’une application GitHub qui rĂ©pond aux Ă©vĂ©nements de webhook Â».

Laisser aux utilisateurs le temps d’accepter les nouvelles autorisations

Lorsque vous ajoutez des autorisations de dĂ©pĂŽt ou d’organisation Ă  votre GitHub App, les utilisateurs pour lesquels l’application est installĂ©e sur leur compte personnel ou d’organisation reçoivent un e-mail les invitant Ă  passer en revue les nouvelles autorisations. Tant que l’utilisateur n’approuve pas les nouvelles autorisations, son installation d’application ne recevra que les anciennes autorisations.

Lorsque vous mettez Ă  jour les autorisations, vous devez envisager de rendre votre application rĂ©trocompatible pour laisser Ă  vos utilisateurs le temps d’accepter les nouvelles autorisations. Vous pouvez utiliser le webhook d’installation avec la propriĂ©tĂ© d’action new_permissions_accepted pour savoir quand les utilisateurs acceptent de nouvelles autorisations pour votre application.

Utiliser les services de maniÚre sécurisée

Si votre application utilise des services tiers, ils doivent ĂȘtre utilisĂ©s de maniĂšre sĂ©curisĂ©e :

  • Tous les services utilisĂ©s par votre application doivent avoir une connexion et un mot de passe uniques.
  • Les applications ne doivent pas partager de comptes de service tels que les services par e-mail ou de base de donnĂ©es pour gĂ©rer votre service SaaS.
  • Seuls les employĂ©s ayant des tĂąches administratives doivent avoir un accĂšs administrateur Ă  l’infrastructure qui hĂ©berge votre application.

Ajouter la journalisation et la supervision

Envisagez d’ajouter des fonctionnalitĂ©s de journalisation et de supervision pour votre application. Un journal de sĂ©curitĂ© peut inclure :

  • des Ă©vĂ©nements d’authentification et d’autorisation
  • des changements de configuration de service
  • des lectures et Ă©critures d’objets
  • des modifications d’autorisation d’utilisateur et de groupe
  • l’élĂ©vation du rĂŽle Ă  l’administrateur

Vos journaux doivent utiliser un horodatage cohĂ©rent pour chaque Ă©vĂ©nement et enregistrer les utilisateurs, les adresses IP ou les noms d’hĂŽte pour tous les Ă©vĂ©nements journalisĂ©s.

Activer la suppression de données

Si votre GitHub App est disponible pour d’autres utilisateurs ou organisations, vous devez donner aux utilisateurs et propriĂ©taires d’organisation un moyen de supprimer leurs donnĂ©es. Les utilisateurs ne doivent pas avoir besoin d’envoyer un e-mail ou d’appeler une personne du support technique pour supprimer leurs donnĂ©es.

Pour aller plus loin