Настройка SSL/TLS соединения MariaDB / MYSQL

Настройка SSL/TLS соединения MariaDB / MYSQL
Самое подробное описание того, как настроить SSL/TLS соединения MariaDB / MYSQL между хостами.

Шаг 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).
Бонусом будет бесплатный мониторинг срока действия сертификата. Мы перевыпустим вам сертификат, как только срок его действия будет подходить к концу.

Перейти digiCERTs.ru

Самое подробное описание того, как настроить SSL/TLS соединения MariaDB / MYSQL между хостами.

Как создать почту со своим доменом? Установка и настройка почтового сервера CentOS linux (Postfix) Добавление пользователя в Linux, права sudo Crypto Pro на Mac OS Мелкие проблемы и их решения DKIM на Postfix Как заказать российский SSL-сертификат для компаний через Госуслуги Сертификаты Минцифры РФ (российские сертификаты). Как установить? Как восстановить взломанный сервер VmWare *.vmdk CVE-2020-3992 / CryptoLocker Бекап на ЯндексДиск из под Linux Запись образа ISO на флешку в MacOS Как отформатировать и примонтировать зашифрованный диск в Ubuntu / Debian Asterisk подключение модемов Настройка PHP-FPM в связке Apache2 (Ubuntu/Debian) Настройка SSL/TLS соединения MariaDB / MYSQL Собираем почту с других почтовых ящиков с помощью fetchmail Как посмотреть и очистить очередь сообщений POSTFIX Резервная копия (Backup) виртуальных машин ProxMox по NFS (CentOS / Debian 12 / Ubuntu) Установка и настройка OpenVPN на Debian 12 ASTERISK 19, 20, 21 REALTIME на DEBIAN 12 Установка ASTERISK 20 / 21 из исходников на Debian/Ubuntu/Centos nginx debian12
Оставьте комментарий, задайте вопрос