Kaip jau žinome, įsilaužimų yra papraščiausiai per daug. Įvykus įsilaužimui esame pripratę matyti saugumo ekspertus, įmonės darbuotojus ir kitus žmones patariančius mums kaip geriau apsaugoti savo duomenis ir infrastruktūrą.
Dauguma programuotojų tai ir daro – mes saugome savo infrastruktūrą, galbūt pasamdome keletą informacijos saugumo ekspertų ir klausiame jų patarimų kaip apsaugoti savo infrastruktūrą, kaip išvengti įsilaužimų ateityje ir pan.
Bet ar mes kada pagalvojome kaip apsaugoti MySQL įvykus įsilaužimui? Šiame straipsnyje bandysime tai aptarti.
MySQL Saugumas 101
Kai kalbame apie su MySQL susijusias saugumo galimybes, turime platų pasirinkimo galimybių spektrą:
- Mūsų MySQL instaliacijos saugumas – ar mes pagalvojome apie savo MySQL serverių saugą diegdami MySQL pirmąjį kartą? Jei ne, kodėl?
- MySQL prieigos kontrolė – kiek vartotojų turėjo tam tikras privilegijas? Kiek vartotojų turėjo galimybę vykdyti administracines užklausas? Kada vartotojams buvo suteikta prieiga? Ar kada nors prieiga buvo atimta?
- Saugos įskiepių naudojimas – ar įdiegta MySQL sistema naudojo galimus saugos papildinius? Jei taip, kokius? Ar jie buvo atnaujinti?
- Bendras duomenų bazės saugumas – ar mes laikėmės bendros duomenų bazių saugumo praktikos? Ar leidome savo vartotojams pasirinkti stiprius ir saugius slaptažodžius? Ar mes stengėmės apsaugoti savo programinę įrangą nuo SQL injekcijos? Koks duomenų saugojimo variklis buvo naudojamas mūsų duomenų bazėje? Kodėl?
- Atsarginės kopijos – ar mes turėjome duomenų atsargines kopijas? Ar jos buvo atnaujinamos? Ar mes jas išbandėme?
Tai yra vieni pagrindinių klausimų į kuriuos turėtume atsakyti jei norime suprasti kaip geriau apsaugoti MySQL – dabar pažvelgsime į juos detaliau.
Įdiegtos MySQL Infrastruktūros Apsauga
Jei įtariame, kad mūsų informacinė sistema patyrė įsilaužimą, verta apsvarstyti ar neturėtume iš naujo įdiegti MySQL savo serveriuose – taip pat pravartu pradėti nuo paties MySQL įdiegimo apsaugojimo, kas reiškia, kad iš naujo įdiegę MySQL į savo serverį turėtume pažvelgti į šiuos dalykus:
- Priskirkite slaptažodį pagrindiniam (“
root
“) MySQL vartotojui – tai turėtų atrodyti akivaizdu, tačiau kartais pamirštame papraščiausius dalykus. Įsitikinkite, kad slaptažodį sudaro didžiosios, mažosios raidės, skaičiai ir specialieji simboliai. - Apsvarstykite galimybę pakeisti MySQL įdiegimo aplanką – norėdami tai padaryti, galite nukopijuoti esamą MySQL duomenų bazės įdiegimo aplanką į naują vietą:
sudo rsync -a /var/lib/mysql /mount/volume-01
, tada į savo/var/lib/mysql/my.cnf
failą įrašykite:socket=/mount/volume_01/mysql/mysql.sock
datadir=/mount/volume_01/mysql
. Pakeiskite direktoriją pagal savo nuožiūrą. - Kintamasis
secure_file_priv
nustato katalogą, iš kurio leidžiama vykdyti importo ir eksporto operacijas – jei operacijos nekils iš šio katalogo, failai nebus importuoti į serverį.
Norėdami nustatyti kintamąjį į norimą katalogą, eikite į/var/lib/mysql/my.cnf
failą ir pakeiskitesecure_file_priv
kintamojo reikšmę į kitą katalogą.
Aukščiau aprašyti pagrindiniai MySQL apsaugojimo veiksmai turėtų padėti apsaugoti jūsų MySQL instaliaciją, tačiau tai yra tik viena MySQL saugumo dalis. Dabar pažiūrėsime į MySQL prieigos kontrolę.
MySQL Prieigos Kontrolė
Norėdami užtikrinti tinkamą MySQL prieigos kontrolę apribokite tam tikrų užklausų naudojimą tik tam tikriems vartotojams – pasverkite savo galimybes ir vartotojams suteikite prieigą tik prie tų užklausų, kurios yra būtinos tam, kad jie atliktų reikalingas užduotis.
Pavyzdžiui, jei vartotojui reikia tik skaityti iš duomenų bazės, jam turėtų būti leidžiama naudoti tik SELECT
teiginius – vartotojams gali reikėti priskirti ir prieigą prie kelių užklausų, pavyzdžiui ALTER
, UPDATE
ir kitų.
Taip pat apsvarstykite galimybę atšaukti prieigą prie tam tikrų užklausų – jei matote, kad tam tikram vartotojui nebereikia pavyzdžiui, pridėti indeksų prie lentelės, apsvarstykite galimybę atšaukti jo prieigą prie ALTER
užklausų ir pan.
MySQL Saugumo Įskiepiai
MySQL turi kelis papildinius, galinčius sustiprinti šios programinės įrangos saugumą. Visų jų neaptarsime, tačiau kai kurie iš jų yra:
- Autentifikacijos įskiepiai – MySQL turi daugiau nei vieną tokį įskiepį – vienas iš jų yra SHA-256 įskiepis, kuris yra įmontuotas į MySQL ir kurį galima panaudoti sukuriant vartotoją ir nurodant, kad šis vartotojas turėtų autentifikuotis naudodamasis
sha256_password
įskiepiu:CREATE USER 'demo_user'@'localhost' IDENTIFIED WITH sha256_password;
Next, set theold_passwords
variable to 2 (this will cause thePASSWORD()
function to use the SHA-256 hashing algorithm):SET old_passwords = 2;
SET PASSWORD FOR 'demo_user'@localhost = PASSWORD('demo_password');
- Slaptažodžių patvirtinimo papildinys – įskiepis
validate_password
yra skirtas pagerinti saugumą įgalinant slaptažodžio patikimumo testus.
Norėdami naudoti šį įskiepį, įdiekitevalidate_password
ir, jei reikia, pakeiskitevalidate_password_policy
reikšmę (kintamąjį galima nustatyti į skaitines reiškmes 0, 1 ir 2 arba žodines reikšmesLOW
,MEDIUM
irSTRONG
) – nustatymasLOW
tikrina tik slaptažodžio stiprumą – pagal numatytuosius nustatymus slaptažodžiai turi būti bent 8 simbolių ilgio. Šis ilgis gali būti pakeistas pakeičiant kintamąjįvalidate_password_length
.MEDIUM
nustatymas prideda tam tikras sąlygas – slaptažodžiai turi būti sudaryti ne mažiau kaip iš vieno skaičiaus, mažosios, didžiosios raidės ir specialaus simbolio. Šias reikšmes taip pat galima pakeisti modifikuojant kintamuosiusvalidate_password_number_count
,validate_password_mixed_case_count
irvalidate_password_special_char_count
. NustatymasSTRONG
prideda sąlygą, kad slaptažodžiai, kurie yra sudaryti iš arba viršija 4 simbolius, neturi sutapti su žodžiais žodyne, kurį galima nurodyti modifikuojant kintamąjįvalidate_password_dictionary_file
. - MySQL ugniasienė – MySQL taip pat turi MySQL ugniasienę nuo MySQL Enterprise 5.6.24. Ugniasienės tikslas yra leisti arba neleisti SQL užklausų vykdymą pagal “baltojo sąrašo” (angl. whitelist) įvesties tikrinimą. Kiekviena ugniasienėje esanti paskyra turi savo leidžiamų teiginių sąrašą – visi kiti teiginiai yra blokuojami.
- MySQL auditas – MySQL Enterprise taip pat apima MySQL Enterprise Audit, kuris įgyvendinamas naudojant papildinį vadinamą
audit_log
. MySQL auditas naudoja audito API tam, kad galėtų stebėti ir registruoti užklausas vykdomas MySQL serveriuose. Papildinys sukuria log failą, kurio turinys apima serverio veiklą tam tikru metu.
Bendri Duomenų Bazių Saugumo Aspektai
Bendri duomenų bazių saugumo aspektai yra dažniausiai susiję su pagrindinių duomenų bazių saugumo priemonių naudojimu – visoms naudojamoms paskyroms turėtume naudoti tvirtus slaptažodžius, programuotojai prie duomenų turėtų leisti prieiti tik patikimiems žmonėms, neleisti duomenų bazėms būti per daug apkrautomis, vengti fizinės žalos serveriams, vengti naudoti programinę įrangą kurioje yra saugumo spragų (pavyzdžiui, SQL injekcijos galima išvengti naudojant paruoštas užklausas), taip pat išvengti duomenų sugadinimo ar praradimo ir pan.
Atsarginės Kopijos
Duomenys yra svarbi jūsų svetainės dalis. Duomenys gali būti sugadinami. Standieji diskai genda. Kiekviena informacinė sistema gali prarasti duomenis kas reiškia, kad jei nepadarysite atsarginių kopijų, galite patirti didelių problemų.
Savo failų ir duomenų bazės atsarginių kopijų kūrimas yra ypač svarbi bet kurios saugos rutinos dalis. Yra keli įrankiai ir paslaugos, skirtos automatizuoti šią užduotį (tai galima atlikti net sukūrus bash skriptus), galite saugoti duomenis debesų saugyklose, diskuose ir kt. – disko vieta yra pigi, tad atsarginių kopijų turėjimas yra prasmingas visada.
Jei įvyktų katastrofa ir jūsų duomenys būtų sunaikinti, turimų atsarginių kopijų išbandymas irgi yra labai svarbus – tai gali padėti jums išsaiškinti, ar galite greitai ir efektyviai atkurti duomenis. Atsarginių duomenų kopijų išbandymas turėtų būti esminė bet kurios atsarginių kopijų rutinos kūrimo dalis.
Santrauka
Apibendrinant galima pasakyti, kad norint apsaugoti savo MySQL duomenų bazę nuo įsilaužimo reikėtų iš naujo įdiegti MySQL savo serveriuose ir netrukus po įdiegimo apriboti vartotojų teises. Atminkite, kad jūsų vartotojų paskyrose turėtų būti naudojami stiprūs slaptažodžiai (naudokite didžiąsias, mažąsias raides, skaičius, ir jei tik įmanoma, simbolius), apsvarstykite galimybę naudoti MySQL saugos įskiepius, būtinai laikykitės MySQL duomenų bazių saugos praktikos ir pasirūpinkite atsarginėmis duomenų kopijomis. Sukurkite visų svarbių duomenų atsargines kopijas, įsitikinkite, kad jūsų atsarginės kopijos yra atnaujinamos ir visada jas išbandykite.
Jei atlikote šios veiksmus, jūsų MySQL duomenų bazės ateitis turėtų būti geresnė.