1. Zabezpiecz swój serwer
Wiele znanych ataków jest możliwych tylko po fizycznym uzyskaniu dostępu do komputera. Z tego powodu najlepiej jest mieć serwer aplikacji i serwer bazy danych na różnych maszynach. Jeśli nie jest to możliwe, należy zachować większą ostrożność. W przeciwnym razie, wykonując zdalne polecenia za pośrednictwem serwera aplikacji, atakujący może uszkodzić Twoją bazę danych nawet bez uprawnień. Z tego powodu każda usługa działająca na tym samym komputerze co baza danych powinna mieć przyznane najniższe możliwe uprawnienia, które nadal pozwalają usłudze działać.
Nie zapomnij zainstalować całego pakietu bezpieczeństwa:Antywirus i Antyspam, Zapora oraz wszystkie pakiety bezpieczeństwa zalecane przez dostawcę Twojego systemu operacyjnego. Nie zapomnij też poświęcić 10 minut na zastanowienie się nad fizyczną lokalizacją serwera — w złej lokalizacji serwer może zostać skradziony, zalany, zraniony przez dzikie zwierzęta lub włóczęgów.
2. Localhost Security lub Wyłącz lub ogranicz zdalny dostęp
Zastanów się, czy MySQL zostanie pobrany z systemu, czy będzie dostępny bezpośrednio z własnego serwera. Jeśli nie jest używany zdalny dostęp, zagwarantuj, że właśnie scharakteryzowane hosty mogą dostać się do serwera. Zwykle odbywa się to za pomocą opakowań TCP, tabel adresów IP lub innych narzędzi programowania zapory sieciowej lub narzędzi ułatwiających dostęp do sprzętu.
Aby uniemożliwić MySQL otwieranie gniazda sieciowego, towarzyszący mu parametr powinien znajdować się w obszarze [mysqld] my.cnf lub my.ini:
pomijanie sieci
Dokument znajduje się w "C:\Program Files\MySQL\MySQL Server 5.1" katalog w systemie operacyjnym Windows lub "/etc/my.cnf" lub "/etc/mysql/my.cnf" na Linuksie.
Ta linia paraliżuje rozpoczęcie administrowania systemami w trakcie uruchamiania MySQL. Byłoby idealnie, gdybyś pamiętał, że połączenie lokalne może zostać użyte do nawiązania połączenia z serwerem MySQL.
Innym możliwym rozwiązaniem jest zmuszenie MySQL do nasłuchiwania tylko lokalnego hosta przez dodanie następującej linii w [mysqld] sekcja my.cnf adres-wiązania=127.0.0.1
Możesz nie chcieć blokować dostępu systemowego do serwera bazy danych, jeśli klienci w Twojej organizacji łączą się z serwerem ze swoich komputerów lub z serwerem WWW wprowadzonym na innym komputerze. W takim przypadku należy wziąć pod uwagę następującą restrykcyjną składnię przyznawania:
mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';
3. Wyłącz korzystanie z LOCAL INFILE
Następną zmianą jest wyłączenie korzystania z „ŁADOWANIA LOKALNEGO PLIKU DANYCH” polecenie, które pomoże zachować niezatwierdzone przeglądanie w rejestrach sąsiedzkich. Jest to szczególnie ważne, gdy zostaną znalezione nowe luki SQL Injection w aplikacjach PHP.
Ponadto w niektórych przypadkach "INFILE LOKALNE" polecenie może być użyte do uzyskania dostępu do innych plików w systemie operacyjnym, na przykład "/etc/passwd" , używając następującego polecenia:
mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1
Lub nawet znacznie mniej trudne:
mysql> SELECT load\_file("/etc/passwd")
Aby wyłączyć korzystanie z „PLIKÓW LOKALNYCH” polecenie, następujący parametr powinien zostać dodany w [mysqld] sekcji pliku konfiguracyjnego MySQL.
set-variable=local-infile=0
4. Zmień nazwę użytkownika i hasło roota, aby były silne.
Domyślna nazwa użytkownika administratora na serwerze MySQL to "root" . Hakerzy często próbują uzyskać dostęp do jego uprawnień. Aby utrudnić to zadanie, zmień nazwę „root” do czegoś innego i podaj długie, złożone hasło alfanumeryczne.
Aby zmienić nazwę użytkownika administratora, użyj polecenia rename w konsoli MySQL:
mysql> RENAME USER root TO new\_user;
MySQL „ZMIEŃ NAZWĘ UŻYTKOWNIKA” Polecenie pojawiło się po raz pierwszy w MySQL w wersji 5.0.2. Jeśli używasz starszej wersji MySQL, możesz użyć innych poleceń, aby zmienić nazwę użytkownika:
mysql> use mysql;
mysql> update user set user="new\_user" where user="root";
mysql> flush privileges;
Aby zmienić hasło użytkownika, użyj następującego polecenia wiersza poleceń:
mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');
Można również zmienić hasło za pomocą "mysqladmin" narzędzie:
shell> mysqladmin -u username -p password newpass
5. Usuń bazę danych „Test”
MySQL jest dostarczany z „testową” bazą danych przeznaczoną jako przestrzeń testowa. Dostęp do niego może uzyskać anonimowy użytkownik, dlatego jest wykorzystywany w licznych atakach.
Aby usunąć tę bazę danych, użyj polecenia drop w następujący sposób:
mysql> drop database test;
Lub użyj "mysqladmin" polecenie:
shell> mysqladmin -u username -p drop test
6. Usuń anonimowe i nieaktualne konta
Baza danych MySQL zawiera kilku anonimowych użytkowników z pustymi hasłami. W rezultacie każdy może połączyć się z bazą danych, aby sprawdzić, czy tak jest, wykonaj następujące czynności:
mysql> select \* from mysql.user where user="";
W bezpiecznym systemie żadne linie nie powinny być odbijane echem. Inny sposób na zrobienie tego samego:
mysql> SHOW GRANTS FOR ''@'localhost';
mysql> SHOW GRANTS FOR ''@'myhost';
Jeśli dotacje istnieją, każdy może uzyskać dostęp do bazy danych i przynajmniej użyć domyślnej bazy danych"test" . Sprawdź to:
shell> mysql -u blablabla
Aby usunąć konto, wykonaj następujące polecenie:
mysql> DROP USER "";
MySQL „UPUŚĆ UŻYTKOWNIKA” Polecenie jest obsługiwane począwszy od wersji MySQL 5.0. Jeśli używasz starszej wersji MySQL, możesz usunąć konto w następujący sposób:
mysql> use mysql;
mysql> DELETE FROM user WHERE user="";
mysql> flush privileges;
7. Zwiększ bezpieczeństwo dzięki kontroli dostępu opartej na rolach
Bardzo powszechnym zaleceniem bezpieczeństwa bazy danych jest obniżenie uprawnień przyznawanych różnym stronom. MySQL nie jest inny. Zazwyczaj, gdy programiści pracują, używają maksymalnych uprawnień systemu i poświęcają mniej uwagi zasadom uprawnień, niż moglibyśmy się spodziewać. Taka praktyka może narazić bazę danych na znaczne ryzyko.
* Każda nowa instalacja MySQL 5.x już zainstalowana przy użyciu właściwych środków bezpieczeństwa.
Aby chronić swoją bazę danych, upewnij się, że katalog plików, w którym faktycznie przechowywana jest baza danych MySQL, należy do użytkownika „mysql” i grupy „mysql”.
shell>ls -l /var/lib/mysql
Ponadto upewnij się, że tylko użytkownicy „mysql” i „root” mają dostęp do katalogu /var/lib/mysql
.
Pliki binarne mysql, które znajdują się w katalogu /usr/bin/, powinny być własnością "root" lub konkretnego użytkownika systemowego "mysql". Inni użytkownicy nie powinni mieć prawa zapisu do tych plików.
shell>ls -l /usr/bin/my\*
8. Sprawdzaj uprawnienia do bazy danych
Uprawnienia systemu operacyjnego zostały naprawione w poprzedniej sekcji. Porozmawiajmy teraz o uprawnieniach bazy danych. W większości przypadków w bazie danych współistnieje użytkownik administrator (o zmienionej nazwie „root”) oraz jeden lub więcej rzeczywistych użytkowników. Zwykle „root” nie ma nic wspólnego z danymi w bazie danych; zamiast tego służy do obsługi serwera i jego tabel, nadawania i odbierania uprawnień itp.
Z drugiej strony niektóre identyfikatory użytkowników są używane do uzyskiwania dostępu do danych, na przykład identyfikator użytkownika przypisany do serwera sieci Web w celu wykonywania zapytań „select\update\insert\delete” i wykonywania procedur składowanych. W większości przypadków nie są potrzebni inni użytkownicy; jednak tylko Ty, jako administrator systemu, możesz naprawdę znać potrzeby swojej aplikacji.
Tylko konta administratorów muszą mieć uprawnienia SUPER / PROCESS /FILE i dostęp do bazy mysql. Zwykle dobrym pomysłem jest obniżenie uprawnień administratora na dostęp do danych.
Przejrzyj uprawnienia pozostałych użytkowników i upewnij się, że są one odpowiednio ustawione. Można to zrobić, wykonując następujące kroki.
mysql> use mysql;
[Zidentyfikuj użytkowników]
mysql> select \* from users;
[Wymień dotacje wszystkich użytkowników]
mysql> show grants for ‘root’@’localhost’;
Powyższe oświadczenie musi być wykonane dla każdego użytkownika! Pamiętaj, że tylko użytkownicy, którzy naprawdę potrzebują uprawnień administratora, powinni je otrzymać.
Innym interesującym przywilejem jest „POKAŻ BAZY DANYCH”. Domyślnie z polecenia mogą korzystać wszyscy, którzy mają dostęp do wiersza poleceń MySQL. Mogą go wykorzystać do zebrania informacji (np. uzyskania nazw baz danych) przed atakiem na bazę, np. kradzieżą danych. Aby temu zapobiec, zaleca się przestrzeganie procedur opisanych poniżej.
- Dodaj „ --skip-show-database” do skryptu startowego MySQL lub dodaj go do pliku konfiguracyjnego MySQL
- Przyznaj uprawnienie SHOW DATABASES tylko tym użytkownikom, którym chcesz używać tego polecenia
Aby wyłączyć użycie polecenia „SHOW DATABASES”, należy dodać następujący parametr w sekcji [mysqld] pliku /etc/my.cnf
:
[mysqld]
skip-show-database
9. Włącz rejestrowanie
Jeśli serwer bazy danych nie wykonuje wielu zapytań, zaleca się włączenie rejestrowania transakcji poprzez dodanie następującego wiersza do sekcji [mysqld] w /etc/my.cnf
plik:
[mysqld]
log =/var/log/mylogfile
Nie jest to zalecane w przypadku ciężkich serwerów MySQL, ponieważ powoduje to duże obciążenie serwera.
Ponadto sprawdź, czy tylko identyfikatory „root” i „mysql” mają dostęp do tych plików dziennika (przynajmniej dostęp do zapisu).
Dziennik błędów Upewnij się, że tylko „root” i „mysql” mają dostęp do pliku dziennika „hostname.err”. Plik jest przechowywany w katalogu danych mysql. Ten plik zawiera bardzo poufne informacje, takie jak hasła, adresy, nazwy tabel, nazwy procedur składowanych i części kodu. Może być używany do zbierania informacji, aw niektórych przypadkach może dostarczyć atakującemu informacje potrzebne do wykorzystania bazy danych, maszyny, na której jest zainstalowana baza danych, lub danych w niej zawartych.
Dziennik MySQL Upewnij się, że tylko „root” i „mysql” mają dostęp do pliku dziennika „logfile XY”. Plik jest przechowywany w katalogu danych mysql.
10. Zmień katalog główny
Chroot w systemach operacyjnych UNIX {system operacyjny} to operacja, która zmienia widoczny katalog główny dysku dla aktualnie uruchomionej metody i jej elementów podrzędnych. Program, który został ponownie zrootowany do innego katalogu, nie może uzyskać dostępu ani nazywać plików poza tym katalogiem, dlatego katalog jest nazywany „więzieniem chroot” lub (rzadziej) „więzieniem chroot”.
Korzystając ze środowiska chroot, dostęp do zapisu procesów mySQL (i procesów potomnych) może zostać ograniczony, zwiększając bezpieczeństwo serwera.
Upewnij się, że istnieje dedykowany katalog dla środowiska chrootowanego. Powinno to wyglądać tak:/chroot/mysql
Ponadto, aby korzystanie z narzędzi administracyjnych bazy danych było wygodne, w sekcji [client] pliku konfiguracyjnego MySQL należy zmienić następujący parametr:
[klient]
socket = /chroot/mysql/tmp/mysql.sock
Dzięki temu wierszowi kodu nie będzie potrzeby dostarczania poleceń mysql, mysqladmin, mysqldump itp. z --socket=/chroot/mysql/tmp/mysql.sock
parametr przy każdym uruchomieniu tych narzędzi.
11. Regularnie usuwaj stare logi
Podczas procedur instalacyjnych istnieje wiele wrażliwych danych, które pomogą niepożądanym użytkownikom w ataku na bazę danych. Te dane są przechowywane w historii serwera i mogą być bardzo przydatne, jeśli podczas instalacji coś pójdzie nie tak. Analizując pliki historii, administratorzy mogą dowiedzieć się, co poszło nie tak i prawdopodobnie to naprawić. Jednak te pliki nie są potrzebne po zakończeniu instalacji.
Powinniśmy usunąć zawartość pliku historii MySQL (~/.mysql_history), gdzie przechowywane są wszystkie martwe polecenia SQL (zwłaszcza hasła, które są przechowywane jako zwykły tekst):
cat /dev/null > ~/.mysql\_history
Podsumowując, powinniśmy położyć nacisk na bezpieczeństwo bazy danych. Jednak powinna to być pierwsza rzecz dla każdej osoby lub firmy.