MySQL – насоки за сигурност

Ако използвате MySQL на компютър, свързан с интернет, със сигурност трябва да се погрижите да избегнете най-често срещаните грешки в сферата на сигурността.

При обсъждането на сигурността е необходимо да се има предвид пълната защита на целия хост сървър (не само на MySQL сървъра) срещу всички видове приложими атаки: подслушване, промяна, възпроизвеждане, отказ на услуга и други.

MySQL използва сигурност, базирана на (Access Control Lists, ACL) списъци за контрол на достъпа за всички връзки, заявки и други операции, които потребителите могат да изпълняват.

Също така MySQL може да поддръжка SSL-криптирани връзки между MySQL клиенти и сървъри. Много от представените в статията понятия не са специфични само за MySQL – същите общи идеи важат за почти всички приложения.

Насоки за повишаване сигурността на MySQL

Критично важно е никога да не давате (с изключение на MySQL root акаунта) достъп до таблицата на потребителите в служебната база данни mysql.

Привилегии

Научете как функционира системата за привилегии на достъпа до MySQL – Access Privilege System (APS).

Основната функция на MySQL APS е да удостоверява потребителя, който се свързва от даден хост и да свързва този потребител с привилегии в база данни като SELECT, INSERT, UPDATE и DELETE.

Използвайте командите GRANT и REVOKE, за да контролирате достъпа до MySQL. Не предоставяйте повече привилегии, отколкото е необходимо. Никога не давайте привилегии на всички хостове.

Изпълнете командата:

mysql -u root

Ако успеете да се свържете успешно със сървъра, без да бъдете помолени за парола, това означава, че всеки може да се свърже с MySQL сървъра като root потребител с пълни привилегии.

Прегледайте инструкциите за инсталиране на MySQL, като обърнете специално внимание на информацията за създаване на root парола.

Използвайте командата SHOW GRANTS, за да проверите кои профили какви права за достъп имат. След това използвайте инструмента REVOKE, за да премахнете онези привилегии, които не са необходими.

mysql> show grants;
Grants for cliuser@localhost                                                   
GRANT USAGE ON *.* TO 'cliuser'@'localhost' IDENTIFIED BY PASSWORD <secret>   
GRANT ALL PRIVILEGES ON `clidata`.* TO 'cliuser'@'localhost' WITH GRANT OPTION 
2 rows in set (0.00 sec)

С командата REVOKE премахваме привилегията INSERT:

mysql> REVOKE INSERT ON `clidata`.* FROM  'cliuser'@'localhost';
Query OK, 0 rows affected (0.00 sec)

Отново проверяваме привилегиите и сега вместо ALL PRIVILEGES MySQL изброява всички останали привилегии на потребителя:

mysql> show grants;
Grants for cliuser@localhost  
GRANT USAGE ON *.* TO 'cliuser'@'localhost' IDENTIFIED BY  PASSWORD <secret>
GRANT SELECT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `clidata`.* TO 'cliuser'@'localhost' WITH GRANT OPTION 
2 rows in set (0.00 sec)

Пароли

Не съхранявайте пароли в четим текстов формат в базата данни. Ако компютърът Ви бъде компрометиран, злонамереният хакер може да вземе пълния списък с пароли и да ги използва както намери за добре. Вместо това използвайте SHA2() или някаква друга еднопосочна хешираща функция и съхранявайте хеш стойността.

За да предотвратите възстановяването на паролата чрез rainbow tables, не използвайте тези функции с обикновена парола. Вместо това изберете израз, който да използвате като salt и създайте хеш от двете стойности (парола + salt).

Rainbow Tables са огромни сетове от предварително комбинирани таблици с хеш стойности, които са предварително съгласувани с възможни пароли за обикновен текст.

Не избирайте пароли от речници. Има специални програми за разбиване на пароли. Дори пароли като fish98 са много слаби. Много по-добра е duag98, която съдържа същата дума fish, но написана един клавиш отляво на стандартна QWERTY клавиатура.

Друг метод е да използвате парола, която е взета от първите знаци на всяка дума в произволно изречение (например Four score and seven years ago води до парола за Fsasya). Паролата е лесна за запомняне и написване, но е трудна да се отгатне от някой, който не знае изречението. В този случай може допълнително да замените думите в изречението с цифри, за да получите фразата 4 score and 7 years ago и като следвате същия алгоритъм ще се получи паролата 4sa7ya, която е още по-трудна за отгатване.

Интернет

Използвайте защитна стена (firewall). Това Ви предпазва от най-малко 50% от всички видове вируси във всеки софтуер. Сложете MySQL зад защитната стена или в DMZ (демилитаризирана зона – без интернет достъп).

Опитайте се да сканирате портовете си от интернет с помощта на инструмент като nmap. MySQL по подразбиране използва порт 3306. Този порт не трябва да е достъпен от външни ненадеждни хостове.

Като прост начин да проверите дали Вашият MySQL порт е отворен, опитайте следната команда от някакво отдалечено устройство, където server_host е името на хоста или IP адреса, на който работи MySQL сървъра:

shell> telnet server_host 3306

Ако telnet блокира (hangs) или връзката бъде отказана това означава, че портът е блокиран, както трябва да бъде. Ако установите връзка и се появят допълнителни нечетими символи, портът е отворен и трябва да бъде затворен на Вашата защитна стена или маршрутизатор, освен ако наистина нямате основателна причина да го държите отворен.

Приложенията, които имат достъп до MySQL, не трябва да се доверяват на въведените от потребителите данни и трябва да бъдат написани с подходящи техники за защитено програмиране.

Криптиране на информация

Не предавайте данни в текстов формат (некриптирани) през интернет. Тази информация е достъпна за всеки, който има време и възможност да я прихване и използва за собствени цели.

Вместо това използвайте криптиран протокол като SSL или SSH. MySQL поддържа вътрешни SSL връзки. Друга техника е да използвате препращане на SSH порт, за да създадете криптиран (и компресиран) комуникационен тунел.

Научете как да използвате помощните програми tcpdump и strings. В повечето случаи можете да проверите дали потоците от данни на MySQL не се шифроват, като издавате командата, както следва:

shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings

Командата работи под Linux, за да работи в други операционни системи може да има нужда от малки промени.

Бележка: Ако не виждате ясно четими данни, това не винаги означава, че информацията в действителност е криптирана. Ако имате нужда от висока степен на сигурност, консултирайте се с експерт по сигурността.

Обновена: 22.12.2022

Беше ли Ви полезна тази статия?

Вижте още