Pe măsură ce infrastructurile IT migrează în cloud, iar sistemele și aplicațiile devin accesibile în afara clasicului perimetru de rețea, este tot mai clar că protejarea acestora de amenințările și atacurile cibernetice devine o provocare dar și o oportunitate în același timp. De ce o provocare, dar mai ales de ce o oportunitate, am să explic în rândurile de mai jos.
Adevărul este că securitatea cibernetică a fost dintotdeauna cenușăreasa procesului de dezvoltare a produselor IT, mai ales când vorbim de dezvoltare software. Mai exact, securizarea unui produs se face de cele mai multe ori pe ultima sută de metri a procesului de dezvoltare sau chiar după finalizarea acestuia. Presiunea lansării cât mai rapidă a produselor face ca de multe ori să se opteze pentru rezolvarea eventualelor probleme (de funcționalitate sau de securitate) în perioada de mentenanță a produsului. Și de aici vin majoritatea problemelor. Cred că ne-am obișnuit cu toții cu avalanșa de actualizări de software pentru mai toate tehnologiile pe care le folosim, de foarte multe ori la puțin timp după lansarea acestora.
Istoric, securizarea infrastructurilor IT s-a bazat pe conceptul de securitate perimetrală, adică pe limitarea expunerii sistemelor și aplicațiilor în Internet sau alte rețele externe, astfel încât să nu poată fi accesate decât din "rețeaua internă" (Intranet). Această metodă a avut un succes relativ, pentru că sistemele respective rămân expuse amenințărilor interne (insider threats) și este de ajuns să se compromită un singur terminal (stație de lucru, server) ca ulterior să se poată ataca toate sistemele și aplicațiile la care acest terminal are vizibilitate. Plus că era important ca anumite sisteme să fie totuși expuse în Internet, precum serverele web, de aici și preferința atacatorilor pentru site-urile web ale companiilor.
Provocarea actuală constă în faptul că organizațiile sunt nevoite să expună tot mai multe sisteme și aplicații în Internet, pentru a putea fi accesate de utilizatori și clienți de oriunde s-ar afla aceștia. Mai mult, nevoia de mobilitate a propriilor angajați dar și tendința lucrului de acasă au desființat practic conceptul de securitate perimetrală. Securitatea cibernetică a unei organizații este acum la fel de eficientă pe cât de securizate sunt fiecare servere, aplicații și stații de lucru în parte. Pandemia de COVID-19 a scos și mai mult în evidență aceste realități, o mulțime de oameni fiind nevoiți să lucreze de acasă și să acceseze sistemele și aplicațiile companiei folosind propria conexiune la Internet.
Cum spuneam, toate acestea reprezintă o provocare, dar mai cu seamă trebuie să reprezinte o oportunitate. Sistemele și aplicațiile trebuie să fie cât mai autonome din punct de vedere al securității cibernetice. Vulnerabilitățile de securitate trebuie să fie în primul rând identificate și rezolvate, nu mascate cu tehnologiile de tip Next Generation Firewall (NGFW) și Web Application Firewall (WAF).
În ultimii ani am putut observa o explozie a atacurilor cibernetice soldate cu scurgeri de date confidențiale, pierderi financiare sau de altă natură. Doar că în marea majoritate a cazurilor aceste atacuri au fost posibile datorită unor sisteme și aplicații vulnerabile, sau datorită neimplementării unor măsuri și proceduri de securitate standard. Înainte de a investi în tehnologii și servicii sofisticate de securitate cibernetică, companiile ar trebui să implementeze un program serios de management al vulnerabilităților și de dezvoltare software conform unor standarde și bune practici. Managementul vulnerabilităților este un proces continuu de identificare, analiză și remediere a problemelor de securitate din cadrul sistemelor și aplicațiilor.
Următoarele 10 recomandări de secure coding și-au demonstrat eficiența în eliminarea problemelor de securitate a aplicațiilor:
Validați inputul. Acordați atenția cuvenită și validați inputul preluat din surse externe, precum argumente de tip command line, variabile de tip environment, fișiere aflate sub controlul utilizatorului etc.
Compilați folosind cel mai înalt nivel de avertizare. Eliminați fiecare avertizare de compilator prin modificarea codului. Utilizați unelte de analiză statică și dinamică a codului și eliminați problemele adiționale de securitate;
Includeți politicile de securitate. Gândiți arhitectura software astfel încât să permită implementarea și impunerea politicilor de securitate necesare;
Design simplu (KISS). Încercați să mențineți un design cât mai simplu și eficient al aplicației;
Refuzați accesul în mod implicit (default deny). Gândiți accesul pe bază de permisiuni și nu pe excluziuni. Astfel, în mod implicit accesul este refuzat, iar schema de protecție identifică acele condiții în care accesul este permis;
Acordați cât mai puține privilegii în mod implicit (least privilege). Fiecare proces trebuie să ruleze cu minimul de privilegii necesare pentru scopul acestuia;
Igienizați (Sanitizați) datele trimise către alte sisteme și aplicații. Atacatorii pot reuși să acceseze funcționalități neutilizate ale sistemelor complexe prin intermediul unor comenzi de tip SQL Injection, Command Injection sau de altă natură;
Implementați conceptul de apărare în adâncime (defense in depth). Gestionați riscurile de securitate cu mai multe strategii/metode/nivele, astfel încât dacă un nivel de securitate se dovedește a fi ineficient, un alt nivel va preveni exploatarea vulnerabilității sau va limita consecințele unei exploatări.
Utilizați tehnici eficiente de control al calității (quality assurance). Testarea de tip fuzzing, testele de penetrare a securității (pentests) și auditul codului sursă se pot dovedi a fi foarte eficiente în eliminarea vulnerabilităților de securitate.
În cadrul NTT DTA Romania acordăm importanța cuvenită principiilor security by design și secure coding. Țin să închei cu un îndemn pentru întreaga comunitate a programatorilor de a face acest lucru, "scriind" astfel un viitor mai bun și mai sigur pentru mediul de business și pentru fiecare dintre noi.