În decembrie 2014, Slashdot a lansat o poveste alarmantă Bots Scanning GitHub pentru a fura Amazon EC2 Keys, bazată pe experiența dezvoltatorului și a bloggerului Andrew Hoffman, încercând Ruby on Rails pe Amazon cu AWS S3. El a comis din neatenție o application.yml
fișier cu cheile sale AWS. Chiar dacă a observat-o și le-a șters rapid, hackerii care rulează boturi au reușit să cheltuiască 2.375 de servicii înainte ca Amazon să intervină. Din fericire, pentru Hoffman, nu l-au considerat responsabil pentru taxe.
Dar nu a fost o poveste nouă. Înapoi în ianuarie 2014, Runa Sandvik de la Forbes a raportat: atacatorii scarpină GitHub pentru acreditările serviciului Cloud, contul de deturnare a monedei virtuale, bazat pe experiența bloggerului de securitate a lui Rich Mogull. Hackerii au dat peste 500 de dolari în contul său.
Cine nu se poate referi la povestea sa:
Am fost pe canapea, terminând un episod din Agenții Marvel din S.H.I.E.L.D. Oricum ... după spectacol, am verificat e-mailul înainte de a merge la culcare. "AWS Client, siguranța dvs. este importantă pentru noi. De curând am devenit conștienți de faptul că cheia de acces AWS (care se încheie cu 3KFA) împreună cu cheia secretă sunt disponibile public pe github.com". Rahat. Am întors din canapea, mormăind la soția mea, "Amazonul meu a fost spart" și a dispărut în biroul meu. Am intrat imediat în AWS și GitHub pentru a vedea ce sa întâmplat.
Este o greșeală ușoară și majoritatea dintre noi au făcut probabil un lucru similar la un moment dat sau altul. Și nu sunt doar cheile AWS care sunt în pericol. Odată cu creșterea utilizării serviciilor de tip cloud, utilizarea extensivă a unei game largi de chei API pentru servicii poate fi folosită de hackeri și spam-uri.
În acest tutorial, vă voi trece printr-o singură soluție pe care o folosesc în aplicațiile mele pentru a separa codul repozitorului de cheile mele. Deși acest lucru nu este potrivit pentru medii mai mari, este o practică pe care o folosesc în mod regulat, care ma ajutat să limitez aceste tipuri de greșeli - da, le-am făcut și eu.
Sigur. Teoretic, ar trebui să funcționeze. Dar am avut experiențe în care ignorarea lui Git nu a funcționat așa cum mă așteptam (probabil din cauza erorii mele). Mai mult, dacă te bazezi pe gitignore
și faceți o eroare, este posibil să nu îl descoperiți până când nu este prea târziu.
O altă abordare este de a plăti pentru depozitele private. Dacă aveți un buget flexibil, acesta funcționează bine. Dar dacă lucrați la proiecte open source sau decideți vreodată să deschideți un proiect vechi, nu este nici o abordare falsă.
Site-urile web programabile De ce cheile API expuse și datele sensibile sunt în creștere Cause pentru îngrijorare liste de cele mai bune practici și sugestii, cum ar fi:
De asemenea, recomandă:
Nu încorporați cheile API, parolele etc. direct în cod, păstrați întotdeauna acestea separate. Puneți cheile API, parolele etc. într-un fișier de configurare separat. Dacă un fișier de configurare face parte dintr-un proiect dintr-un IDE, eliminați datele sensibile înainte de distribuire sau partajare.
Aceasta este abordarea pe care o folosesc pentru propriile proiecte și voi examina cu dvs. mai jos.
Consider că este mai bine să plasați cheile într-un fișier de configurare găzduit în afara directoarelor accesibile publicului web și gestionat manual, în afară de magazia Git.
Am început să folosesc această soluție când am început să lucrez cu Yii 1.1. Yii 2.0 oferă medii configurabile ca parte a șablonului de aplicație avansată, dar nu rezolvă vulnerabilitatea .gitignore
erori.
Abordarea mea este relativ simplă. În loc să încorporez cheile de serviciu și acreditările în fișierele mele de codare direct, îmi plasez cheile într-un fișier de configurare separat care este analizat în timpul scripturilor de inițializare.
De exemplu, iată cum poate arăta abordarea tradițională. Yii oferă un script de configurare care se încarcă pe fiecare pagină de solicitare - observați că toate numele de utilizator, parolele și cheile API sunt vulnerabile la check-in-urile greșite:
array ('connectionname' => 'mysql: host = localhost; dbname = mydatabase', 'emulatePrepare' => true, 'username' utf8 ',' tablePrefix '=>' fox_ ',), // parametrii la nivel de aplicație care pot fi accesați // folosind Yii :: app () -> params [' paramName ']' params '=> array '=> array (' key '=>' H75EAC19M3249! X2 '),' google '=>
Mai degrabă decât să executați acest risc, eu creez un app-config.ini
fișier și plasați-l în afara directorului de depozitare al github. Poate arata cam asa:
mysql_host = "http://host33663.rds.amazon-aws.com" mysql_un = "amzn-app-db7293" mysql_db = "rds-foxesandfences-db" mysql_pwd = "K * $ 1x7B32auiWX91" pushover_key = "H75EAC19M3249! google_maps_api_key = "W69uHsUJZBPhsFNExykbQceK"
Apoi, modific scriptul de configurare pentru a include fișierul folosind parse_ini_file și înlocui setările hardcoded cu variabile de la .ini
fişier:
"config ['mysql_db'], 'emulatePrepare' => true, 'username' => $ config ['mysql_host'] ['mysql_un'], 'password' => $ config ['mysql_pwd'], 'charset' => 'utf8', 'tablePrefix' => 'fox_' / folosind array ('pushover' => array ('key' => $ config ['pushover_key']), 'google' => parola ['paramName' array ('maps_api_key' => $ config ['google_maps_api_key']),), ...); >?
Această abordare sa dovedit a fi destul de simplă și ușor de gestionat pentru mine.
Dacă sunteți un administrator WordPress, ar trebui să fiți conștienți, de asemenea, de cheile API folosite de modulele comune; acestea sunt stocate în baza dvs. de date WordPress. Păstrați-vă actualizările de sistem de operare, WordPress și plugin pentru a evita compromiterea cheilor de alte vulnerabilități.
Abordarea mea este menită să ofere o alternativă de bază, dar cu siguranță nu este ultimul cuvânt. Mi-ar plăcea să vă aud ideile și sugestiile. Vă rugăm să postați comentariile și ideile de mai jos. Aveți posibilitatea să parcurgeți celelalte Tuts + tutoriale pe pagina mea de instructor sau urmați-mă pe Twitter @reifman.