Protéger vos clés de GitHub

Ce que vous allez créer

En décembre 2014, Slashdot a publié un article alarmant intitulé Bots Scanning GitHub pour voler des clés Amazon EC2, basé sur l'expérience du développeur et blogueur Andrew Hoffman, qui avait testé Ruby on Rails sur Amazon avec AWS S3. Il a commis par inadvertance un application.yml fichier avec ses clés AWS. Même s'il l'a remarqué et les a supprimés rapidement, les pirates informatiques exécutant des bots ont réussi à dépenser 2 375 $ de services avant l'intervention d'Amazon. Heureusement, pour Hoffman, ils ne l'ont pas tenu responsable des frais. 

Mais ce n'était pas vraiment une nouvelle histoire. En janvier 2014, Runa Sandvik de Forbes rapportait: Des attaquants enlèvent GitHub pour des informations d'identification de service Cloud, piratez un compte vers une monnaie virtuelle, sur la base de la propre expérience du blogueur de sécurité Rich Mogull. Les pirates ont accumulé 500 $ de charges sur son compte. 

Qui ne peut pas comprendre ses propos:

J'étais sur le canapé en train de terminer un épisode de Les agents de Marvel de S.H.I.E.L.D. Quoi qu'il en soit… après le spectacle, j'ai vérifié mon courrier électronique avant de me coucher. C'est ce que j'ai vu: "Cher client AWS, Votre sécurité est importante pour nous. Nous avons récemment appris que votre clé d'accès AWS (se terminant par 3KFA) et votre clé secrète sont disponibles sur github.com." Merde. J'ai quitté le canapé, marmonnant à ma femme, "mon Amazone a été piraté", et a disparu dans mon bureau. Je me suis immédiatement connecté à AWS et à GitHub pour voir ce qui s'est passé..

C'est une erreur facile et la plupart d'entre nous ont probablement fait la même chose à un moment ou à un autre. Et ce ne sont pas uniquement les clés AWS qui sont à risque. À mesure que notre utilisation de services en nuage augmente, les pirates informatiques et les spammeurs peuvent tirer parti de l'utilisation croissante d'une grande variété de clés d'API de service.. 

Dans ce tutoriel, je vais vous présenter une solution que j'utilise dans mes propres applications pour séparer le code de mon référentiel de mes clés. Bien que cela ne soit peut-être pas approprié pour des environnements plus vastes, c'est une pratique que j'emploie régulièrement et qui m'aide à limiter ces types d'erreurs. Oui, je les ai aussi faites..

Ne pouvons-nous pas simplement utiliser Git's Ignore?

Sûr. Théoriquement, ça devrait marcher. Mais j'ai eu des expériences où Git's ignore n'a pas fonctionné comme je m'y attendais (probablement à cause de ma propre erreur). En outre, si vous comptez sur gitignore et vous faites une erreur, vous pouvez ne pas la découvrir avant qu'il ne soit trop tard.

Une autre approche consiste à payer pour les référentiels privés. Si vous avez un budget flexible, cela fonctionne bien. Mais si vous travaillez sur des projets open source ou si vous décidez d'ouvrir un projet hérité, ce n'est pas une approche infaillible.. 

Les clés API et les données sensibles exposées sur le Web programmable sont de plus en plus préoccupantes et énumèrent certaines des meilleures pratiques et suggestions suivantes:

  • Lorsque vous utilisez AWS, configurez des alertes de facturation et des budgets maximaux..
  • N'utilisez jamais les informations d'identification racine avec les clés d'accès limité à AWS-use via IAM.
  • Utilisez git-crypt. Git-crypt permet le cryptage et le décryptage transparents de fichiers dans un référentiel Git.

Ils recommandent également: 

N'intégrez pas de clés d'API, de mots de passe, etc. directement dans le code, mais gardez-les toujours séparés. Placez les clés d'API, les mots de passe, etc. dans un fichier de configuration séparé. Si un fichier de configuration fait partie d’un projet dans un IDE, supprimez les données sensibles avant de les distribuer ou de les partager..

C’est l’approche que j’utilise pour mes propres projets et que j’examinerai avec vous ci-dessous..

Utiliser un fichier de configuration

Je trouve qu'il est préférable de placer les clés dans un fichier de configuration hébergé en dehors des répertoires du serveur Web accessibles au public et géré manuellement, en dehors de mon référentiel Git..

J'ai commencé à utiliser cette solution lorsque j'ai commencé à travailler avec Yii 1.1. Yii 2.0 fournit des environnements configurables dans son modèle d’application avancée, mais ne corrige pas la vulnérabilité de .gitignore les erreurs.

Mon approche est relativement simple. Au lieu d'incorporer directement les clés de service et les informations d'identification dans mes fichiers de codage, je les place dans un fichier de configuration séparé qui est analysé lors des scripts d'initialisation..

Par exemple, voici à quoi pourrait ressembler l’approche traditionnelle. Yii fournit un script de configuration qui se charge à chaque demande de page, notant que tous mes noms d'utilisateur, mots de passe et clés d'API sont vulnérables aux enregistrements erronés:

array ('connectionString' => 'mysql: host = localhost; nombase = ma base de données', 'emulatePrepare' => true, 'nomutilisateur' => 'jeff', 'mot_passe' => 'whitefoxesjumpfences', 'charset' => ' utf8 ',' tablePrefix '=>' fox_ ',), // paramètres d’application accessibles via // avec Yii :: app () -> params [' paramName ']' params '=> array (' pushover '=> array (' key '=>' H75EAC19M3249! X2 ',),' google '=> array (' maps_api_key '=>' W69uHsUJZBPhsFNExykbQceK ',),),),…);…?>

Plutôt que de courir ce risque, je crée un app-config.ini fichier et placez-le en dehors du répertoire du référentiel github. Cela pourrait ressembler à quelque chose comme ça:

mysql_host = "http://host33663.rds.amazon-aws.com" mysql_un = "amzn-app-db7293" mysql_db = "rds-foxesandfences-db" mysql_pwd = "K * $ 1x7B32auiWX91" pushover_key "" "" google_maps_api_key = "W69uHsUJZBPhsFNExykbQceK" 

Ensuite, je modifie le script de configuration pour inclure le fichier à l’aide de parse_ini_file et remplace les paramètres codés en dur par des variables du ini fichier:

array ('connectionString' => 'mysql: host ='. $ config ['mysql_host']. '; dbname ='. $ config ['mysql_db'], 'emulatePrepare' => true, 'nomutilisateur' => $ config ['mysql_un'], 'password' => $ config ['mysql_pwd'], 'charset' => 'utf8', 'tablePrefix' => 'fox_',), // paramètres accessibles au niveau de l'application / / using Yii :: app () -> params ['paramName'] 'params' => array ('pushover' => array ('key' => $ config ['pushover_key'],), 'google' => array ('maps_api_key' => $ config ['google_maps_api_key'],),),…); >?

Cette approche s’est révélée assez simple et gérable pour moi.

Vulnérabilités du plugin WordPress

Si vous êtes un administrateur WordPress, vous devez également connaître vos clés d'API utilisées par les plugins courants. ceux-ci sont stockés dans votre base de données WordPress. Suivez votre système d'exploitation, WordPress et les mises à jour de plugins pour éviter que des clés ne soient compromises par d'autres vulnérabilités..

Pensées finales

Mon approche est censée offrir une alternative de base, mais ce n'est certainement pas le dernier mot. J'aimerais entendre vos idées et suggestions. S'il vous plaît poster des commentaires et des idées ci-dessous. Vous pouvez parcourir mes autres tutoriels Tuts + sur ma page d’instructeur ou me suivre sur Twitter @reifman.

Liens connexes

  • Des robots analysant GitHub pour voler des clés Amazon EC2 (Slashdot)
  • Les attaquants enlèvent GitHub pour des informations d'identification de service Cloud, un compte piraté pour exploiter la monnaie virtuelle (Forbes)
  • Pourquoi les clés API et les données sensibles sont-elles de plus en plus préoccupantes?
  • Ignorer les fichiers GitHub