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…