Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да защитим MySQL:Част втора

В предишната публикация относно сигурността на MySQL разгледахме редица опции, които могат да се използват, за да направите вашия MySQL екземпляр(и) по-сигурен. Те включват:

  • Общи мерки за сигурност на MySQL;
  • Контролиране на достъпа в MySQL;
  • Създаване, промяна и изтриване на потребители в MySQL;
  • Предоставяне и отнемане на привилегии на и от потребители в MySQL;
  • Проверка какви привилегии са присвоени на потребителите в MySQL.

В тази публикация ще се потопим в останалите опции, включително:

  • Категории на акаунти в MySQL;
  • Роли в MySQL;
  • Запазени акаунти в MySQL;
  • Управление на пароли в MySQL;
  • Заключване на акаунт в MySQL;
  • Плъгини за сигурност, предлагани от MySQL;
  • Осигуряване на резервни копия на MySQL.

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

Категории на акаунти в MySQL

Категориите на акаунти бяха въведени в MySQL 8 – по-специално в MySQL 8.0.16. Ето същността на това:

  • Има две отделни категории акаунти:обикновени потребители и системни потребители;
  • Обикновеният потребител е потребител без привилегията SYSTEM_USER - потребител на системата е потребител с привилегия SYSTEM_USER;
  • Обикновеният потребител може да променя обикновените акаунти - такъв потребител не може да променя системните акаунти;
  • Системният потребител може да променя както системните, така и обикновените акаунти;
  • Обикновените акаунти могат да се променят както от редовни потребители, така и от потребители на системата;
  • Системните акаунти могат да се променят само от потребители на системата.

За да използвате категориите на акаунти в MySQL по отношение на сигурността, имайте предвид, че привилегията SYSTEM_USER засяга неща като манипулиране на акаунти и унищожаване на сесии и изрази в тях - тази концепция в MySQL позволява ограничаване на определени модификации до определени акаунти, което прави MySQL по-сигурен. Категориите на акаунти могат да се използват и за защита на системните акаунти срещу манипулация от обикновени акаунти:за да направите това, не предоставяйте привилегии за промяна на mysql схема на обикновените акаунти.

За да предоставите на акаунт SYSTEM_USER привилегии, използвайте следната заявка към създаден акаунт:

GRANT SYSTEM_USER ON *.* TO system_user;

Роли в MySQL

В MySQL ролите са колекции от привилегии. Когато предоставите на потребителски акаунт роля в MySQL, вие предоставяте всички привилегии, свързани с тази роля. Роли могат да бъдат създадени с помощта на оператора CREATE ROLE:

CREATE ROLE ‘role_1’, ‘role_2’;

Имената на ролите се състоят от потребителска част и хост част - потребителската част не може да бъде празна и хост частта по подразбиране е „%“, ако не е посочена.

Когато ролите се създават, трябва да им зададете привилегии. Привилегиите могат да бъдат присвоени с помощта на оператора GRANT:

  • ПРЕДОСТАВЯ ВСИЧКИ В demo_database.* НА ‘demo_user’; ще предостави всички привилегии на потребител, наречен demo_user в база данни, наречена demo_database;
  • ПРЕДОСТАВЯТЕ ВМЪКВАНЕ, ИЗБОР, АКТУАЛИЗИРАНЕ, ИЗТРИВАНЕ В базата данни.* ДО ‘demo_user’; ще предостави привилегии INSERT, SELECT, UPDATE и DELETE на потребител, наречен demo_user в база данни, наречена demo_database;
  • ПРЕДОСТАВЯ ИЗБОР НА demo_database.* НА ‘demo_user’; ще предостави привилегии SELECT на потребител, наречен demo_user в база данни, наречена demo_database.

За да присвоите роля на отделен потребител, използвайте този синтаксис:
 

GRANT ‘role_name’ TO ‘user_name’@’localhost’;

За да присвоите множество роли на отделен потребител, използвайте този синтаксис:

GRANT ‘role_1’, ‘role_2’ TO ‘user_name’@’localhost’;

За да присвоите роли на множество потребители едновременно, използвайте този синтаксис:

GRANT ‘role_name’ TO ‘user1’@’localhost’, ‘user2’@’localhost’;

Ролите могат да бъдат полезни за предотвратяване на инциденти със сигурността, защото ако нападателят знае паролата на не много привилегирован потребител погрешно, предполагайки, че потребителят е много „мощен“ по отношение на ролята, вашето приложение (и вашата база данни) може бъдете много добре спасени.

Запазени акаунти в MySQL

Когато става въпрос за запазени акаунти, имайте предвид, че MySQL създава акаунти по време на инициализацията на директорията с данни. Има няколко акаунта, които трябва да се считат за запазени в MySQL:

  • ‘root’@’localhost’ – този акаунт е акаунт на суперпотребител и има подобни привилегии във всички MySQL бази данни (може да извършва всякакви операции във всяка база данни на MySQL). Струва си да се отбележи, че root потребителят може също да бъде преименуван, за да се избегне излагането на високо привилегирован акаунт. За да преименувате акаунта, изпълнете следната заявка:
RENAME USER ‘root’@’localhost’ TO ‘username’@’localhost’;
  • Уверете се, че сте издали ПРИВИЛЕГИИ ЗА FLUSH; извлечение след преименуване на акаунта, за да влязат в сила промените.
  • ‘mysql.sys’@’localhost’ – този акаунт е системен потребител, който се използва като дефинер за изглед, процедури и функции в схемата на sys. Добавено в MySQL 5.7.9, за да се избегнат проблеми, които могат да възникнат, ако основният акаунт бъде преименуван.
  • ‘mysql.session’@’localhost’ – този акаунт се използва вътрешно от плъгини за достъп до сървъра.

В този случай не можете да направите много по отношение на сигурността, но имайте предвид, че root акаунтът има подобни привилегии, което означава, че може да извършва всякакви операции във всяка база данни на MySQL и да бъде внимателен когато решавате на кого да предоставите правата за достъп до акаунта. Също така, имайте предвид за какво се използват другите MySQL акаунти.

Управление на пароли в MySQL

MySQL също поддържа функции за управление на пароли. Някои от тях включват:

  • Възможността за периодично изтичане на пароли;
  • Възможността за избягване на повторно използване на пароли;
  • Възможността за генериране на пароли;
  • Възможността да се провери дали използваната парола е силна;
  • Възможността за временно заключване на потребителите след твърде много неуспешни опити за влизане.

Сега ще разгледаме тези опции допълнително.

За да изтече паролата ръчно, използвайте израза ALTER USER по следния начин:

ALTER USER ‘user’@’localhost’ PASSWORD EXPIRE;

За да зададете глобална политика, модифицирайте файла my.cnf така, че да включва параметъра default_password_lifetime. Параметърът може да бъде дефиниран под секцията [mysqld] (следният пример задава продължителността на паролата на 3 месеца (90 дни)):

default_password_lifetime=90

Ако искате паролите никога да не изтичат, задайте параметъра default_password_litetime на 0.
Можете също да зададете изтичане на паролата за конкретни потребители. Ако искате да зададете интервала на изтичане на паролата за потребител, наречен demo_user, можете да използвате следния пример:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE INTERVAL 90 DAY;

За да деактивирате изтичането на паролата:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE NEVER;

За да нулирате глобалната политика за изтичане на паролата:

ALTER USER ‘demo_user’@’localhost’ PASSWORD EXPIRE DEFAULT;

Ограниченията за повторно използване на пароли не позволяват повторното използване на пароли - за да използвате тази функция, използвайте променливите password_history и password_reuse_interval. Можете или да поставите тези променливи в my.cnf, като погледнете примера по-долу, или да ги зададете по време на изпълнение, като добавите SET PERSIST пред операторите по-долу.

За да забраните повторното използване на която и да е от 5-те използвани преди това пароли, по-нови от 365 дни, използвайте:

password_history=5
password_reuse_interval=365

За да се изискват минимум 5 промени на паролата, преди да се позволи повторна употреба:

ALTER USER ‘demo_user’@’localhost’ PASSWORD HISTORY 5;

Същото може да се направи и при създаване на потребител - заменете ALTER USER със CREATE USER.

За да генерирате произволна парола при създаване на потребител, изпълнете:

CREATE USER [email protected] IDENTIFIED BY RANDOM PASSWORD;

За да промените паролата на потребител на произволно генерирана:

SET PASSWORD FOR [email protected] TO RANDOM;

Вашата произволна парола ще бъде показана отдолу.

Имайте предвид, че произволните пароли по подразбиране имат дължина от 20 знака. Дължината може да се контролира от променливата generated_random_password_length, която има диапазон от 5 до 255.

За да проверите дали използваната парола е силна, можете да използвате променливата VALIDATE_PASSWORD_STRENGTH - функцията показва число от 0 до 100, като 0 е най-слабата и 100 е най-силната:
SELECT VALIDATE_PASSWORD_STRENGTH('парола');

Заключване на акаунт в MySQL

MySQL 8.0.19 също въведе възможността за временно заключване на потребителски акаунти. Това може да се постигне с помощта на променливите FAILED_LOGIN_ATTEMPTS и PASSWORD_LOCK_TIME.

За да активирате заключването на акаунта при създаване на потребител, изпълнете:

CREATE USER ‘demo_user’@’localhost’ IDENTIFIED BY ‘password’ FAILED_LOGIN_ATTEMPTS 5 PASSWORD_LOCK_TIME 5;

Стойността след FAILED_LOGIN_ATTEMPTS указва след колко неуспешни опита да бъде заключен акаунтът, стойността след PASSWORD_LOCK_TIME определя времето за заключване на акаунта в дни. Възможно е също така да посочите стойност, която не свършва, докато акаунтът не бъде отключен, като посочите PASSWORD_LOCK_TIME като UNBOUNDED.

Приставки за сигурност, предлагани от MySQL

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

  • Плъгини за удостоверяване;
  • Плъгини за управление на връзката;
  • Плъгини за валидиране на парола;
  • Плъгини за одит;
  • Плъгини за защитна стена;

Тези плъгини могат да се използват за редица неща от гледна точка на сигурността:

Плъгини за удостоверяване

Плъгините за удостоверяване могат да позволят на потребителите да избират между множество добавени методи за удостоверяване, налични в MySQL. Те могат да се използват заедно с изрази CREATE USER или ALTER USER. Ето пример: 

CREATE USER ‘user_1’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;

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

Плъгини за управление на връзката

Плъгините за контрол на връзката могат да въведат нарастващо забавяне в отговорите на сървъра при опити за свързване, ако опитите за свързване надхвърлят определен брой - те са в състояние да спрат потенциални атаки с груба сила. Тази библиотека с плъгини беше въведена в MySQL във версия 5.7.17 и може да бъде добавена към MySQL чрез my.cnf или чрез зареждане на плъгините в сървъра по време на изпълнение.
За да добавите плъгините към my.cnf , добавете следния ред под [mysqld]:

plugin-load-add=connection_control.so

След като промените файла, запазете промените си и рестартирайте MySQL.
За да заредите плъгините в сървъра по време на изпълнение, изпълнете:

INSTALL PLUGIN CONNECTION_CONTROL SONAME ‘connection_control.so’;
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME ‘connection_control.so’;

Коригирайте суфикса .so, ако е необходимо. Ако сте постигнали всичко правилно, таблицата CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS трябва да съдържа всички неуспешни опити за свързване.

Плъгини за проверка на парола

Плъгините за валидиране на парола могат да позволят на потребителите да използват по-силни пароли, ако се използват правилно. Приставката за валидиране на паролата може да бъде инсталирана чрез my.cnf или чрез зареждане на плъгина в сървъра по време на изпълнение. За да инсталирате приставката чрез my.cnf, добавете следния ред под [mysqld], след което рестартирайте сървъра:

plugin-load-add=validate_password.so

За да заредите приставката по време на изпълнение, изпълнете следния оператор:

INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;

За да заредите приставката по време на изпълнение и да предотвратите премахването й, добавете validate-password=FORCE_PLUS_PERMANENT към my.cnf.

За да предотвратите стартирането на сървъра, ако плъгинът не е инициализиран, използвайте опцията --validate-password със стойност FORCE или FORCE_PLUS_PERMANENT.

Политиката за сила на паролата също може да бъде променена:за да направите това, променете стойността validate_password_policy на LOW, MEDIUM или STRONG. Стойността на LOW проверява само дължината на паролата, политиката MEDIUM добавя някои условия, а политиката STRONG добавя условието, че поднизовете на паролата, които се състоят от 4 или повече знака, не трябва да съвпадат с думи в речников файл, който може да бъде посочен чрез промяна на променливата validate_password_dictionary_file.

Плъгини за ключодържатели

Плъгините за ключодържатели могат да позволят на сървърните компоненти и плъгини да съхраняват сигурно чувствителна информация за извличане. За да заредите приставката в MySQL, добавете следното под [mysqld]:

early-plugin-load=keyring_file.so

За да посочите файла с хранилище за ключове, добавете следното (променливата keyring_vault_config трябва да сочи към конфигурационния файл):

loose-keyring_vault_config=”/var/lib/mysql_keyring/keyring_vault.conf”

Файлът с ключодържател трябва да съдържа променливата vault_url, която дефинира адреса на сървъра на трезора, променливата secret_mount_point, която дефинира името на точката на монтиране, където хранилището на ключодържателя съхранява ключовете, и токен, който трябва да се дефинира от сървъра на трезора. По избор може да бъде дефинирана и променливата vault_ca (тя трябва да сочи към сертификата на CA, използван за подписване на сертификатите на трезора).

Рестартирайте сървъра, за да влязат в сила промените;

Приставки за одит

Плъгините за одит могат да активират наблюдение, регистриране и блокиране на дейност, извършвана на MySQL сървъри. За да инсталирате MySQL Enterprise Audit, стартирайте скрипт, намиращ се в директорията за споделяне на вашия MySQL екземпляр (избягвайте да поставяте паролата си за MySQL екземпляр в терминала - използвайте my.cnf):

mysql < /path/to/audit_log_filter_linux_install.sql

Можете също да предотвратите премахването на приставката по време на изпълнение - добавете следното в секцията [mysqld]:

audit_log=FORCE_PLUS_PERMANENT

Рестартирайте сървъра, за да приложите промените. Имайте предвид, че базираното на правила регистриране не регистрира събития, подлежащи на проверка по подразбиране, така че, за да регистрирате всичко, създайте филтър:

SELECT audit_log_filter_set_filter(‘log_filter’, ‘{ “filter”: { “log”: true } }’);

След това го присвоете към акаунт:

SELECT audit_log_filter_set_user(‘%’, ‘log_filter’);

Обърнете внимание, че плъгините за одит са налични само в MySQL Enterprise Edition;

Плъгини за защитна стена

Плъгините за защитна стена могат да позволят на потребителите да разрешават или отказват изпълнението на конкретни SQL оператори въз основа на специфични модели. MySQL Enterprise Firewall е въведена в MySQL 5.6.24 - тя е в състояние да защитава данните чрез наблюдение, предупреждаване и блокиране на неоторизирана дейност:може да блокира атаки с инжектиране на SQL, да наблюдава заплахи и да блокира подозрителен трафик, както и да открива прониквания в базата данни. Защитната стена също така може да регистрира блокирани изявления – те могат да бъдат проверени и също така може да се наблюдава преброяване в реално време на одобрени и отхвърлени изявления.

За да инсталирате MySQL Enterprise Firewall, просто я активирайте, когато инсталирате MySQL Server на Windows, тя може също да бъде инсталирана, деактивирана или деинсталирана с помощта на MySQL Workbench 6.3.4. Защитната стена може също да бъде инсталирана ръчно, като се изпълни скрипт в директорията за споделяне на вашата MySQL инсталация. За да активирате защитната стена, добавете следния ред под [mysqld] и рестартирайте сървъра:

mysql_firewall_mode=ON

Защитната стена може да бъде активирана и по време на изпълнение:

SET GLOBAL mysql_firewall_mode = ON;

Алтернативно, за да запазите защитната стена (което означава, че защитната стена няма да трябва да бъде активирана повторно при всяко следващо рестартиране на сървъра):

SET PERSIST mysql_firewall_mode = ON;

След това дайте привилегия FIREWALL_ADMIN на всеки акаунт, който администрира защитната стена, и привилегията FIREWALL_USER на всеки акаунт, който трябва да има достъп само до собствените си правила за защитната стена. Освен това предоставете привилегията EXECUTE за съхранените процедури на защитната стена в базата данни на mysql. За да функционира защитната стена, регистрирайте профили с нея, след това обучете защитната стена да знае разрешените изрази, които базата данни може да изпълнява и след това кажете на защитната стена да съпостави входящите оператори със зададения бял списък. Всеки профил има режим на работа - ИЗКЛЮЧЕН, ЗАПИС, ЗАЩИТА или ОТКРИВАНЕ. OFF деактивира профила, RECORDING обучава защитната стена, PROTECTING разрешава или отказва изпълнение на оператор и DETECTING открива (но не блокира) опити за проникване. Правилата за определен профил могат да бъдат нулирани, като се зададе стойността му на RESET. OFF ще деактивира профила. За да зададете режима, използвайте следната заявка, където name е името на профила, а OFF е работният режим: 

CALL mysql.sp_set_firewall_mode(name, ‘OFF’);

Плъгинът за защитна стена също е наличен само в MySQL Enterprise Edition.

Осигуряване на MySQL архиви

Що се отнася до архивирането на MySQL, имате няколко опции.

  • Ако използвате mysqldump, можете да съхраните вашето потребителско име и парола в my.cnf и да извикате mysqldump по този начин (следната команда ще изхвърли всички бази данни във файл /home/backup.sql):
$ mysqldump --defaults-extra-file=/var/lib/my.cnf --single-transaction --all-databases > /home/backup.sql
  • ​Съхранявайки вашето потребителско име и парола вътре в my.cnf, вие не пишете паролата си вътре в терминала - такъв метод за правене на резервни копия е по-сигурен, защото докато дъмпът се изпълнява, командата може да се види чрез ps ax команда.
  • Можете също да обмислите използването на mysqldump-secure, който е POSIX-съвместим скрипт за обвиване, който е в състояние да компресира и криптира резервни копия с мисъл за силна сигурност .

  • Архивните копия могат да бъдат криптирани с помощта на OpenSSL - просто вземете резервното си копие, след което го криптирайте със следната команда:

    $ openssl enc -aes-256-cbc -salt -in backup.tar.gz -out backup.tar.gz.enc -k password

    Командата по-горе ще създаде нов криптиран файл backup.tar.gz.enc в текущата директория. Файлът ще бъде криптиран с избраната от вас парола (заменете паролата с желаната от вас парола). Файлът може да бъде декриптиран по-късно, като изпълните следната команда:

    $ openssl aes-256-cbc -d -in backup.tar.gz.enc -out backup.tar.gz -k password

    Заменете паролата с вашата парола.

  • mysqldump има друга опция за криптиране на вашите архиви (следният пример също ги компресира с gzip):

    $ mysqldump --all-databases --single-transaction --triggers --routines | gzip | openssl  enc -aes-256-cbc -k password > backup.xb.enc

    Заменете паролата с желаната от вас парола.

  • Можете също да шифровате вашите архиви с помощта на mariabackup или xtrabackup. Ето пример от документацията на MariaDB:

    $ mariabackup --user=root --backup --stream=xbstream  | openssl  enc -aes-256-cbc -k password > backup.xb.enc

    Заменете паролата с желаната от вас парола.

  • Архивите могат да бъдат криптирани и с помощта на ClusterControl - ако опцията за криптиране е активирана за конкретно архивиране, ClusterControl ще криптира архива с помощта на AES-256 CBC (криптирането се извършва на резервния възел). Ако архивът се съхранява на възел на контролера, архивните файлове се предават поточно в криптиран формат с помощта на socat или netcat. Ако компресията е активирана, ClusterControl първо ще компресира архива, след това ще го криптира. Ключът за криптиране ще бъде генериран автоматично, ако не съществува, след което ще бъде съхранен в конфигурацията на CMON в опцията backup_encryption_key. Имайте предвид, че този ключ е кодиран и първо трябва да бъде декодиран. За да направите това, изпълнете следната команда:

    $ cat /etc/cmon.d/cmon_ClusterID.cnf | grep ^backup_encryption_key | cut -d"'" -f2 | base64 -d > keyfile.key

    Командата ще прочете backup_encryption_key и ще декодира стойността му в двоичен изход. Ключовият файл може да се използва за дешифриране на архива по следния начин:

    $ cat backup.aes256 | openssl enc -d -aes-256-cbc -pass file:/path/to/keyfile.key > backup_file.xbstream.gz

    За повече примери вижте документацията на ClusterControl.

Заключение

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на MySQL релационни бази данни във Fedora 20

  2. Как да съкратите таблицата в MySQL

  3. Най-добрите начини за поправяне на повредена таблица InnoDB в MySQL

  4. Как работи функцията LOWER() в MySQL

  5. Как да проверите размера на база данни в MySQL