Налаштування SSL/TLS на MySQL. Використання зашифрованого з'єднання. Частина 1
Колеги всім привіт.
У сьогоднішній статті ми поговоримо про те, як зробити так, щоб наше з'єднання з базою даних Mysql було надійним. При незашифрованому з'єднанні між клієнтом і сервером є , що надсилаються або одержуються між клієнтом і сервером. MySQL підтримує зашифровані з'єднання між клієнтами та сервером за допомогою протоколу TLS (Transport Layer Security).
Вміст статті:
- Перевірте, що SSL увімкнено.
- Перевірка підтримуваних протоколів TLS.
- SSL стандартний сертифікат.
- Опис ключів.
- Змусити користувачів підключатися зашифрованим каналом.
- Авторизація SSL сертифіката.
- Як дізнатися, що я підключився зашифрованим каналом.
- Підсумки.
1. Перевірте, що SSL увімкнено.
Перш за все нам потрібно перевірити чи увімкнено SSL на базі даних. Для перевірки скористаємося командою:
mysql> SHOW VARIABLES LIKE '%have_%';
Змінні які відповідають за включення ssl на базі даних називаються:
- have_openssl
- have_ssl
Якщо значення YES увімкнено. За замовчуванням при установці СУБД вже SSL увімкнено.
2. Перевірка підтримуваних протоколів TLS.
СУБД Mysql може підтримувати безліч протоколів шифрування. Наприклад: TLSv1,TLSv1.1,TLSv1.2,TLSv1.3. Версія протоколу шифрування буде залежати від того, яка версія пакета openssl встановлена в системі. Версії протоколів TLSv1 і TLSv1.1 вважаються застарілими і не надійними, і в останніх версіях баз даних вони будуть видалені. Щоб була підтримка сучасних протоколів шифрування, необхідно, щоб у вас пакет openssl був встановлений не нижчу версії openssl 1.1.1.
Щоб перевірити які версії протоколу шифрування на даний момент підтримує моя СУБД скористаюся командою:
mysql> SHOW VARIABLES LIKE 'tls_version';
Як бачимо моя СУБД версії 8.0.29 підтримує протоколи шифрування TLSv1.2,TLSv1.3
Можна явно вказати СУБД яку версію протоколу шифрування потрібно використовувати, для цього потрібно до конфігураційного файлу додати параметр:
[mysqld]
tls_version=TLSv1.2,TLSv1.3
3. SSL сертифікат за промовчанням.
Коли ви тільки встановлюєте СУБД на сервер, то сама СУБД вже самостійно створить перший сертифікат і покладе його в директорію де у вас лежать всі файли бази даних (datadir).
Можна ще перевірити через консоль бази даних як називаються ваші ключі.
mysql> SHOW VARIABLES LIKE '%ssl%';
4. Опис ключів.
- ssl_ca - Шлях до файлу сертифіката центру сертифікації.
- ssl_cert - Шлях до файлу сертифіката відкритого ключа.
- ssl_key - Шлях до файлу закритого ключа.
До речі відкритий ключ можна комусь передати, щоб у людини була можливість підключатися з клієнтських додатків до бази даних.
5. Змусити користувачів підключатися зашифрованим каналом.
Я впевнений на 100% що ніхто з вас не знав, що при з'єднанні з базою даних спочатку СУБД намагається з'єднатися з клієнтом по зашифрованому каналу, а якщо не виходить підключитися, то вже йде підключення по звичайному каналу без шифрування. Так щоб змусити клієнтів підключатися завжди зашифрованим каналом існує системна змінна під назвою&rbr;require_secure_transport. Давайте додамо її до конфігураційного файлу.
[mysqld]
require_secure_transport = ON
Тепер потрібно створити обліковий запис, в якому буде можливість підключатися тільки зашифрованим з'єднанням.
mysql> CREATE USER 'test_ssl'@'localhost' IDENTIFIED BY 'Jkjd#8sDF34' REQUIRE X509;
Якщо параметр REQUIRE X509 і вказує що при авторизації в базу даних вимагати зашифроване з'єднання та використання дійсного сертифіката X.509.
І тепер коли користувач просто намагатиметься зайти в базу, то він отримає помилку ERROR 1045 (28000).
Access denied for user 'test_ssl'@'localhost' (using password: YES)
6. Авторизація по SSL сертифікату.
Завжди коли ми підключаємося до бази даних ми використовуємо команду mysql -u username -p після водимо пароль від облікового запису і все, то тепер потрібно вказувати більше параметрів.
$. mysql -u test_ssl -p --ssl-ca=/app/mysql/data/ca.pem --ssl-cert=/app/mysql/data/server-cert.pem --ssl-key=/app/mysql /data/server-key.pem
Опис ключів дивіться у 4 розділі.
Можна обійтися без цих параметрів при підключенні до бази даних. Для цього нам потрібно вказати всі параметри ключів шифрування в конфігураційний файл.
[mysqld]
ssl_ca=/app/mysql/data/ca.pem
ssl_cert=/app/mysql/data/server-cert.pem
ssl_key=/app/mysql/data/server-key.pem
require_secure_transport=ON
[client]
ssl_ca=/app/mysql/data/ca.pem
ssl_cert=/app/mysql/data/server-cert.pem
ssl_key=/app/mysql/data/server-key.pem
7. Як дізнатися, що я підключився зашифрованим каналом.
У вас є два варіанти перевірок того, що ви дійсно підключилися зашифрованим каналом.
Перший це коли ви тільки підключилися до бази даних і у вас з'явиться повідомлення привітання.
Другий варіант це в тій же сесії виконати запит:
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G;
або
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
Якщо значення змінної не порожнє, це означає, що ви підключилися по зашифрованому каналу.
8. Підсумки.
У підсумку колеги ми сьогодні розглянули, як налаштувати захищене підключення до бази даних на основі SSL сертифікатів. У наступній статті на цю тему я вам розповім, як створювати нові сертифікати і як дізнатися, коли термін дії сертифіката закінчується.
Всім дякую, я сподіваюся, що вам моя стаття хоч чимось допомогла.