Minimális LAMP biztonság

Apache és php verzió elrejtése, valamint néhány alap mysql beállítás. Az alapértelmezett LAMP telepítést követően, minél hamarabb érdemes ezeket a beállításokat megejteni.

1. lépés  – Apache szignatúra kikapcsolása

vim /etc/apache2/apache2.conf

A végére adjuk hozzá ezeket a sorokat:

TraceEnable off
ServerTokens Prod
ServerSignature off

TraceEnable: a trace metódus kikapcsolása (információ szivárogtatás ellen).

ServerTokens: alapból általában FULL-on van, ami nem csak az apache verziót, de a PHP és egyéb patchek meglétét és verzióját árulja el a fejlécekben, de ezzel nem szeretnénk segíteni a támadó munkáját, így a Prod-dal mindössze annyit közöl a fejlécben az apache, hogy “Server: Apache”.

ServerSignature: a szerver által előállított lapoknál (pl. 404 stb.) kikapcsolja a lap alján megjelenő aláírást, ami általában tartalmazza a rendszer verziókat.

2. lépés – PHP szignatúra kikapcsolása

Alapértelmezett beállítással a PHP sem rejti véka alá verzió számát, de még az őt futtató operációs rendszerről is árulkodik. Továbbá a hibaüzenetek megjelenítése a fejlesztési szakaszban hasznos, de produktív környezetben szintén biztonsági rés. Itt lehet kikapcsolni:

vim /etc/php5/apache2/php.ini

Keressük meg a következőket:

expose_php = On
display_errors = On

Kapcsoljuk ki:

expose_php = Off
display_errors = Off

A két lépés érvényesítéséhez indítsuk újra az Apache szervert:

service apache2 restart

3. lépés – néhány MySQL szerver biztonsági beállítás

Érdemes a változtatások előtt meggyőződni, hogy a MySQL szerver telepítését követően, milyen alapértelmezett felhasználó és tábla keletkezik.

Parancssori felületen lépjünk be:

mysql -u root -p

Listázzuk ki az adatbázisokat:

show databases;

Tipikusan Ubuntu esetén találkozhatunk a “test” adatbázissal.

Listázzuk ki a felhasználókat:

SELECT User,Host,Password FROM mysql.user;

Most jöhet, a lényeg!

Futtassuk a MySQL szerver telepítéssel kapott scriptet:

mysql_secure_installation

A feltett kérdésekre én így válaszoltam:

Change the root password? [Y/n] n
Remove anonymous users? [Y/n]
Disallow root login remotely? [Y/n]
Remove test database and access to it? [Y/n]
Reload privilege tables now? [Y/n]

Ezt a már meglévő szerveren is nyugodtan futtathatjuk, mert a meglévő adatbázisainkat nem változtatja, kivétel a ‘test’ adatbázist. Figyeljünk arra, hogy ha a root volt beállítva eddig távoli elérésre – ami egyébként hiba – azt törölni fogja!

Az adatbázis és a felhasználók ismételt kilistázásával láthatjuk a változásokat.

Nézzük meg a logok jogosultságait:

ls -lh /var/log/mysql*

Valami ilyesmit kéne, hogy lássunk:

-rw-r----- 1 mysql adm    0 Mar 30 04:06 /var/log/mysql.err

Ha nem a fenti attributumokat látjuk, akkor módosítsuk:

chmod 640 /var/log/mysql*
chown mysql:adm /var/log/mysql*

A második parancs rendszerenként eltérő lehet. Az alapértelmezett Debian telepítésnél ezt a felhasználót és csoportot használják.

A lokális fájlbetöltés direktívát szintén érdemes kikapcsolni!

vim /etc/mysql/my.cnf

Keressük meg a [mysqld] részt, és ahhoz illesszük be a következőt:

local-infile=0

Ez a beállítás megakadályozza a felhasználóknak fájlok betöltését a fájlrendszerről az adatbázisba, fájlrendszer szintű hozzáférés hiányában!

Indítsuk újra az adatbázis szervert! Az eddigi beállítások közül, csak ez a legutóbbi igényli ezt. Fontos, hogy produktív környezetben az újraindítást időzítsük és egyéb előfeltételei is lehetnek!

/etc/init.d/mysql restart

Érdemes továbbá a root felhasználót is átnevezni!

Ezt szokták a legkevesebben elvégezni, viszont nagyon hatékony védelem!

Soronként hajtsuk végre a következő parancsokat:

mysql -u root -p
SELECT User,Host,Password FROM mysql.user;
rename user 'root'@'localhost' to 'newAdminUser'@'localhost';
FLUSH PRIVILEGES;
SELECT User,Host,Password FROM mysql.user;
exit

Értelemszerűen, a ‘newAdminUser’ legyen az általunk válaszott root-tól eltérő név!

Innentől az új felhasználóval tudunk már belépni:

mysql -u newAdminUser -p

És végül: a debian-sys-maint felhasználó!

Amennyiben csak a logrotate.d használja ezt a technikai felhasználót, akkor nem kell neki ALL PRIVILEGES vagy GRANT OPTION, ugyanis ezek szükségtelen biztonsági rések. Elegendő neki egy RELOAD jog.  root joggal kell belépni (vagy ezzel ekvivalens felhasználóval a korábbiak fényében). Az ‘xxxxxx’ az a jelszó, melyet a technikai usernek a rendszer generált a telepítéskor. Itt nézheted meg a jelszavát:

 cat /etc/mysql/debian.cnf

Soronként hajtsuk végre a következő parancsokat a debian.sys-maint jogainak megváltoztatásához:

mysql -u root -p
SHOW GRANTS for 'debian-sys-maint'@'localhost';
GRANT RELOAD on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxx';
FLUSH PRIVILEGES;
SHOW GRANTS for 'debian-sys-maint'@'localhost';
exit

A SHOW GRANTS parancs kilistázza a jogait az elején és végén, így látható a változtatás is.

Fontos megjegyezni, hogy a MySQL-t érdemes CSAK lokális elérésre konfigurálni. Ha szükséges távoli elérés, azt SSH tunnelen vagy VPN-en keresztül megvalósítani. A phpmyadmin szintén biztonsági réseket üthet a rendszerünkön, ezért azt különösen be kell állítani. Ezen beállításokról talán később…

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöljük.