Как настроить MariaDB SSL и установить безопасные соединения с различных клиентов

Как настроить MariaDB SSL и установить безопасные соединения с различных клиентовЯ собираюсь установить MariaDB SSL (Secure Sockets Layer) а также безопасные соединения от клиента MySQL и приложения PHP. Как включить SSL для сервера и клиента MariaDB, работающего в Linux или Unix-подобной системе?

MariaDB — сервер базы данных, который предлагает функциональные возможности вклинивания для сервера MySQL.

MariaDB был создан некоторыми из оригинальных авторов MySQL, с помощью более широкого штата разработчиков Free и другого программного обеспечения с открытым исходным кодом. В дополнение к основным функциям MySQL, MariaDB предлагает богатый набор улучшений функций, включая альтернативные механизмы хранения, оптимизацию серверов и другие исправления. В этом руководстве я собираюсь рассказать о том, как настроить сервер MariaDB с помощью SSL и как установить безопасные соединения с помощью консоли и PHP-скриптов.

Как настроить MariaDB SSL и установить безопасные соединения с различных клиентов
При создании сертификатов SSL важно использовать 192.168.1.100 в качестве стандартного имени.

Шаг 1 – Установка MariaDB

Введите команду в соответствии с вашим вариантом Linux или Unix.

Установка MariaDB сервера/клиента на Ubuntu/Debian Linux

Введите одну из следующих команд: apt-get command или apt command:

$ sudo apt-get install mariadb-server mariadb-client

Установка MariaDB сервера/клиента на CentOS/RHEL/Fedora Linux

Введите следующую команду yum :

$ sudo yum install mariadb-server mariadb

Для пользователей Fedora Linux необходимо ввести команду dnf :

$ sudo dnf install mariadb-server mariadb

Установка MariaDB сервера/клиента на Arch Linux

Введите следующую команду pacman:

$ sudo pacman -S mariadb

Установка MariaDB сервера/клиента на FreeBSD unix

Для установки порта запустите:

# cd /usr/ports/databases/mariadb100-server/ && make install clean
# cd /usr/ports/databases/mariadb100-client/ && make install clean

Чтобы добавить бинарный пакет, введите:

# pkg install mariadb100-server mariadb100-client

Шаг 2 – Обеспечение безопасной установки MariaDB

Введите следующую команду:

$ mysql_secure_installation

Примеры возможных выводов данных:

Обеспечение безопасной установки MariaDB
Рисунок.01: Обезопасьте установку MariaDB

Шаг 3 – Создайте CA сертификат

Создайте директорию под названием ssl в /etc/mysql/ directory :

$ cd /etc/mysql
$ sudo mkdir ssl
$ cd ssl

Значение: Стандартное значение имени (Common Name), используемое для сертификатов / ключей сервера и клиента, должно отличаться от стандартного значения имени (Common Name), используемого для сертификата CA. Чтобы избежать каких-либо проблем, я устанавливаю их следующим образом:

Стандартное имя CA: MariaDB admin
Стандартное имя сервера: MariaDB server
Стандартное имя клиента: MariaDB client

Введите следующую команду для создания нового CA ключа:

$ sudo openssl genrsa 2048 > ca-key.pem

Примеры возможных выводов данных:

Создайте CA сертификат
Рисунок.02: Создание CA ключа

Введите следующую команду для создания сертификата с помощью этого ключа:

$ sudo openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
Создайте CA сертификат
Рисунок.03: Используя ключ CA, сгенерируйте сертификат CA для MariaDB

Примеры возможных выводов данных:

Теперь у вас должно быть два следующих файла::

  1. /etc/mysql/ssl/ca-cert.pem  – Файл сертификата для Центра сертификации (Certificate Authority (CA)).
  2. /etc/mysql/ssl/ca-key.pem  – Файл ключа для Центра сертификации (Certificate Authority (CA)).

Я собираюсь использовать оба файла для создания сертификатов сервера и клиента.

Шаг 4 – Создание сертификата сервера

Для создания ключа сервера, запустите:

$ sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem

Примеры возможных выводов данных:

Создание сертификата сервера
Рисунок 04: Создание ключа сервера для сервера MariaDB

Затем обработайте ключ RSA сервера, для этого введите:

$ sudo openssl rsa -in server-key.pem -out server-key.pem

Примеры возможных выводов данных:

writing RSA key

Наконец, подпишите сертификат сервера, для этого запустите:

$ 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=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=MariaDB server
						
Getting CA Private Key

Теперь у вас должны появиться дополнительные файлы:

  1. /etc/mysql/ssl/server-cert.pem  – MariaDB файл сертификата сервера.
  2. /etc/mysql/ssl/server-key.pem  – MariaDB файл ключа сервера.

Вы должны использовать не менее двух файлов на сервере MariaDB и любых других узлах, которые вы собираетесь использовать для трафика кластера/репликации. Эти два файла будут защищать связь на стороне сервера.

Шаг 5 – Создание сертификата клиента

Клиент mysql, и приложение PHP/Python/Perl/Ruby будет использовать сертификат клиента для защиты соединяемости клиента. Вы должны установить следующие файлы на всех ваших клиентах, включая веб-сервер. Чтобы создать клиентский ключ, запустите:

$ sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout client-key.pem -out client-req.pem

Примеры возможных выводов данных:

Создание сертификата клиента
Рисунок.05: Создание ключа клиента для сервера MariaDB

Затем обработайте ключ клиента RSA, для этого введите

$ sudo openssl rsa -in client-key.pem -out client-key.pem
writing RSA key

Наконец, подпишите сертификат клиента, для этого запустите:

$ 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

Примеры возможных выводов данных:

Signature ok
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=MariaDB client
						
Getting CA Private Key

Шаг 6 – Как проверить сертификаты?

Введите следующую команду, чтобы проверить сертификаты, чтобы убедиться, что все было создано правильно:

$ openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem

Примеры возможных выводов данных:

server-cert.pem: OK
client-cert.pem: OK

Не должно быть никаких ошибок, и вы должны получить ответ OK для сертификатов сервера и клиента.

Шаг 7 – Настройте сервер MariaDB для использования SSL

Отредактируйте файл vi /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

Сохраните и закройте файл. Вы можете перезапустить mariadb следующим образом:

$ sudo /etc/init.d/mysql restart

Или

$ sudo systemctl restart mysql

Шаг 8 – Настройте клиент MariaDB для использования SSL

Настройте MariaDB клиент как 192.168.1.200 для использования SSL (добавьте в /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf ):

$ sudo vi /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf

Добавьте [mysql] в раздел:

## 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										
### This option is disabled by default ###
### ssl-verify-server-cert ###

Сохраните и закройте файл. Вы должны скопировать файлы /etc/mysql/ssl/ca-cert.pem , /etc/mysql/ssl/client-cert.pem и /etc/mysql/ssl/client-key.pem  для всех ваших клиентов. Например:

{vivek@server}: 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}
$ mysql -u root -h 192.168.1.100 -p mysql
$ mysql -u root -h 127.0.0.1 -p mysql

Введите следующую SHOW VARIABLES LIKE ‘%ssl%’; команду в MariaDB [(none)]> строке:

MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';

ИЛИ выполните команду status:

MariaDB [(none)]> status;

Примеры возможных выводов данных:

Введите следующую SHOW VARIABLES LIKE
Рисунок 06: Установление безопасного соединения с консолью и ее проверка

Проверьте соединения SSL и TLS. Следующая команда должна завершиться неудачей, так как ssl 3 не поддерживается и, соответственно, она не настроена для использования:

$ openssl s_client -connect 192.168.1.100:3306 -ssl3
140510572795544:error:140A90C4:SSL routines:SSL_CTX_new:null ssl method passed:ssl_lib.c:1878:

Проверьте TLS v 1/1.1/1.2:

$ 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

Примеры возможных выводов данных:

CONNECTED(00000003)
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 5 bytes and written 7 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1485335036
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
---

Как читать файл захвата пакета tcpdump для проверки защищенной связи

Наконец, вы можете использовать анализатор пакетов команд tcpdump, который запускается под командной строкой, чтобы посмотреть порт 3306:

$ sudo tcpdump -i eth0 -s 65535 port 3306 -w /tmp/mysql.pcap

Теперь подключитесь к вашему приложению PHP/Python/Perl/Ruby mysql или консольному приложению mysql:

$ mysql -u bar -h 192.168.1.100 -p foo

Используйте tcpdump для проверки того, что никакая текстовая информация, включая пароли, не обменивается между сервером и клиентом. Это делается следующим образом:

$ tcpdump -r /tmp/mysql.pcap | less

Вы можете прочитать захваченный трафик с помощью tcpdump или других инструментов, таких как Wireshark.

Шаг 10 – Добавлениепользователя на MariaDB сервер

Введите следующую команду:

$ mysql -u root –p

Создайте базу данных под названием foo:

CREATE DATABASE foo;

Создайте пользователя с имение bar for  для базы данных под названием foo:

GRANT ALL ON foo.* TO bar@localhost IDENTIFIED BY 'mypassword' REQUIRE SSL;

Предоставление доступа с веб-сервера, размещенного по адресу 192.168.1.200:

GRANT ALL ON foo.* TO bar@192.168.200 IDENTIFIED BY 'mypassword' REQUIRE SSL;

Создайте безопасное соединение из оболочки bash

Вы можете войти в систему с консоли следующим образом:

$ mysql -u bar -p -h 192.168.1.100 foo

Создайте безопасное соединение из Python

Сначала установите интерфейс Python для MySQL:

$ sudo apt-get install python-mysql.connector

ИЛИ для Python v3.x

$ sudo apt-get install python3-mysql.connector

Здесь приведен пример кода Python для безопасного соединения с использованием:

#!/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')

Перевод: Анна Давыдова
Источник: cyberciti.biz

Это интересно:

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *