Шаг 1 – Установите MariaDB, если она не установлена.
Введите команду в соответствии с вашим вариантом Linux или Unix. НаUbuntu/Debian
подобных системах используйте команду apt-get
или команду apt
:
sudo apt-get install mariadb-server mariadb-client
На CentOS/RHEL/Fedora
Linux используйте yum
:
sudo yum install mariadb-server mariadb
Для Fedora Linux
также возможна установка с помощью dnf
:
sudo dnf install mariadb-server mariadb
На Arch Linux
установка MariaDB
server/client происходит с помощью pacman:
sudo pacman -S mariadb
Для FreeBSD
установка MariaDB server/client из портов:
cd /usr/ports/databases/mariadb100-server/ && make install clean
cd /usr/ports/databases/mariadb100-client/ && make install clean
Можно поставить бинарный пакет:
pkg install mariadb100-server mariadb100-client
Для установки MariaDB на Alpine Linux
используется apk
apk add mysql mysql-client
mysql_install_db --user=mysql --datadir=/var/lib/mysql
rc-update add mariadb
rc-service mariadb start
mysqladmin -u root password 'my-password-here'
Шаг 2 - настройка после установки. Запустите утилиту:
mysql_secure_installation
Шаг 3 Создание TLS/SSL сертификата
Создайте папку ssl в директории /etc/mysql/ с помощью команды mkdir:
cd /etc/mysql
sudo mkdir ssl
cd ssl
Важное замечание:
Значение общего имени, используемое для сертификатов/ключей сервера и клиента, должно отличаться
от значения общего имени,
используемого для сертификата CA. Чтобы избежать проблем, назовите сертификаты именно так, как предлагаем мы
.
В противном случае вы получите сообщение об ошибке «Проверка сертификации не удалась».
CA common Name : MariaDB admin
Server common Name: MariaDB server
Client common Name: MariaDB client
Введите следующие команды для того, чтобы сгенерировать сертификаты:
sudo openssl genrsa 2048 >
ca-key.pem
ИЛИ
sudo openssl genrsa 4096 >
ca-key.pem
Теперь сгенерируем сертификат используя только что созданный ключ:
sudo openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
У вас должно получиться два файла:
/etc/mysql/ssl/ca-cert.pem — файл сертификата для центра сертификации (CA).
/etc/mysql/ssl/ca-key.pem — файл ключей для центра сертификации (CA).
Мы будем использовать оба файла.
Шаг 4. Создадим SSL-сертификат для сервера.
Чтобы создать сертификат для сервера, запустите:
sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem
Далее создадим RSA ключ:
sudo openssl rsa -in server-key.pem -out server-key.pem
И наконец подпишем сертификат:
sudo openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Signature ok
subject=/C=RU/ST=MSK/O=DTGP Ltd/CN=MariaDB server
Getting CA Private Key
Должно появиться 2 дополнительных файла:
/etc/mysql/ssl/server-cert.pem – MariaDB server certificate file.
/etc/mysql/ssl/server-key.pem – MariaDB server key file.
Эти два вышеуказанных файла должны использоваться на самом сервере MariaDB и любых других узлах,
которые вы собираетесь использовать для трафика кластера/репликации.
Эти два файла как раз и обеспечивают безопасность связи на стороне сервера.
Шаг 5. Создайте клиентский сертификат TLS/SSL.
Клиент MySQL, как и любое приложение PHP/Python/Perl/Ruby будет использовать сертификат клиента для защиты подключения на стороне клиента. Вы должны установить следующие файлы на всех своих клиентах, включая веб-сервер. Чтобы создать ключ клиента, запустите:
sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout client-key.pem -out client-req.pem
Создадим RSA ключ:
sudo openssl rsa -in client-key.pem -out client-key.pem
И подпишем клиентский сертификат:
sudo openssl x509 -req -in client-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Шаг 6. Проверка сертификата.
openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
Ожидаемый ответ:
server-cert.pem: OK
client-cert.pem: OK
Шаг 7. Установка сертифитата на сервер MariaDB.
Отредактируем/etc/mysql/mariadb.conf.d/50-server.cnf
или /etc/mysql/mariadb.cnf
sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
В секцию [mysqld]
добавим:
### MySQL Server ###
## Securing the Database with ssl option and certificates ##
## There is no control over the protocol level used. ##
## mariadb will use TLSv1.0 or better. ##
#ssl
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/server-cert.pem
ssl-key=/etc/mysql/ssl/server-key.pem
## Set up TLS version here. For example TLS version 1.2 and 1.3 ##
tls_version = TLSv1.2,TLSv1.3
Сохраним файл, и зададим права на сертификаты.
sudo chown -Rv mysql:root /etc/mysql/ssl/
Перезапустим сервис:
sudo /etc/init.d/mysql restart
или
sudo systemctl restart mysql
Проверим лог файлы (если они ведутся) на наличие ошибок по сертификатам.
sudo grep ssl /var/log/syslog
sudo grep ssl /var/log/syslog | grep key
sudo grep mysqld /var/log/syslog | grep -i ssl
Шаг 8. Конфигурация клиента MariaDB SSL
В файле /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf секция [mysql]
sudo vi /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf
## MySQL Client Configuration ##
ssl-ca=/etc/mysql/ssl/ca-cert.pem
ssl-cert=/etc/mysql/ssl/client-cert.pem
ssl-key=/etc/mysql/ssl/client-key.pem
## Force TLS version for client too
#tls_version = TLSv1.2,TLSv1.3
### This option is disabled by default ###
### ssl-verify-server-cert ###
Сохраним и закроем. Все сертификаты должны быть на своем месте.
rsync /etc/mysql/ssl/ca-cert.pem /etc/mysql/ssl/client-cert.pem /etc/mysql/ssl/client-key.pem \
user@client:/etc/mysql/ssl
Шаг 9. Проверка
mysql -u {User-Name-Here} -h {Server-IP-here} -p {DB-Name-Here}
SHOW VARIABLES LIKE '%ssl%';
status;
SHOW SESSION STATUS LIKE 'Ssl_cipher';
openssl s_client -connect 192.168.1.100:3306 -ssl3
openssl s_client -connect 192.168.1.100:3306 -tls1
openssl s_client -connect 192.168.1.100:3306 -tls1_1
openssl s_client -connect 192.168.1.100:3306 -tls1_2
Можно запустить tcpdump и убедиться, что соединение зашифровано.
sudo tcpdump -i eth0 -s 65535 port 3306 -w /tmp/mysql.pcap
sudo tcpdump -r /tmp/mysql.pcap | less
Шаг 10. Обязательное шифрование.
Добавим пользователя и БД. Укажем, что соединятьсянужно только по SSL
, используя опцию REQUIRE SSL
:
mysql -u root -p
CREATE DATABASE foo;
GRANT ALL ON foo.* TO bar@localhost IDENTIFIED BY 'mypassword' REQUIRE SSL;
GRANT ALL ON foo.* TO [email protected] IDENTIFIED BY 'mypassword' REQUIRE SSL;
или добавим нужному логину только SSL
ALTER USER 'alice'@'%' REQUIRE SSL;
Проверка:
mysql -u bar -p -h 192.168.1.100 foo
SSL Python
sudo apt-get install python-mysql.connector
или
sudo apt-get install python3-mysql.connector
Примерный код для соединения через Python по SSL:
#!/usr/bin/python
import MySQLdb
ssl = {'cert': '/etc/mysql/ssl/client-cert.pem', 'key': '/etc/mysql/ssl/client-key.pem'}
conn = MySQLdb.connect(host='192.168.1.100', user='bar', passwd='mypassword', ssl=ssl)
cursor = conn.cursor()
cursor.execute("SHOW STATUS LIKE 'Ssl_cipher'")
print cursor.fetchone()
или
#!/usr/bin/python
# Note (Example is valid for Python v2 and v3)
from __future__ import print_function
import sys
import mysql.connector
from mysql.connector.constants import ClientFlag
config = {
'user': 'bar',
'password': 'mypassword',
'host': '192.168.1.100',
'client_flags': [ClientFlag.SSL],
'ssl_ca': '/etc/mysql/ssl/ca-cert.pem',
'ssl_cert': '/etc/mysql/ssl/client-cert.pem',
'ssl_key': '/etc/mysql/ssl/client-key.pem',
}
cnx = mysql.connector.connect(**config)
cur = cnx.cursor(buffered=True)
cur.execute("SHOW STATUS LIKE 'Ssl_cipher'")
print(cur.fetchone())
cur.close()
cnx.close()
мы ожидаем получить такой ответ:
('Ssl_cipher', 'DHE-RSA-AES256-SHA')
Дополнительно:
https://mariadb.com/kb/en/securing-connections-for-client-and-server/https://mariadb.com/kb/en/configuring-mariadb-for-remote-client-access/
Если не хочется все это делать вручную - воспользуйтесь
бесплатным генератором
SSL/TLS сертификатов на нашем сайте:
digiCERTs.ru
У нас так же можно приобрести
платный сертификат
, если он будет вам необходим (мы работаем с GlobalSign).
Бонусом будет бесплатный мониторинг срока действия сертификата.
Мы перевыпустим вам сертификат, как только срок его действия будет подходить к концу.