În epoca digitală actuală, dezvoltarea software-ului web a devenit mai accesibilă și mai eficientă ca niciodată. Avem la dispoziție o serie de instrumente și tehnologii avansate, care au simplificat considerabil procesul de configurare, permițându-ne să creăm și să lansăm aplicații mult mai rapid. Cu toate acestea, în această cursă spre inovație și funcționalitate, unul din aspectele cruciale care nu trebuie neglijate este securitatea.
Deși auditurile de securitate pot varia semnificativ de la un proiect la altul, cele mai riguroase fiind adesea delegate unor entități terțe pentru imparțialitate, responsabilitatea de a asigura o fundație solidă de securitate în cadrul fiecărui proiect ne revine în mod direct. Prin acest articol, o să încerc să acopăr bazele pentru această fundație, care ar putea fi ușor adaptate și aplicate ca standard, indiferent de dimensiunile și nevoile proiectelor.
Cu siguranță, există multe alte strategii și acțiuni pe care le putem face ca să ne asigurăm partea de securitate și confidențialitate a datelor. Cu scopul de a generaliza și simplifica majoritatea acestor activități, vreau să menționez câteva categorii pe care le putem aplica ușor și au și rezultate.
Prima categorie ar fi acțiunile administrative. Acestea ne ajută să ne structurăm echipa în așa fel încât să putem limita riscurile: de exemplu, crearea unui rol de responsabil al review-urilor, limitarea accesului persoanelor care nu lucrează activ pe proiect sau migrarea spre unele tooluri care au o suită de strategii de securitate solide.
A doua categorie de acțiuni ar fi cele de implementare. Acestea sunt modificări pe care le putem efectua chiar în cod, iar majoritatea punctelor menționate mai jos vor fi cuprinse în această categorie. Categoria cuprinde mai multe exemple, iar partea bună este că cele mai multe frameworkuri moderne vor avea implementări care deja tratează aceste cazuri, precum sisteme împotriva atacurilor cunoscute (SQL injection, CSRF, cross-site scripting și multe altele).
Ultimul tip la care ne vom referi în acest articol este cel de DevSecOps. În ultimii ani, contopirea rolurilor de "development" și a celor de "operations" a creat rolul de DevOps, iar conceptul de DevSecOps acoperă și nevoia de securitate. În punctul menționat mai sus, am făcut trimitere la ceea ce putem face din punctul de vedere al developmentului, dar există o serie de acțiuni pe care le putem face și la nivel de operations. Mai clar, asta ar include toate punctele de mai jos la nivel de configurare a proiectului, a procesului de deployment sau a infrastructurii.
Ținând cont de acestea, în rândurile de mai jos vom expune care sunt cele 10 puncte pe care le poți aplica în organizația sau în proiectele tale:
Setarea unor reguli de code review la nivel de proiect poate avea beneficii și în securitatea proiectelor, nu doar la nivel de stil; echipa ta își poate seta un set de reguli "best practices" la nivel de securitate pe care echipa de review să o verifice constant.
Tododată, putem aplica și static code analysis, cu ajutorul unor tooluri care fac asta cu o simplă comandă, pentru majoritatea limbajelor de programare și a frameworkurilor populare. Aceste tooluri sunt mereu ținute la curent cu ultimele vulnerabilități descoperite și recomandă schimbări în implementare sau versiuni mai noi ale dependințelor din proiect care să nu fie expuse acestor vulnerabilități.
Criptarea este cea mai populară metodă de a ascunde datele față de cei care vor să intercepteze transferul acestora, prin folosirea protocolului https în loc de http.
Totodată, se recomandă criptarea datelor și "at rest", mai exact în baza de date, nu doar în tranzit. Asta ar însemna adăugarea unui strat extra de securitate la nivelul bazei de date. Dacă cineva reușește să obțină acces la server, este important ca datele să nu poată fi accesate fără o cheie de decriptare
Un ultim punct al acestei liste ar fi criptarea datelor sensibile în interiorul bazei de date; aceste date pot fi citite doar de software-ul scris de noi, cu ajutorul unor chei de criptare. Un exemplu popular pentru cazul acesta ar fi criptarea parolelor, dar există multe alte coloane din tabelele noastre pe care le-am dori criptate, precum date bancare.
În cazul unor atacuri de tip DDoS sau a unor situații neplăcute în care baza de date a fost compromisă și accesul nostru la ea a fost restricționat, aceste backupuri și strategii de restaurare ne vor permite să recreăm varianta cu toate datele utilizatorilor, după remedierea situației.
Majoritatea furnizorilor de soluții cloud pun la dispoziție o suită de tooluri care au integrate diverse strategii de backup, restaurare și recuperare, nouă revenindu-ne responsabilitatea de a le seta corespunzător.
Strategii de acces pe platformele folosite
În funcție de platformele folosite și strategiile din acest punct vor fi diferite, dar majoritatea pun la dispoziție posibilități similare. Pentru simplitate, voi aborda doar platforme de infrastructură (cloud providers), dar acestea pot fi extrapolate și în alte cazuri.
O soluție foarte populară ar fi să urmărim "principle of least privilege" (principiul celui mai mic privilegiu), care ne spune să oferim acces contribuabililor doar la serviciile de care au nevoie zi de zi, în loc de a oferi acces la toate. Un exemplu ar fi prin platforma AWS, care oferă o serie de drepturi foarte bine segregate. În cazul în care cineva dorește să schimbe ceva la care nu are acces, va fi nevoie de confirmarea administratorului. Desigur, un avantaj ar veni și în cazul în care o persoană rău intenționată pune mâna pe unul din aceste conturi, acesta va fi limitat și nu va putea modifica orice.
Acesta este un punct ce poate deveni foarte complex. Există multe strategii de securizare, în funcție de nevoile platformei, comunicarea cu alte sisteme sau contextul în care va fi folosit.
Securizarea API-urilor se poate face prin adăugarea unor strategii precum: IP whitelisting (aplicabil în cazul în care acesta va fi accesat doar de aplicații create în colaborare cu echipa de dezvoltare a API-ului), folosirea access tokens (care, în funcție de tipul de API, ar putea fi de diferite tipuri - OAuth, API keys etc.) sau limitarea accesului doar din interiorul unui VPN.
Totodată, în anumite cazuri, se pot implementa și rate limiters, în special pentru protecția împotriva atacurilor DDoS sau pentru limitarea funcționalităților care pot costa, de exemplu trimiterea unor SMS-uri.
Este vital ca aplicațiile software să aibă un sistem de logare a tuturor acțiunilor, precum și un sistem de monitorizare. Acestea ar permite ca, în cazul unui atac, sau a activității suspicioase, să avem acces la toată informația de care avem nevoie pentru a remedia cât mai repede.
Totodată, implementarea unor alerte pentru activitate suspicioasă sau pentru erorile de sistem ar permite reducerea timpului în care sistemul este nefuncțional.
Deși există specializări specifice pentru aceste strategii, în ultimul timp formarea rolului DevSecOps a permis tratarea problemelor complexe și de către developeri, cu ajutorul unor serii de verificări și bune practici pe care le putem urma și cu expertiză minimă în domeniu.
Prima de pe această listă, ar fi segregarea mediilor de dezvoltare, care ne-ar ajuta să ne asigurăm că folosim chei de acces, chei de decriptare și să setăm conturi diferite pentru producție, față de cele de dezvoltare și test.
Totodată, există o serie de configurări pe care le putem face pentru a îmbunătăți siguranța infrastructurii noastre: precum stocarea criptată a secretelor sau adăugarea unor chei de acces cu perioadă de expirare pentru accesul fișierelor pe bază de URL.
Indiferent de platformele Cloud cu care lucrăm sau instrumentele open source pe care le folosim, este important să le ținem mereu actualizate, deoarece acestea primesc "security patches" constant.
În cazul în care lucrăm cu o arhitectură bazată pe microservicii, este important ca pentru microserviciile care expun date sau comunică doar cu alte servicii din sistemul nostru, să limităm accesul acestora, astfel încât să nu poată fi accesate altfel. Totodată, folosirea unui "service mesh" ar putea facilita comunicarea între servicii.
Este important să respectăm standardele cheilor de acces și să generăm ID-uri de sesiune, chei de acces etc. cât mai sigure, folosind algoritmi complecși, astfel încât decriptarea acestora să fie cât mai dificilă.
Totodată, implementarea unui sistem de expirare pentru aceste chei ajută la restricționarea accesului în cazul în care cineva obține acces la o astfel de cheie și îngreunează exploatarea.
Cu ajutorul unor baze de date menținute constant, avem acces la o serie de vulnerabilități comune, față de care este important să ne protejăm sistemele. În special când discutăm de site-urile web, printre cele mai populare astfel de vulnerabilități ar fi Cross-Origin Resource Sharing (CORS) sau Cross-Site Scripting (XSS). Un alt exemplu foarte comun ar fi SQL injection, iar majoritatea frameworkurilor deja au o variantă care să ne ajute să evităm această exploatare.
Există și multe alte vulnerabilități comune, de le luat în considerare și pe care le putem găsi în o bază de date precum https://www.cvedetails.com/.
În procesul de dezvoltare ne gândim, de multe ori, la optimizarea performanței, folosirea celor mai populare frameworkuri sau la dezvoltarea cât mai rapidă a funcționalităților, dar este crucial să nu uităm și de elementul de securitate.
Desigur, există multe alte puncte pe care le putem adăuga în procesul nostru de dezvoltare care să ne ajute în dezvoltarea unor sisteme mai sigure și protejate împotriva atacatorilor. Această listă este gândită ca un ajutor pentru bune practici în perioada de implementare, permițând totodată și adaptarea pentru a servi ca o verificare regulată.