Programavimas

Trylika saugių „Java“ programų kūrimo taisyklių

Sauga yra vienas sudėtingiausių, plačiausių ir svarbiausių programinės įrangos kūrimo aspektų. Programinės įrangos saugumas taip pat dažnai nepaisomas arba per daug supaprastinamas tik keliais nedideliais pakeitimais kūrimo ciklo pabaigoje. Rezultatus galime pamatyti metiniame pagrindinių duomenų saugumo pažeidimų sąraše, kuris 2019 m. Sudarė daugiau kaip 3 milijardus įrašų. Jei tai gali atsitikti „Capital One“, tai gali atsitikti ir jums.

Geros naujienos yra tai, kad „Java“ yra ilgalaikė kūrimo platforma, turinti daug integruotų saugos funkcijų. „Java Security“ paketas buvo intensyviai išbandytas mūšio metu ir dažnai atnaujinamas dėl naujų saugumo spragų. Naujesnė „Java EE Security“ API, išleista 2017 m. Rugsėjo mėn., Pašalina debesų ir mikropaslaugų architektūros pažeidžiamumus. „Java“ ekosistema taip pat apima platų įrankių profilį ir pranešimus apie saugumo problemas.

Tačiau net ir turint tvirtą plėtros platformą, svarbu išlikti budriems. Programų kūrimas yra sudėtinga užduotis, o pažeidžiamumas gali pasislėpti fone. Turėtumėte galvoti apie saugumą kiekviename programos kūrimo etape, pradedant kalbos lygio kalbos funkcijomis ir baigiant API galutinio taško įgaliojimu.

Šios pagrindinės taisyklės yra geras pagrindas kuriant saugesnes „Java“ programas.

„Java“ saugos taisyklė Nr. 1: Parašykite švarų, tvirtą „Java“ kodą

Pažeidžiamumai mėgsta pasislėpti sudėtingumu, todėl laikykite savo kodą kuo paprastesnį, neprarandant funkcionalumo. Naudojant patikrintus dizaino principus, pvz., DRY (nekartokite savęs), galėsite parašyti kodą, kurį lengviau peržiūrėti, ar nėra problemų.

Kode visada atskleiskite kuo mažiau informacijos. Slėpdami išsamią įgyvendinimo informaciją, palaikomas ir saugus kodas. Šie trys patarimai padės pasiekti saugų „Java“ kodą:

  • Gerai išnaudokite „Java“ prieigos modifikatorius. Žinojimas, kaip deklaruoti skirtingus klasių, metodų ir jų atributų prieigos lygius, padės apsaugoti kodą. Viskas, ką galima padaryti privačia, turėtų būti privatu.
  • Venkite apmąstymų ir savistatos. Yra atvejų, kai tokios pažangios technikos yra vertos, tačiau dažniausiai jų reikėtų vengti. Naudojant atspindį pašalinamas stiprus spausdinimas, o tai gali sukelti silpnų vietų ir nestabilumo jūsų kodui. Klasių pavadinimų lyginimas kaip eilutės yra linkęs į klaidas ir gali lengvai sukelti vardų srities susidūrimą.
  • Visada apibrėžkite kuo mažesnį API ir sąsajos paviršių. Atsieti komponentus ir priversti juos sąveikauti kuo mažesnėje srityje. Net jei viena jūsų programos sritis yra užkrėsta pažeidimu, kiti bus saugūs.

„Java“ saugos taisyklė Nr. 2: venkite serijavimo

Tai yra dar vienas kodavimo patarimas, tačiau jis yra pakankamai svarbus, kad būtų pati taisyklė. Serializavimas reikalauja nuotolinio įvesties ir paverčia jį visiškai apdovanotu objektu. Tai nereikalauja konstruktorių ir prieigos modifikatorių ir leidžia nežinomų duomenų srautui tapti vykdomu kodu JVM. Todėl „Java“ serializavimas yra labai nesaugus.

„Java“ serializacijos pabaiga

Jei dar negirdėjote, „Oracle“ planuoja ilgalaikius planus pašalinti serijavimą iš „Java“. „Oracle“ „Java“ platformos grupės vyriausiasis architektas Markas Reinholdas sakė manantis, kad trečdalis ar daugiau visų „Java“ pažeidžiamumų yra susiję su serija.

Kiek įmanoma, venkite savo „Java“ kodo serizavimo / deserializavimo. Verčiau apsvarstykite galimybę naudoti tokį serijos formatą kaip JSON ar YAML. Niekada niekada neatskleiskite neapsaugoto tinklo galinio taško, kuris priima ir veikia serializavimo srautą. Tai yra ne kas kita, kaip pasveikinimo kilimas chaosui.

„Java“ saugos taisyklė Nr. 3: niekada neatskleiskite nešifruotų prisijungimo duomenų ar AII

Sunku patikėti, tačiau ši išvengiama klaida metai iš metų sukelia skausmą.

Kai vartotojas įveda slaptažodį į naršyklę, jis išsiunčiamas kaip paprastas tekstas į jūsų serverį. Tai turėtų būti paskutinis kartas, kai jis išvysta dienos šviesą. Tu turi užšifruokite slaptažodį per vienpusį šifrą prieš palikdami jį duomenų bazėje, tada atlikite tai dar kartą, kai lyginate su ta verte.

Slaptažodžių taisyklės taikomos visai asmenį identifikuojančiai informacijai (AII): kreditinėms kortelėms, socialinio draudimo numeriams ir kt. Bet kokia asmeninė informacija, patikėta jūsų programai, turėtų būti vertinama aukščiausiu lygiu.

Nešifruoti kredencialai arba AII duomenų bazėje yra spraga saugumo spraga, laukianti, kol užpuolikas atras. Taip pat niekada nerašykite neapdorotų kredencialų į žurnalą ir kitaip neperduokite į failą ar tinklą. Vietoj to sukurkite sūdytą maišų savo slaptažodžiams. Būtinai atlikite tyrimą ir naudokite rekomenduojamą maišos algoritmą.

Pereiti prie 4 taisyklės: šifravimui visada naudokite biblioteką; nesivoliok savo.

„Java“ saugos taisyklė Nr. 4: naudokite žinomas ir patikrintas bibliotekas

Pažvelkite į šį klausimą ir atsakymą apie savo saugos algoritmo sukūrimą. Tl; dr pamoka yra: kai įmanoma, naudok žinomas, patikimas bibliotekas ir sistemas. Tai taikoma visame spektre, nuo slaptažodžio maišos iki REST API autorizacijos.

Laimei, čia yra jūsų Java ir jos ekosistema. Taikant programų saugumą, „Spring Security“ yra de facto standartas. Jis siūlo daugybę galimybių ir lankstumą, kad atitiktų bet kokią programos architektūrą, ir apima daugybę saugumo metodų.

Jūsų pirmasis instinktas kovojant su saugumu turėtų būti jūsų tyrimas. Tyrinėkite geriausios praktikos pavyzdžius ir tada išsiaiškinkite, kokia biblioteka jums pritaikys šią praktiką. Pvz., Jei norite naudoti JSON žiniatinklio žetonus autentifikavimui ir prieigai valdyti, pažvelkite į „Java“ biblioteką, kuri apima JWT, ir sužinokite, kaip tai integruoti į „Spring Security“.

Net naudojant patikimą įrankį yra gana lengva susieti autorizaciją ir autentifikavimą. Būtinai judėkite lėtai ir dar kartą patikrinkite viską, ką darote.

„Java“ saugumo taisyklė Nr. 5: būkite paranojiški dėl išorinio įvesties

Nesvarbu, ar vartotojas įveda formą, duomenų saugyklą ar nuotolinę API, niekada nepasitiki išoriniu įėjimu.

SQL įpurškimas ir kelių svetainių scenarijai (XSS) yra tik dažniausiai žinomos atakos, kurias gali sukelti netinkamas išorinio įvesties valdymas. Mažiau žinomas pavyzdys - vienas iš daugelio - yra „milijardo juoko ataka“, kai XML objektų išplėtimas gali sukelti paslaugų atsisakymo ataką.

Visada, kai gausite įnašą, jis turėtų būti patikrintas ir tvarkingas. Tai ypač pasakytina apie viską, kas gali būti pateikta kitam įrankiui ar sistemai apdoroti. Pvz., Jei kažkas gali būti argumentas OS komandinei eilutei: saugokitės!

Ypatingas ir gerai žinomas atvejis yra SQL injekcija, kuriai taikoma kita taisyklė.

„Java“ saugos taisyklė Nr. 6: SQL parametrams tvarkyti visada naudokite paruoštus sakinius

Bet kada kurdami SQL sakinį rizikuojate interpoluoti vykdomojo kodo fragmentą.

Tai žinant, tai yra gera praktika visada naudokite klasę java.sql.PreparedStatement, kad sukurtumėte SQL. Panašios patalpos yra „NoSQL“ parduotuvėse, tokiose kaip „MongoDB“. Jei naudojate ORM sluoksnį, diegimas bus naudojamas Parengta pareiškimass tau po gaubtu.

„Java“ saugos taisyklė Nr. 7: neatskleiskite įgyvendinimo per klaidos pranešimus

Klaidų pranešimai gamyboje gali būti naudingas informacijos šaltinis užpuolikams. „Stack“ pėdsakai gali atskleisti informaciją apie naudojamą technologiją ir kaip ją naudojate. Venkite atskleisti kamino pėdsakus galutiniams vartotojams.

Nepavykusių prisijungimų įspėjimai taip pat patenka į šią kategoriją. Paprastai sutinkama, kad klaidos pranešimas turėtų būti pateiktas kaip „Nepavyko prisijungti“, palyginti su „Neradau to vartotojo“ arba „Neteisingas slaptažodis“. Pasiūlykite kuo mažiau pagalbos kenksmingiems vartotojams.

Geriausia, jei klaidos pranešimai neturėtų atskleisti jūsų programos pagrindinės technologijos. Laikykite šią informaciją kuo neskaidresnę.

„Java“ saugumo taisyklė Nr. 8: atnaujinkite saugos leidimus

Nuo 2019 m. „Oracle“ įdiegė naują „Java“ licencijavimo schemą ir išleidimo tvarkaraštį. Deja, kūrėjams naujoji leidimo kadencija nepalengvina. Nepaisant to, esate atsakingas už tai, kad dažnai tikrinate, ar nėra saugos naujinių, ir pritaikote juos savo JRE ir JDK.

Įsitikinkite, kad žinote, kokie kritiniai pataisymai yra prieinami, reguliariai tikrindami „Oracle“ pagrindinį puslapį, ar nėra saugos įspėjimų. Kiekvieną ketvirtį „Oracle“ pateikia automatinį pataisos atnaujinimą dabartinei „Java“ LTS (ilgalaikio palaikymo) laidai. Bėda ta, kad pleistras yra prieinamas tik tuo atveju, jei mokate už „Java“ palaikymo licenciją.

Jei jūsų organizacija moka už tokią licenciją, vadovaukitės automatinio atnaujinimo keliu. Jei ne, tikriausiai naudojate „OpenJDK“ ir pataisą turėsite atlikti patys. Tokiu atveju galite pritaikyti dvejetainį pleistrą arba tiesiog pakeisti esamą „OpenJDK“ diegimą naujausia versija. Arba galite naudoti komerciškai palaikomą „OpenJDK“, pvz., „Azul“ „Zulu Enterprise“.

Ar jums reikia kiekvieno saugos pleistro?

Atidžiai stebėdami saugos įspėjimus galite pastebėti, kad jums nereikia tam tikro naujinių rinkinio. Pavyzdžiui, 2020 m. Sausio mėn pasirodo būti kritiniu „Java“ atnaujinimu; tačiau atidžiai skaitant paaiškėjo, kad atnaujinimas užtaiso tik „Java“ programėlių saugos spragas ir neturi įtakos „Java“ serveriams.

„Java“ saugos taisyklė Nr. 9: ieškokite priklausomybės pažeidžiamumų

Yra daugybė įrankių, leidžiančių automatiškai nuskaityti kodų bazę ir priklausomybes nuo pažeidžiamumo. Viskas, ką jums reikia padaryti, tai juos naudoti.

OWASP, „Open Web Application Security Project“, yra organizacija, skirta kodo saugumui gerinti. OWASP patikimų, aukštos kokybės automatinių kodų nuskaitymo įrankių sąraše yra keli į „Java“ orientuoti įrankiai.

Reguliariai tikrinkite savo kodų bazę, tačiau taip pat stebėkite trečiųjų šalių priklausomybę. Užpuolikai taikosi ir į atvirojo, ir į uždaro kodo bibliotekas. Stebėkite, ar nėra jūsų priklausomybių, ir atnaujinkite savo sistemą, kai išleidžiami nauji saugos pataisymai.

„Java“ saugos taisyklė Nr. 10: Stebėkite ir registruokite vartotojo veiklą

Net paprasta žiaurios jėgos ataka gali būti sėkminga, jei aktyviai nestebite savo programos. Norėdami stebėti programos būklę, naudokite stebėjimo ir registravimo įrankius.

Jei norite įsitikinti, kodėl stebėjimas yra svarbus, tiesiog atsisėskite ir žiūrėkite TCP paketus savo programų klausymosi prievade. Matysite įvairią veiklą, kur kas daugiau nei paprasta naudotojo sąveika. Dalis šios veiklos bus robotai ir piktadariai, ieškantys pažeidžiamumų.

Turėtumėte registruotis ir stebėti nepavykusius prisijungimo bandymus ir taikyti priešines priemones, kad nuotoliniai klientai negalėtų atakuoti nebaudžiamai.

Stebėjimas gali įspėti apie nepaaiškinamus šuolius, o registravimas gali padėti išsiaiškinti, kas nutiko po atakos. „Java“ ekosistema apima daugybę komercinių ir atvirojo kodo sprendimų registravimui ir stebėjimui.

„Java“ saugos taisyklė Nr. 11: Saugokitės Denial of Service (DoS) atakų

Kaskart, kai apdorojate potencialiai brangius išteklius arba atliekate potencialiai brangias operacijas, turėtumėte apsisaugoti nuo pasprukusių išteklių naudojimo.

„Oracle“ saugių „Java SE“ dokumentų saugių kodavimo gairių skiltyje „Paslaugos atsisakymas“ palaiko galimų šio tipo problemų sukėlėjų sąrašą.

Iš esmės, bet kada, kai einate atlikti brangių operacijų, pvz., Išpakuoti suglaudintą failą, turėtumėte stebėti, ar nėra sprogstančių išteklių. Nepasitikėkite failų manifestais. Pasitikėkite tik faktiniu diske ar atmintyje suvartotu kiekiu, stebėkite jį ir saugokitės, kad serveris neatsikeltų ant kelių.

Panašiai, atliekant tam tikrą apdorojimą, svarbu stebėti, ar nėra netikėtų amžinai kilpų. Jei įtariama kilpa, pridėkite apsaugą, užtikrinančią, kad kilpa daro pažangą, ir trumpai ją sujungite, jei atrodo, kad ji tapo zombiu.

„Java“ saugos taisyklė Nr. 12: apsvarstykite galimybę naudoti „Java“ saugos tvarkyklę

„Java“ turi saugos vadybininką, kurį galima naudoti norint apriboti išteklius, prie kurių veikia vykdomas procesas. Tai gali izoliuoti programą atsižvelgiant į diską, atmintį, tinklą ir JVM prieigą. Susiaurinus šiuos programos reikalavimus, sumažėja galimos atakos žalos pėdsakas. Toks izoliavimas taip pat gali būti nepatogus, todėl „SecurityManager“ pagal numatytuosius nustatymus neįgalinta.

Turėsite patys nuspręsti, ar dirbti aplink „SecurityManager“Tvirta nuomonė yra verta papildomo jūsų programų apsaugos lygio. Žr. „Oracle“ dokumentus, kad sužinotumėte daugiau apie „Java“ saugos tvarkyklės sintaksę ir galimybes.

„Java“ saugos taisyklė Nr. 13: apsvarstykite galimybę naudoti išorinę debesies autentifikavimo paslaugą

Kai kurios programos tiesiog turi turėti savo vartotojo duomenis; likusioms dalims debesų paslaugų teikėjas galėtų turėti prasmę.

Ieškokite aplinkui ir rasite daugybę debesų autentifikavimo paslaugų teikėjų. Tokios paslaugos privalumas yra tas, kad teikėjas yra atsakingas už neskelbtinų vartotojo duomenų apsaugą, o ne jūs. Kita vertus, pridėjus autentifikavimo paslaugą, jūsų įmonės architektūra tampa sudėtingesnė. Kai kurie sprendimai, pvz., „FireBase“ autentifikavimas, apima SDK, skirtus integruoti visoje rietuvėje.

Išvada

Pateikiau 13 taisyklių, kaip kurti saugesnes „Java“ programas. Šios taisyklės yra patikrintos ir teisingos, tačiau didžiausia taisyklė yra tokia: būkite įtartinas. Programinės įrangos kūrimą visada vertinkite atsargiai ir saugiai. Ieškokite kodo pažeidžiamumų, pasinaudokite „Java“ saugos API ir paketų privalumais ir naudokite trečiųjų šalių įrankius, kad stebėtumėte ir registruotumėte kodą dėl saugos problemų.

Čia yra trys geri aukšto lygio ištekliai, skirti neatsilikti nuo nuolat besikeičiančios „Java“ saugos aplinkos:

  • 10 geriausių „OWASP“
  • „CWE 25“
  • „Oracle“ saugaus kodo gairės

Šią istoriją „Trylika saugių„ Java “programų kūrimo taisyklių“ iš pradžių paskelbė „JavaWorld“.