Bezpieczeństwo serwera baz danych MySQL
Serwer baz danych, tak jak każda aplikacja internetowa, jest narażona na różnego rodzaju ataki sieciowe. Serwer baz danych nasłuchuje najczęściej na porcie TCP 3306 i jest narażony na takie same rodzaje ataków, jak inne aplikacje internetowe, m.in. przepełnienie bufora, podszywanie się pod inne IP, ataki [D]DoS, sniffing i inne. Najczęściej w bazie danych znajdują się bardzo ważne dane, które powinny być szczególnie chronione przed dostępem niepowołanych osób.
Serwer MySQL opiera zasady bezpieczeństwa na koncepcji tzw. Access Control Lists w przypadku wszystkich połaczeń, zapytań i innych operacji wykonywanych przez użytkowników. Posiada też odpowiednie wsparcie dla połączeń SSL między klientem a serwerem baz danych.
Podstawowe zasady bezpieczeństwa serwera MySQL
- należy bezwzględnie ustalić hasło dla administratora (jeśli po wydaniu komendy mysql -u root nie zostaniemy poproszeni o hasło, to znaczy, że nie zostało ono utworzone dla administratora),
- nie wolno dawać dostępu do systemowej bazy danych MySQL innym użytkownikom poza administratorami,
- należy nadawać i odbierać uprawnienia użytkownikowi w zależności od jego potrzeb, nie należy nigdy dawać zbyt dużej swobody, lepiej dać mniej uprawnień niż więcej,
- nie należy dawać dostępu do wszystkich baz danych, a jedynie do wybranych,
- nie należy dawać użytkownikom dostępu do baz danych ze wszystkich hostów, a jedynie z wybranych,
- nie należy przechowywać w bazie danych haseł w postaci niezakodowanej,
- nie wolno wybierać haseł, które łatwo jest złamać, np. haseł słownikowych. W hasłach należy stosować znaki specjalne, cyfry i różnej wielkości litery,
- należy zainwestować w filtr pakietów – firewall,
- należy spróbować przeskanować porty na swoim komputerze: serwer baz danych MySQL pracuje najczęściej na porcie TCP 3306. Port ten nie powinien być dostępny dla innych histów niż te zdefiniowane w tabeli user w polu host. Można to zrobić na najbliższym routerze lub firewallu.
Przejęcie serwera MySQL bez znajomości hasła administratora serwera MySQL w przypadku, gdy mamy dostęp do serwera baz danych
Windows:
> net stop mysql
> net start mysql --skip-grant-tables &
> mysql -u root -p
USE mysql; UPDATE user SET password=PASSWORD('THM*2015') WHERE user='root' AND host='localhost'; FLUSH PRIVILEGES; quit
> net stop mysql
> net start mysql
Przebieg ćwiczeń
- Uruchomić serwer Linux Debian Wheezy w środowisku wirtualnym.
- Wobec braku znajomości hasła administratora serwera MySQL, przejąć kontrolę nad serwerem MySQL i ustanowić nowe hasło dla administratora serwera MySQL: THM*2015.
# cd /var/run/mysqld
# kill `cat mysqld.pid`
# nano kod.sql
treść: SET PASSWORD FOR 'root'@'localhost' = PASSWORD('THM*2015');
# mysqld_safe --init-file=/var/run/mysqld/kod.sql &
# rm kod.sql
# service mysql stop
# service mysql start
- Zlokalizować pliki baz danych na dysku systemu.
# cd /var/lib/mysql
# ls