Im Dezember 2014 veröffentlichte Slashdot eine alarmierende Geschichte: Bots Scanning GitHub, um Amazon EC2-Schlüssel zu stehlen, basierend auf der Erfahrung von Entwickler und Blogger Andrew Hoffman, die Ruby on Rails mit Amazon mit AWS S3 ausprobierte. Er hat unabsichtlich einen begangen application.yml
Datei mit seinen AWS-Schlüsseln. Obwohl er dies bemerkte und sie schnell löschte, schafften es Hacker, die Bots ausführten, 2375 $ für Services, bevor Amazon intervenierte. Glücklicherweise machten sie ihn für die Gebühren nicht verantwortlich.
Dies war jedoch keine neue Geschichte. Bereits im Januar 2014 berichtete Runa Sandvik von Forbes: Angreifer verkratzen GitHub für Cloud-Service-Anmeldeinformationen, Hijack-Konto, um virtuelle Währung abzubauen, basierend auf den Erfahrungen des Sicherheitsbloggers Rich Mogull. Hacker liefen 500 Dollar Gebühren auf sein Konto.
Wer kann sich nicht auf sein Erzählen beziehen:
Ich war auf der Couch und beendete eine Episode von Marvels Agenten von S.H.I.E.L.D. Wie auch immer… nach der Show habe ich meine E-Mail überprüft, bevor ich ins Bett gehe. Das habe ich gesehen: "Sehr geehrter AWS-Kunde, Ihre Sicherheit ist uns wichtig. Wir haben kürzlich erfahren, dass Ihr AWS-Zugriffsschlüssel (mit 3KFA endet) und Ihr Geheimschlüssel auf github.com öffentlich verfügbar sind." Mist Ich stürzte von der Couch ab und murmelte zu meiner Frau, "meine Amazone wurde gehackt", und verschwand in meinem Büro. Ich habe mich sofort bei AWS und GitHub angemeldet, um zu sehen, was passiert ist.
Es ist ein einfacher Fehler, und die meisten von uns haben wahrscheinlich an dem einen oder anderen Punkt etwas Ähnliches getan. Und nicht nur AWS-Schlüssel sind gefährdet. Mit dem zunehmenden Einsatz von Cloud-basierten Diensten kann die zunehmende Verwendung einer Vielzahl von Service-API-Schlüsseln von Hackern und Spammern gleichermaßen genutzt werden.
In diesem Tutorial werde ich Sie durch eine Lösung führen, die ich in meinen eigenen Anwendungen verwende, um meinen Repository-Code von meinen Schlüsseln zu trennen. Während dies für größere Umgebungen möglicherweise nicht angemessen ist, habe ich diese Methode regelmäßig angewendet, um diese Art von Fehlern zu begrenzen. Ja, ich habe sie auch gemacht.
Sicher. Theoretisch sollte das funktionieren. Aber ich habe Erfahrungen gemacht, bei denen Gits Ignore nicht so funktioniert hat, wie ich es erwartet hatte (wahrscheinlich aufgrund meines eigenen Fehlers). Außerdem, wenn Sie sich verlassen Gitignore
Wenn Sie einen Fehler machen, entdecken Sie ihn möglicherweise erst, wenn es zu spät ist.
Ein anderer Ansatz besteht darin, für private Endlager zu zahlen. Wenn Sie ein flexibles Budget haben, funktioniert das gut. Wenn Sie jedoch an Open-Source-Projekten arbeiten oder sich jemals dafür entscheiden, ein älteres Projekt zu öffnen, ist dies auch kein narrensicherer Ansatz.
Die Gründe für die Verfügbarkeit von API-Schlüsseln und sensiblen Daten durch das programmierbare Web führen zu Besorgnis. Einige Best Practices und Vorschläge werden aufgelistet:
Sie empfehlen auch:
Betten Sie API-Schlüssel, Kennwörter usw. nicht direkt in den Code ein, sondern halten Sie diese immer getrennt. Legen Sie API-Schlüssel, Kennwörter usw. in einer separaten Konfigurationsdatei ab. Wenn eine Konfigurationsdatei Teil eines Projekts in einer IDE ist, entfernen Sie vertrauliche Daten, bevor Sie sie verteilen oder freigeben.
Dies ist der Ansatz, den ich für meine eigenen Projekte verwende und im Folgenden mit Ihnen besprochen wird.
Ich finde es am besten, Schlüssel in einer Konfigurationsdatei zu platzieren, die außerhalb der öffentlich zugänglichen Webserver-Verzeichnisse gehostet wird - und manuell verwaltet wird, abgesehen von meinem Git-Repository.
Ich habe mit dieser Lösung angefangen, als ich mit Yii 1.1 zu arbeiten begann. Yii 2.0 stellt konfigurierbare Umgebungen als Teil seiner Advanced Application Template bereit, behebt jedoch nicht die Sicherheitsanfälligkeit .Gitignore
Fehler.
Mein Ansatz ist relativ einfach. Anstatt Dienstschlüssel und Berechtigungsnachweise direkt in meine Codierungsdateien einzubetten, platziere ich meine Schlüssel in einer separaten Konfigurationsdatei, die während der Initialisierungsskripts analysiert wird.
Zum Beispiel könnte der traditionelle Ansatz so aussehen. Yii stellt ein Konfigurationsskript zur Verfügung, das auf jede Seite geladen wird. Es wird angezeigt, dass alle meine Benutzernamen, Kennwörter und API-Schlüssel für fehlerhafte Check-Ins anfällig sind:
array ('connectionString' => 'mysql: host = localhost; dbname = mydatabase', 'emulatePrepare' => true, 'username' => 'jeff', 'password' => 'whitefoxesjumpfences', 'charset' => ' utf8 ',' tablePrefix '=>' fox_ ',), // Parameter der Anwendungsebene, auf die // mit Yii :: app () -> params [' paramName ']' params '=> array (' pushover) zugegriffen werden kann '=> array (' key '=>' H75EAC19M3249! X2 ',),' google '=> array (' maps_api_key '=>' W69uHsUJZBPhsFNExykbQceK '),),…);…?>
Anstatt dieses Risiko einzugehen, erstelle ich ein app-config.ini
Datei und platzieren Sie es außerhalb des Github-Repository-Verzeichnisses. Es könnte ungefähr so aussehen:
mysql_host = "http://host33663.rds.amazon-aws.com" mysql_un = "amzn-app-db7293" mysql_db = "rds-foxesandfences-db" mysql_pwd = "K * $ 1x7B32auiWX91" google_maps_api_key = "W69uHsUJZBPhsFNExykbQceK"
Dann ändere ich das Konfigurationsskript, um die Datei mit parse_ini_file einzuschließen und die hartcodierten Einstellungen durch Variablen aus dem zu ersetzen ini
Datei:
array ('connectionString' => 'mysql: host ='. $ config ['mysql_host']. '; dbname ='. $ config ['mysql_db'], 'emulatePrepare' => true, 'username' => config ['mysql_un'], 'password' => $ config ['mysql_pwd'], 'charset' => 'utf8', 'tablePrefix' => 'fox_',), // Parameter der Anwendungsebene, auf die zugegriffen werden kann / / using Yii :: app () -> params ['paramName'] 'params' => array ('pushover' => array ('key' => $ config ['pushover_key']), 'google' => array ('maps_api_key' => $ config ['google_maps_api_key'],),), ...); >?
Dieser Ansatz hat sich für mich als einfach und überschaubar erwiesen.
Wenn Sie ein WordPress-Administrator sind, sollten Sie auch Ihre API-Schlüssel kennen, die von allgemeinen Plugins verwendet werden. Diese werden in Ihrer WordPress-Datenbank gespeichert. Bleiben Sie auf dem Laufenden mit Ihrem Betriebssystem, WordPress und Plugin-Updates, um zu vermeiden, dass Schlüssel durch andere Sicherheitsanfälligkeiten gefährdet werden.
Mein Ansatz soll eine grundsätzliche Alternative bieten, ist aber sicherlich nicht das letzte Wort. Ich würde gerne Ihre Ideen und Vorschläge hören. Bitte poste alle Kommentare und Ideen unten. Sie können meine anderen Tuts + Tutorials auf meiner Instructor-Seite durchsuchen oder mir auf Twitter @reifman folgen.