A parancssori adatbázishasználat biztonságossá tétele a defaults fájlok használatával

botond küldte be 2018. 09. 11., k – 02:03 időpontban

Tartalom

 

Bevezető

Weboldalak üzemeltetése során fontos, hogy bármikor tudjunk készíteni friss mentést az adatbázisról, vagy éppen visszaállítást, ha netán valami gubanc történne az oldallal. Persze a web hoszting kezelőpanelek többsége alapból kínál ilyen funkciókat, azonban nem árt ha magunk is kézben tudjuk tartani az adatbázissal kapcsolatos dolgokat is, pláne ha nem csak mentés vagy visszaállítás a feladat, hanem bármi egyéb adatbázisművelet, amit el kell végezni.

Ebben a leírásban a mysql és a mysqldump parancsokat érintjük, hogy hogyan tehetjük biztonságosabbá használatukat.

Frissítés (2022-09-03):
Idővel elterjedtebbé vált a Unix socket alapú hitelesítési módszer, aminek következtében elavultnak tekintik ezt az azonosítási mechanizmust. Mindazonáltal a defaults fájlok továbbra is rendelkeznek előnyökkel, ezért szerintem továbbra is érdemes megismerni működését és gyakorlati használatát.

 

 

A mysql és a mysqldump parancsok bemutatása

A mysql parancs segítségével tudunk közvetlen SQL utasításokat adni a MySQL szerverünknek, ezáltal könnyedén készíthetünk különféle szkripteket, amikben kötegelhetjük az SQL parancsainkat, vagy automatizálhatjuk az adatbázisokkal végzendő feladatainkat. A mysqldump parancs pedig kimondottan az adatbázisok mentésére szolgáló eszköz, amivel finomhangolhatjuk a lementett SQL fájlunkba kerülő szabványokat, karakterkódolást, stb.

Lássunk is néhány példát!

A mysql parancs

Az alábbi példában én a Debian 8 (Jessie) tökéletes szerver 1.1 -es változatában belépek a mysql paranccsal konzol módban a Drupal-os tesztoldal adatbázisába, és lekérdezem a felhasználók táblát:

Parancssori adatbázishasználat - Konzol mód példa

Itt láthatjuk, hogy a mysql parancs bekéri a megadott felhasználó jelszavát, majd belép konzol módba. Majd az adatbázis kiválasztása után lehet küldeni a parancsokat a MySQL szervernek.

Ez szép és jó, de mi van akkor, ha nem interaktív módon szeretnénk SQL parancsokat futtatni, hanem például egy cron időzítőben kellene lefuttatni valamit, vagy éppen egy másik program kellene hogy elindítson egy SQL műveletsort?

Erre is van megoldás. Ilyenkor parancssorban kell megadnunk a jelszót is, valamint a parancsnak bemenetként az SQL utasításokat tartalmazó karakterláncot vagy SQL fájlt:

Parancssori adatbázishasználat - Parancssori példa

Itt pedig egy parancssorból (amit most szándékosan megtörtem egy \ jellel a jobb áttekinthetőségért) adtam ki a szervernek a szükséges SQL utasítást, amit végrehajtott, és a parancs kimenetét pedig átirányítottam egy fájlba, amit aztán kilistázva láthatjuk ugyanúgy a fenti kimenetet. A mysql parancs szintaktikája tehát a következő:

echo [bemeneti SQL parancs] | mysql -u [felhasználónév] -p[jelszó] [adatbázis] > [kimeneti SQL fájl]

Nagyobb SQL utasítások esetén fájlból is beolvastathatjuk:

cat [bemeneti SQL parancsfájl] | mysql -u [felhasználónév] -p[jelszó] [adatbázis] > [kimeneti SQL fájl]

Lényegében ugyanaz. És ha nincs szükség kimenetre, mert például csak módosítunk valamit valamelyik táblában, akkor pedig még egyszerűbb az egész:

mysql -u [felhasználónév] -p[jelszó] [adatbázis] < [bemeneti SQL parancsfájl]

(A -p kapcsolót szóköz nélkül követi az adatbázis jelszó!)

És a Bash sokoldalúságának köszönhetően még lehetne cifrázni, variálni többféle módon, ahogy éppen megkívánja a helyzet.

A mysqldump parancs

A mysqldump parancs szintaktikája is hasonló, nézzünk erre is egy példát:

Parancssori adatbázishasználat - Mysqldump példa

Itt először kilistáztam a könyvtárat, hogy látható legyen hogy nem volt előtte semmi benne, majd a mysqldump parancs segítségével lementettem a teljes Drupal-os tesztoldal adatbázisát egy fájlba, ami az újabb listázás után látszik is hogy 6 megabyte körüli a mérete, majd a fájl első 20 sorának listázásával belenéztem a fájlba, hogy az eredmény is látható legyen. Szépen beletette az egész oldal adatbázis kimentését.

A mysqldump parancs szintaktikája tehát így néz ki:

mysqldump -u [felhasználónév] -p[jelszó] [adatbázis] > [kimeneti SQL fájl]

A két parancs használata nagyjából megegyezik, a kapcsolóikat is ugyanúgy kellett használni ebben az esetben.

Viszont itt van a szépséghiba az egészben, ami a mai cikknek is a lényege: Mindkét parancsnál a parancssorba kerülnek a jelszavak, ami nagyon nem biztonságos. Például egy hosszabban futó mysql parancs esetén a processz-eket kilistázva egyből látszik a futó parancs és az összes paramétere, köztük az adatbázis felhasználó jelszava. Vagy ha egy shell szkriptet kell összerakni, amiben adatbázis műveletekre van szükség, akkor abban is ugyanígy látszódnak a jelszavak.

Ez így nem a legjobb megoldás, előbb-utóbb valaki ráakadhat a jelszavainkra. Hogyan kezelhetjük akkor biztonságosan az adatbázisokat parancssorból?

 

 

Az adatbáziskezelő parancsok biztonságos használata

Szerencsére van megoldás arra, hogy ezeket a parancsokat biztonságosan tudjuk kezelni, ezáltal szkriptjeinkben is nyugodtan használhatjuk őket.

A megoldás a defaults fájlok használata. Ennek röviden a lényege annyi, hogy egy külön fájlban tároljuk a felhasználóneveket, jelszavakat, majd a megfelelő jogosultsági beállítással levédjük, hogy más felhasználó ne tudja olvasni. Ezután a mysql és a mysqldump és az egyéb adatbázis műveleteket végző parancsoknak már csak ezt a defaults fájlt kell megadnunk, így sehol nem fognak megjelenni a jelszavaink.

A defaults fájl egy sima szöveges fájl, amit több szekcióra oszthatunk, aminek köszönhetően egyszerre több programnak is készíthetünk beállításokat benne.

A Debian is tartalmaz alapból egy ilyen fájlt: /etc/mysql/debian.cnf, amiben ajánlott beállítani az adatbázis root felhasználóját és annak jelszavát.

Az alábbi sablon a mysql és a mysqldump programok számára elkészített adatbázis hozzáférési beállításokat szemlélteti:

[mysql]
# Ezt a csoportot csak a mysql parancs olvassa.
# Itt adhatjuk meg a parancs számára az adatbázis hozzáférési beállításokat
host     = hoszt
user     = felhasználó
password = 'jelszó'
database = adatbázisnév


[mysqldump]
# Ezt pedig a mysqldump olvassa
# Ez nem támogatja az adatbázis nevet, 
#ezért azt külön kell megadni a parancs használatakor
host     = hoszt
user     = felhasználó
password = 'jelszó'

# Így tehát mindkét programmal működik: 
# A mysql-el is és a mysqldump-al is

A jelszavak működnek aposztrófok nélkül is, ha a jelszó nem tartalmaz speciális karaktereket. Így célszerű inkább mindig használni.

Létrehoztam egy "mysql" nevű alkönyvtárat a weboldal dokumentum gyökerében a private könyvtárban, és itt létrehoztam egy "tesztoldal.cnf" nevű fájlt, amibe beállítottam a tesztoldal adatbázis hozzáférését a fenti sablonnak megfelelően.

Utána be kell még állítani rá a megfelelő jogosultságot a chmod paranccsal:

chmod go-rwx tesztoldal.cnf

vagy

chmod 600 tesztoldal.cnf

Így lekerül róla minden jogosultság a csoportról és a többiekről. Innentől már csak a fájl gazdája láthat bele.

Ezek után ismételjük meg a legelső példánkat, ahol beléptünk konzol módba és kilistáztuk az users táblát:

Parancssori adatbázishasználat - Mysql biztonságos használata a defaults fájl segítségével

Szépen belép, anélkül, hogy kikerülne bárhova is a jelszó. Továbbá mivel a fájlban az adatbázis nevét is megadtam, így egy lépésben ki is választja azt ilyenkor, tehát nem kell az "use [adatbázisnév]" parancs sem.

A mysql parancs használata így még egyszerűbbé is vált, hiszen már csak egy paramétert kell neki megadni:

mysql --defaults-file=[defaults_fájl_elérési_útja]

Ha pedig nem szeretnénk a konzolba lépni, hanem egyből futtatni kell egy SQL parancsfájlt, akkor azt még a bemenetére kell adni:

mysql --defaults-file=[defaults_fájl_elérési_útja] < [sql_bemeneti_fájl]

Így egyből végre is hajtja azután kilép.

Hasonló a helyzet a mysqldump paranccsal is, csak itt még az adatbázisnevet is meg kell adni, mert nem támogatja a defaults fájlban:

mysqldump --defaults-file=[defaults_fájl_útvonala] [adatbázisnév] > [kimeneti_sql_fájl]

 

Konklúzió

A defaults file használatával tehát könnyen biztonságossá tehetjük a parancssorban az adatbázisokon végzett munkát és nem kell aggódnunk, hogy illetéktelenek birtokába jutnak a jelszavaink. Arról nem beszélve, hogy a dolgunkat is megkönnyíti, mivel nem kell minden adatbázis művelet során bepötyögnünk a hozzáférési adatokat.