Я собираюсь установить MariaDB SSL (Secure Sockets Layer) а также безопасные соединения от клиента MySQL и приложения PHP. Как включить SSL для сервера и клиента MariaDB, работающего в Linux или Unix-подобной системе?
MariaDB — сервер базы данных, который предлагает функциональные возможности вклинивания для сервера MySQL.
MariaDB был создан некоторыми из оригинальных авторов MySQL, с помощью более широкого штата разработчиков Free и другого программного обеспечения с открытым исходным кодом. В дополнение к основным функциям MySQL, MariaDB предлагает богатый набор улучшений функций, включая альтернативные механизмы хранения, оптимизацию серверов и другие исправления. В этом руководстве я собираюсь рассказать о том, как настроить сервер MariaDB с помощью SSL и как установить безопасные соединения с помощью консоли и PHP-скриптов.
Шаг 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
Примеры возможных выводов данных:
Шаг 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
Примеры возможных выводов данных:
Введите следующую команду для создания сертификата с помощью этого ключа:
$ sudo openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
Примеры возможных выводов данных:
Теперь у вас должно быть два следующих файла::
- /etc/mysql/ssl/ca-cert.pem – Файл сертификата для Центра сертификации (Certificate Authority (CA)).
- /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
Примеры возможных выводов данных:
Затем обработайте ключ 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
Теперь у вас должны появиться дополнительные файлы:
- /etc/mysql/ssl/server-cert.pem – MariaDB файл сертификата сервера.
- /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
Примеры возможных выводов данных:
Затем обработайте ключ клиента 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;
Примеры возможных выводов данных:
Проверьте соединения 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
Это интересно: