Домены
Интересные статьи
Домены

Работа MySQL с SSL

Если вы хотите предоставить доступ клиенту к серверу баз данных, который находится не на этом сервере, то как правило вы создаете VPN подключение. Это позволяет безопасно получить доступ к серверу, без необходимости открывать его в "мир"

Но бывают ситуации, когда нет возможности использовать VPN (например: не знаете как установить, считаете его слишком сложным или просто нет возможности его использовать).

Для таких случаев, MySQL имеет поддержку SSL. Это гарантирует, что ваша база данных будет защищена даже, если она будет доступна публично.  Более того, вы можете открыть доступ не ко всему серверу, а только с определенных IP или через  SSL.

Чуть ниже мы рассмотрим, как же заставить работать MySQL с SSL.

Для примера я буду использовать Ubuntu 14.04 с MySQL. Также подойдет и MariaDB.

И так приступим:

Настройка сервера

Предположим, что у нас не установлен MySQL сервер, поэтому первым пунктом установим его:

sudo apt-get install mysql-server

Во время установки вас попросят задать пароль для пользователя root сервера базы данных. Запомните его.

Теперь нам нужно сгенерировать сертификат центра сертификации (CA). С его помощью создаются и серверные и клиентские сертификаты. В момент установления соединение, сервер сверяет сертификат клиента с центром сертификации и если все в порядке — клиент считается надежным и устанавливается защищенное соединение.

Сгенерируем сертификат CA и закрытый ключ. Для этого перейдите в /etc/mysql и введите следующую команду:

openssl genrsa 2048 > ca-key.pem

Так мы сгенерировали закрытый ключ СА, теперь с его помощью получим сертификат СА:

openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

Здесь в параметре -days указан срок действия сертификата (в нашем случае 10 лет).

При этом у вас спросят ряд вопросов, на которые требуется ответить.

Теперь создадим закрытый ключ сервера:

openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem

Снова заполните все поля. Оставьте "A challenge password" пустым т.к. пароль всё равно будет удален на следующем этапе.

Теперь экспортируем закрытый ключ в закрытый ключ RSA:

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

И наконец создаем сертификат сервера, используя сертификат СА

openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

Теперь, когда мы имеем сертификат сервера, сертификат СА и его закрытый ключ — настроим MySQL на их использование.

Откройте /etc/mysql/my.cnf и добавьте следующие строки в секцию [mysqld]:

ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

И при следующем запуске MySQL сервера, он включит SSL и начнет принимать SSL соединения.

Теперь изменим следующую строку:

bind-address = 127.0.0.1

на

bind-address = *

Это позволит MySQL серверу принимать соединения не только с localhost, но и с любого IP адреса (сервер станет доступным извне).

Применим настройки:

sudo service mysql restart

Финальным шагом настройки серверной части будет создание пользователя, который будет иметь доступ к серверу. Также укажем, что для доступа будет использован SSL и подключение без SSL будет невозможно.

Авторизуемся на сервере MySQL:

mysql -u root -p

И создадим пользователя следующей командой:

GRANT ALL PRIVILEGES ON *.* TO ‘cyber01’@’%’ IDENTIFIED BY ‘mymegapass’ REQUIRE SSL;

Пароль желательно выбрать получше, чем я указал 🙂

Вы можете указать, куда и откуда будет иметь доступ пользователь

Например: разрешить пользователю доступ к базе данных sites только с IP 192.168.1.100

GRANT ALL PRIVILEGES ON ‘sites’.* TO ‘cyber01’@’ 192.168.1.100 ′ IDENTIFIED BY ‘ mymegapass ’ REQUIRE SSL;

Теперь сбросим кеш привилегий, чтобы пользователь смог подключиться:

FLUSH PRIVILEGES;

Вот и всё, настройка сервера закончена!

Настройка клиента

Теперь для каждого из клиентов нужно сгенерировать личный сертификат, а для начала получим закрытый ключ клиента.

openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem

Экспортируем его в закрытый ключ RSA:

openssl rsa -in client-key.pem -out client-key.pem

И теперь создадим сертификат, используя закрытый ключ СА и его сертификат.

openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

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

ca-cert.pem
client-key.pem
client-cert.pem

Сделать это можно любым, удобным для вас способом, я это описывать не буду.

Установим клиентскую часть MySQL сервера:

sudo apt-get install mysql-client

Откроем файл /etc/mysql/my.cnf и добавим в секцию [client] следующие строки:

ssl-cert=/etc/mysql/client-cert.pem
ssl-key=/etc/mysql/client-key.pem

Собственно и все.

Теперь пробуем подключиться к серверу, используя SSL:

mysql -h IP -u cyber01 -p

Введите ваш пароль и, если, вы всё сделали правильно — вы авторизуетесь на MySQL сервере, с использованием SSL.

 Удачи 🙂

 

Обо мне cyber01

Прочитайте также

Как установить MariaDB на Debian 10 (Buster)

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

Как установить обновления безопасности Ubuntu 18.04 вручную

В данной статье я расскажу как установить обновления безопасности Ubuntu 18.04 вручную. Скачать в PDF …

Как удалить все записи о вложениях за определенный период в WordPress

DELETE FROM wp_postmeta WHERE post_id IN ( SELECT tempT.post_id FROM ( SELECT post_id AS post_id …

3 комментария

  1. ERROR 2026 (HY000): SSL connection error: protocol version mismatch

  2. >Теперь для каждого из клиентов нужно сгенерировать личный сертификат, а для начала получим
    >закрытый ключ клиента.

    Зачем? Личный сертификат нужен, если авторизация будет по сертификату. А у вас — по паролю. В этой ситуации личный сертификат не нужен.

Добавить комментарий

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