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 :
- 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 dansMona
. - Lâutilisateur extrait un nombre de codes dâun rĂ©fĂ©rentiel dans
Mona
et lâenregistre dans votre application Ă des fins dâanalyse. - 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.