Programavimas

Esminis „MongoDB“ saugumo vadovas

Davidas Murphy yra „MongoDB“ praktikos vadovas „Percona“, teikiantis verslo klasės „MySQL“ ir „MongoDB“ sprendimus ir paslaugas.

„MongoDB“ apsauga vėl yra naujienose. Neseniai pasklidę pasakojimai atskleidžia, kaip įsilaužėliai pasisavino „MongoDB“ duomenų bazes ir išpirkinėjo duomenis bitkoinams. Pasak „Rapid7“, buvo pažeista dešimtys tūkstančių „MongoDB“ įrenginių.

Mes visi nerimaujame dėl saugumo. Jei vykdote programas, tinklus ar duomenų bazes, sauga visada yra svarbiausia problema. Kai daugiau įmonių kreipiasi į atvirojo kodo programinę įrangą, pvz., „MongoDB“, saugodamos svarbius įmonės duomenis, saugumas tampa dar didesniu klausimu. Priklausomai nuo jūsų verslo, taip pat gali būti keli vyriausybiniai (pvz., Sveikatos draudimo perkėlimo ir atskaitomybės įstatymas arba HIPAA) arba verslo (Mokėjimo kortelių pramonės duomenų saugumo standartas arba PCI DSS) tinklo saugumo reguliavimo standartai, kurių turite laikytis.

Ar „MongoDB“ duomenų bazės programinė įranga yra saugi? Ar jis atitinka šiuos standartus? Trumpas atsakymas: taip, taip ir yra! Tiesiog reikia žinoti, kaip nustatyti, konfigūruoti ir dirbti su konkrečiu įrenginiu.

Šiame straipsnyje aptarsiu „MongoDB“ saugumą. „MongoDB“ naudoti yra saugu - jei žinote, ko ieškoti ir kaip jį sukonfigūruoti.

Visų pirma, kaip žmonės klysta dėl „MongoDB“ saugumo? Yra kelios pagrindinės sritys, keliančios vartotojus, kai kalbama apie „MongoDB“ saugumą:

  • Naudojant numatytuosius prievadus
  • Iš karto neįgalinamas autentifikavimas (didžiausia problema!)
  • Naudojant autentifikavimą suteikiant visiems plačią prieigą
  • Nenaudojant LDAP priversti slaptažodžio pasukimą
  • Neverskite SSL naudojimo duomenų bazėje
  • Neribojama prieiga prie žinomų tinklo įrenginių duomenų bazės (programų pagrindiniai kompiuteriai, apkrovos balansatoriai ir pan.)
  • Neribojama, kuris tinklas klausosi (tačiau tai nebeturi įtakos palaikomoms versijoms)

„MongoDB“ turi penkias pagrindines saugumo sritis:

  • Autentifikavimas. LDAP autentifikavimas centralizuoja jūsų įmonės katalogo elementus.
  • Leidimas. Įgaliojimas apibrėžia, kokią vaidmens pagrindu suteikiamą prieigą valdo duomenų bazė.
  • Šifravimas. Šifravimą galima suskirstyti į poilsio ir tranzito režimus. Šifravimas yra labai svarbus užtikrinant „MongoDB“.
  • Auditas. Auditas reiškia galimybę pamatyti, kas ką padarė duomenų bazėje.
  • Valdymas. Valdymas reiškia dokumentų patvirtinimą ir neskelbtinų duomenų (pvz., Sąskaitos numerio, slaptažodžio, socialinio draudimo numerio ar gimimo datos) tikrinimą. Tai reiškia ir žinojimą, kur yra neskelbtini duomenys, ir užkirsti kelią neskelbtinų duomenų įvedimui į sistemą.

LDAP autentifikavimas

„MongoDB“ turi įmontuotus vartotojo vaidmenis ir pagal numatytuosius nustatymus juos išjungia. Tačiau jis praleidžia tokius dalykus kaip slaptažodžio sudėtingumas, rotacija pagal amžių, taip pat centralizavimas ir vartotojo vaidmenų bei paslaugų funkcijų identifikavimas. Tai yra būtina norint priimti tokius reikalavimus kaip PCI DSS laikymasis. Pavyzdžiui, PCI DSS draudžia naudoti senus slaptažodžius ir lengvai sulaužomus slaptažodžius ir reikalauja pakeisti vartotojo prieigą, kai keičiasi būsena (pavyzdžiui, kai vartotojas palieka skyrių ar įmonę).

Laimei, LDAP galima naudoti daugeliui šių spragų užpildyti. Daugelis jungčių leidžia naudoti „Windows Active Directory“ (AD) sistemas kalbant su LDAP.

Pastaba: LDAP palaikymas galimas tik „MongoDB Enterprise“. Tai nėra bendruomenės versijoje. Jis prieinamas kitose atvirojo kodo „MongoDB“ versijose, pvz., „Percona Server for MongoDB“.

„MongoDB 3.2“ saugo vartotojus LDAP, bet ne vaidmenis (jie šiuo metu saugomi atskirose mašinose). „MongoDB 3.4 Enterprise“ turėtų įdiegti galimybę saugoti vaidmenis LDAP, kad būtų galima naudotis centralizuotai. (Vėliau aptarsime vaidmenis.)

Percona

Naudodami LDAP ir AD, galite susieti vartotojus su savo įmonės katalogu. Kai jie pakeičia vaidmenis arba palieka įmonę, žmogiškieji ištekliai gali juos pašalinti iš jūsų duomenų bazės grupės. Taigi, jūs turite automatizuotą sistemą, užtikrinančią, kad tai gali padaryti tik tie, kuriuos norite pasiekti duomenis rankiniu būdu, netyčia kažko nepraleidžiant.

LDAP Mongo kalba iš tikrųjų yra lengvas. „MongoDB“ turi specialią komandą, liepiančią patikrinti išorinę LDAP duomenų bazę: $ external.

Keletas kitų LDAP naudojimo įspėjimų:

  • Sukurkite vartotoją naudodami .createUser kaip paprastai, bet būtinai eikite su db / collection išteklių žymomis.
  • Be to, LDAP autentifikavimui reikia dar dviejų laukų:
    • mechanizmas: „PLAIN“
    • digestPassword: klaidingas

Pasirinktiniai vaidmenys

Vaidmenimis pagrįsta prieigos kontrolė (RBAC) yra pagrindinė „MongoDB“ dalis. Įmontuotus vaidmenis „MongoDB“ galima naudoti nuo 2.6 versijos. Jūs netgi galite kurti patys, iki konkrečių veiksmų, kuriuos tam tikram vartotojui gali būti leidžiama atlikti. Tai leidžia tiksliai apibrėžti, ką konkretus vartotojas gali padaryti ar pamatyti skustuvu. Tai yra pagrindinė „MongoDB“ funkcija, kurią galima įsigyti beveik kiekviename pardavėjo atvirojo kodo programinės įrangos variante.

Penki pagrindiniai integruoti „MongoDB“ vaidmenys, kuriuos turėtumėte žinoti:

  • skaityti:
    • Tik skaitymo prieiga, paprastai suteikiama daugumai vartotojų
  • skaityk rašyk:
    • skaityk rašyk prieiga leidžia redaguoti duomenis
    • skaityk rašyk apima skaitymą
  • dbSavininkas:
    • Apima skaityk rašyk, dbAdmin, userAdmin (duomenų bazei). userAdmin reiškia vartotojų pridėjimą ar pašalinimą, privilegijų suteikimą vartotojams ir vaidmenų kūrimą. Šios teisės suteikiamos tik konkrečiam duomenų bazės serveriui.
  • dbAdminAnyDatabase:
    • Kuria dbAdmin visose duomenų bazėse, tačiau neleidžia vartotojams administruoti (pavyzdžiui, kurti ar pašalinti vartotojų). Galite kurti indeksus, skambučių tankinimą ir dar daugiau. Tai nesuteikia skaldomos prieigos.
  • šaknis:
    • Tai yra supernaudotojas, tačiau su ribomis
    • Tai gali padaryti daugelį dalykų, bet ne visus:
      • Nepavyko pakeisti sistemos kolekcijos
      • Kai kurios komandos vis dar nepasiekiamos šiam vaidmeniui, atsižvelgiant į versiją. Pvz., „MongoDB 3.2“ šakninis vaidmuo neleidžia pakeisti „oplog“ ar „profiler“ dydžio, o „MongoDB 3.4“ šaknies vaidmuo neleidžia perskaityti dabartinių rodinių.

Vietos simbolių duomenų bazės ir kolekcijos

Pakaitinis simbolis reiškia leidimų suteikimą didelėms duomenų bazių ar kolekcijų grupėms (arba visoms) serveryje. Turėdami nulinę vertę, galite nurodyti visas duomenų bazes ar rinkinius ir išvengti dbAdminAnyDatabase vaidmuo. Tai suteikia konkretiems vartotojams visas privilegijas, įskaitant administravimo funkcijas.

Tai pavojinga.

Kai naudojate pakaitos simbolius, suteikiate daug specialių privilegijų ir turėtumėte žinoti, kad atveriate galimas atakos galimybes:

  • readWriteAnyDatabase yra nepaprastai vartotojų vardai ir vaidmenys gali būti užpulti per programos vartotoją
  • Pakaitos simbolių naudojimas reiškia, kad konkrečių programų neapribosite tik konkrečiomis duomenų bazėmis
  • Pakaitinis simbolis neleidžia naudoti daugialypės informacijos su keliomis duomenų bazėmis
  • Naujoms duomenų bazėms nėra automatiškai suteikiama prieiga

Tinkinto vaidmens kūrimas

„MongoDB“ vaidmenų galia atsiranda kuriant pasirinktinius vaidmenis. Tinkintame vaidmenyje galite nurodyti, kad bet kuriam veiksmui su bet kuriuo ištekliu galima nurodyti konkretų vartotoją. Naudodamiesi tokiu detalumo lygiu, galite giliai kontroliuoti, kas ką gali padaryti jūsų „MongoDB“ aplinkoje.

Nurodžius pasirinktinį vaidmenį, yra keturi skirtingi išteklių tipai:

  • db. Nurodo duomenų bazę. Vardui galite naudoti eilutę arba „bet kokiam“ (be pakaitos).
  • kolekcija. Nurodo dokumentų rinkinį. Galite naudoti eilutę pavadinimui arba „“ bet kokiam (be pakaitos).
  • klasteris. Nurodo suskaidytą sankaupą ar kitus metaduomenų išteklius. Tai yra tikroji / klaidinga loginė reikšmė.
  • anyResource. Nurodo prieigą prie bet ko ir bet kur. Tai yra tikroji / klaidinga loginė reikšmė.

Bet koks vaidmuo gali paveldėti kito vaidmens savybes. Yra masyvas, vadinamas „vaidmenimis“, ir jūs galite atsisakyti naujo vaidmens masyve. Tai paveldės nurodyto vaidmens savybes.

Naudokite createRole pridėti masyvo vaidmenį.

Galite pridėti naujų ar esamų duomenų bazių prie vartotojo ar vaidmens. Pvz., Galite pridėti skaitymo ir rašymo prieigą prie duomenų bazės, pridėdami duomenų bazę prie vaidmens.

Naudoti grantPrivilegesToRole komanda pridėti naujų išteklių prie esamo vaidmens.

Žemiau pateikiamas naujo „Super“ vartotojo vaidmens kūrimo pavyzdys. Šio vaidmens tikslas vėlgi yra turėti vieną vartotoją, kuris jokiu būdu nėra ribojamas MongoDB aplinkoje (kritinėms situacijoms).

db = db.geSiblingDB („administratorius“);

db.createRole ({

vaidmuo: „superRoot“,

privilegijos: [{

šaltinis: {anyResource: true},

veiksmai: [„anyAction“]

     }]     

vaidmenys: []

});

db.createUser ({

vartotojas: „comanyDBA“,

pwd: „EWqeeFpUt9 * 8zq“,

vaidmenys: [„superRoot“]

})

Šios komandos sukuria naują vaidmenį duomenų bazėje geSiblingDB paskambino superRoot ir priskirkite tam vaidmeniui bet kokį šaltinį ir veiksmą. Tada mes sukuriame naują vartotoją toje pačioje duomenų bazėje, vadinamą kompanijaDBA (su slaptažodžiu) ir priskirkite naują superRoot vaidmuo.

SSL naudojimas visiems dalykams

SSL padeda užtikrinti jūsų duomenų saugumą per nesaugius tinklus. Jei naudojate duomenų bazę, kuri sąveikauja su internetu, turėtumėte naudoti SSL.

Yra dvi labai geros priežastys naudoti SSL MongoDB apsaugai: privatumas ir autentifikavimas. Be SSL prie jūsų duomenų galima prieiti, juos nukopijuoti ir naudoti neteisėtais ar žalingais tikslais. Su autentifikavimu turite antrinį saugos lygį. SSL privataus rakto infrastruktūra (PKI) garantuoja, kad prie „MongoDB“ gali prisijungti tik vartotojai, turintys teisingą CA sertifikatą.

„MongoDB“ ilgą laiką turėjo SSL palaikymą, tačiau pastarosiose keliose versijose smarkiai pagerėjo SSL palaikymas. Anksčiau, jei norėjote naudoti SSL, turėjote jį atsisiųsti ir rankiniu būdu kompiliuoti naudodami „MongoDB Community“ versiją. Nuo „MongoDB 3.0“ pagal numatytuosius nustatymus SSL kompiliuojamas su programine įranga.

Senosiose „MongoDB“ versijose taip pat nebuvo tinkamo pagrindinio kompiuterio patikrinimo; pagrindinio kompiuterio patvirtinimas buvo tik žymėjimas, kurį galite patikrinti konfigūracijos faile, kuris patenkino SSL užklausą iš ryšio.

Naujausiose MongoDB SSL versijose yra šios pagrindinės funkcijos:

  • Tikrina galiojančius pagrindinius kompiuterius (nebūtina)
  • Galimybė nurodyti konkretų sąrankos .key failą, kurį norite naudoti
  • Savarankiškai pasirašytų sertifikatų arba alternatyvių pasirašytojų pažymėjimų tarnyba (CA)
  • leistiSSL, teikia pirmenybę SSL, reikalautiSSL režimai, leidžiantys pasirinkti SSL naudojimo detalumą (nuo mažiau saugaus iki saugesnio)

SSL: naudojant pasirinktinį CA

Naujesnės SSL versijos „MongoDB“ leidžia naudoti pasirinktinį CA. Nors tai suteikia jums lankstumo nurodant, kaip norite dirbti su SSL, jis pateikiamas su įspėjimais. Jei tiesiog bandote apsaugoti ryšį, gali kilti pagunda pasirinkti sslAllowInvalidCertficates. Tačiau tai apskritai yra bloga idėja dėl kelių priežasčių:

  • Leidžia bet kokį ryšį nuo pasibaigusio galiojimo iki atšauktų sertifikatų
  • Neužtikrinate konkretaus pagrindinio kompiuterio vardo apribojimų
  • Jūs nesate toli gražu ne toks saugus, kaip manote

Norėdami tai išspręsti, tiesiog nustatykite net.ssl.CAFileir „MongoDB“ naudos tiek raktą ir CA failą (tai turite padaryti kliente).

Tačiau naudojant SSL yra žinomas trūkumas: našumas. Naudodami SSL tikrai prarasite tam tikrą našumą.

Disko šifravimas

Duomenys yra „tranzitu“ arba „ramybės būsenoje“. Galite užšifruoti vieną arba abu „MongoDB“. Aptarėme duomenų šifravimą perduodant (SSL). Dabar pažiūrėkime į ramybės būsenos duomenis.

Ramybės būsenos duomenys yra diske saugomi duomenys. Duomenų ramybės būsenos šifravimas paprastai reiškia duomenis, išsaugotus užšifruotoje saugyklos vietoje. Taip siekiama užkirsti kelią vagystėms fizinėmis priemonėmis ir sukurti atsargines kopijas, kurios saugomos taip, kad jų lengvai neskaitytų jokia trečioji šalis. Tam yra praktinės ribos. Didžiausias yra pasitikėjimas savo sistemos administratoriais - ir darant prielaidą, kad įsilaužėlis negavo administracinės prieigos prie sistemos.

Tai nėra vienintelis „MongoDB“ klausimas. Čia veikia ir kitose sistemose naudojamos prevencinės priemonės. Jie gali apimti šifravimo įrankius, tokius kaip LUKS ir cryptfs, ar dar saugesnius metodus, tokius kaip šifravimo raktų pasirašymas naudojant LDAP, intelektualiosios kortelės ir RSA tipo žetonai.

Vykdydami tokio lygio šifravimą, turite atsižvelgti į tokius veiksnius kaip diskų automatinis sujungimas ir iššifravimas. Bet tai nėra naujiena jūsų sistemos administratoriams. Šį reikalavimą jie gali valdyti taip pat, kaip ir kitose tinklo dalyse. Papildoma nauda yra viena saugojimo šifravimo procedūra, o ne kiekviena technologija, kurią naudoja konkreti funkcija.

Duomenis ramybės būsenos šifravimą galima išspręsti naudojant bet kurį iš šių būdų:

  • Šifruoti visą tomą
  • Šifruoti tik duomenų bazės failus
  • Šifruoti programoje

Pirmąjį elementą galima išspręsti diskų šifravimu failų sistemoje. Tai lengva nustatyti naudojant LUKS ir dm-crypt. PCI DSS atitiktis ir kiti sertifikavimo reikalavimai reikalingi tik pirmajai ir antrajai parinktims.

Auditas

Svarbus bet kokio gero saugumo dizaino aspektas yra galimybė stebėti, kuris vartotojas atliko kokius veiksmus duomenų bazėje (panašiai kaip jūs turėtumėte valdyti savo tikrus serverius). Auditas leidžia filtruoti konkretaus vartotojo išvestį, duomenų bazę, kolekciją ar šaltinio vietą. Tai sukuria žurnalą, kad galėtumėte peržiūrėti visus saugumo incidentus. Dar svarbiau, kad tai rodo bet kuriam saugumo auditoriui, kad ėmėtės teisingų veiksmų, kad apsaugotumėte savo duomenų bazę nuo įsilaužimo ir suprastumėte bet kokio įsilaužimo gylį.

Auditas leidžia jums visiškai stebėti įsibrovėlio veiksmus jūsų aplinkoje.

Pastaba: audituoti galima tik „MongoDB Enterprise“. Tai nėra bendruomenės versijoje. Jis prieinamas kai kuriose kitose atvirojo kodo „MongoDB“ versijose, pvz., „Percona Server for MongoDB“.

$config[zx-auto] not found$config[zx-overlay] not found