Когато се споменава сигурността на приложението, хората мислят за защита на приложенията срещу някои от най-честите атаки като инжектиране, нарушена автентификация, излагане на чувствителни данни и други подобни. Въпреки това, докато тези атаки са преобладаващи, да знаете как да защитите приложението си само от тях няма да е достатъчно - особено когато използвате MySQL. Днес ще разгледаме друга страна на сигурността - ще разгледаме как правилно да защитим MySQL.
Тъй като сигурността на MySQL е доста голямо нещо, третирайте тази публикация като начало на поредица от публикации относно мерките за сигурност на MySQL. Няма да покрием всичко, но тази публикация трябва да осигури основата на някои от мерките за сигурност на MySQL.
Защо трябва да защитите MySQL?
На първо място, трябва да отговорим на въпроса защо искаме да защитим MySQL. В крайна сметка, ако защитим нашето приложение срещу най-разпространените заплахи, трябва да сме в безопасност, нали? Е, и да, и не.
Виждате ли, когато защитавате приложението си срещу определени атаки, вие се уверявате, че на нападателите им е по-трудно да проникнат в защитата на вашето приложение - за да защитите вашата база данни обаче, защитата срещу такива атаки ще не е достатъчно. Защитата на вашата база данни може да е последната капка, която преля, която може да спаси вашето приложение (и вашата база данни!) от унищожаване.
Как да защитя MySQL?
Сега към горещия въпрос. Как всъщност защитавате MySQL?
Когато мислите за сигурността на вашия MySQL екземпляр(и), трябва да обмислите широк набор от възможни опции. За щастие, някои от тези опции дори не са ограничени до MySQL, което означава, че ще бъдат приложими и в други сценарии! Ще започнем с общите неща.
Сигурност на MySQL – Общи
Когато защитавате MySQL, имайте предвид, че той използва базирани на защита списъци за контрол на достъпа (ACL) за операции, извършвани от потребителите (списъците за контрол на достъпа са списък с разрешения, свързани с обект). Ето как да се погрижите за няколко от най-основните проблеми със сигурността:
- Обезопасете първоначалния MySQL акаунт - това е много очевидно, но трябва да се уверите, че root акаунтът има парола. Корен акаунтът може или не може да има парола, когато MySQL е инсталиран за първи път - можете да разберете каква е паролата, като проверите регистъра за грешки, след което го промените на по-силна, ако желаете. Всички други акаунти също трябва да имат пароли.
- Никога не съхранявайте пароли в база данни на MySQL в обикновен текст - използвайте еднопосочна функция за хеширане като BCrypt.
- Не предоставяйте достъп на потребители до потребителската таблица в базата данни на mysql (потребителят root е изключение).
Още се запознайте с контрола на достъпа и управлението на акаунта в MySQL. Тази тема заслужава цяла книга сама по себе си, но основните неща, които трябва да знаете, включват:
- Контролиране на достъпа в MySQL;
- Създаване, промяна и премахване на потребители;
- Предоставяне и отнемане на привилегии на и от потребители;
- Да знаете как да проверите какви привилегии са присвоени;
- Какви са категориите на акаунти;
- Какво представляват запазените акаунти;
- Какви са ролите;
- Как работи управлението на пароли;
- Как работи заключването на акаунта;
- Разглеждане на плъгините за сигурност, предлагани от MySQL;
- Да знаете как да защитите резервни копия на MySQL.
Що се отнася до сигурността на MySQL, резервните копия също трябва да бъдат покрити.
Сега ще разгледаме всяка от тези опции допълнително.
Контролиране на достъпа в MySQL
- Както вече беше отбелязано по-горе, никога не давайте на никакви акаунти, освен на root акаунта, достъп до потребителската таблица в базата данни mysql;
- Уверете се, че всички съществуващи MySQL акаунти използват само привилегиите, които са им абсолютно необходими, за да извършват своите действия.
Създаване, промяна и премахване на потребители в MySQL
В MySQL потребителите могат да бъдат създадени чрез изпълнение на заявката CREATE USER:
CREATE USER ‘demouser’@’localhost’ IDENTIFIED BY ‘password’;
Потребителите могат да бъдат променяни чрез стартиране на заявката ALTER USER - заявката ви позволява да правите много различни неща, включително заключване и отключване на акаунти, изискване на акаунта да се свърже чрез SSL, установяване на максимално количество връзки на час, изхвърляне на стари пароли и т.н. Ето примерна заявка, която може да промени вашата собствена парола:
ALTER USER USER() IDENTIFIED BY ‘password’;
Потребителите могат да бъдат премахнати, като изпълните заявката DROP USER:
DROP USER ‘demouser’@’localhost’;
Предоставяне и отнемане на привилегии на и от потребители в MySQL
Инструкцията GRANT трябва да предоставя или привилегии, или роли. Инструкцията ON може да ви каже дали ще бъдат предоставени привилегии или роли. Следната заявка предоставя привилегии:
GRANT ALL ON demo_db.* TO ‘demouser’@’localhost’;
Следната заявка предоставя роли:
GRANT ‘demo_role’ TO ‘demouser’@’localhost’;
GRANT трябва да отговори със заявката OK, 0 засегнати реда.
За да отмените определени привилегии от потребителите, използвайте оператора REVOKE (частта за името на хоста в името на акаунта е по подразбиране „%“):
REVOKE SELECT ON *.* FROM ‘demouser’@’localhost’;
За да отмените всички привилегии, може да се използва REVOKE ALL:
REVOKE ALL PRIVILEGES ON *.* FROM ‘demouser’@’localhost’;
Може да искате да издадете ПРИВИЛЕГИИ ЗА FLUSH; изявление след изпълнение на стъпките по-горе.
Проверка какви привилегии са присвоени в MySQL
- За да проверите какви привилегии са присвоени, издайте SHOW GRANTS; изявление.
- За всяка подадена заявка сървърът определя операцията, която искате да изпълните, след което проверява дали правата ви са достатъчни, за да изпълни въпросната операция.
- Сървърът използва потребителските и db таблиците в базата данни mysql, за да осигури контрол на достъпа.
- Таблиците user и global_grants предоставят глобални привилегии.
Останалите опции ще бъдат разгледани в предстоящите публикации.
Резюме
Що се отнася до сигурността на MySQL, имате много широка гама от опции, от които да избирате. Опциите включват основни мерки за сигурност, които могат да бъдат приложими към почти всички приложения, но някои от опциите са доста специфични за MySQL. Имайте предвид, че все още не всички налични опции са обхванати – за тях ще говорим и в предстоящите издания на серията за сигурност на MySQL.