MySQL и SSL

Материал из 1GbWiki.

(Различия между версиями)
Перейти к: навигация, поиск

Версия 16:26, 22 ноября 2018

Начиная с версии MySQL 5.7, хостинг 1Гб.ру поддерживает защищенное подключение к базам MySQL с использованием протокола SSL.

Содержание

Для чего это нужно

MySQL клиент (веб-сайт) и сервер баз данных MySQL обмениваются друг с другом информацией по открытому каналу связи. Это значит, что если злоумышленник имеет доступ к прослушке канала, то данные, которые хранятся или записываются сайтом в базу, могут стать доступными для перехвата, так как передаются открытым текстом.

В случае установления SSL соединения между MySQL клиентом и сервером, данные передаются по каналу в зашифрованным виде, что исключает их свободное чтение при перехвате трафика.

Данная возможность будет полезна, если вы используете базы данных хостинга 1Гб.ру с удаленных клиентов через публичные сети, то есть с клиентов, размещенных не на площадке хостинга. Типичные примеры использования: с сайта на другом хостинге, из программы запущенной дома или в офисе и т.п.

В том случае если сайт и база данных размещены в 1Гб.ру, то использование SSL нецелесообразно, так как информация не передается по публичным каналам, что исключает ее перехват.

Как воспользоваться

Проверьте, что ваша база данных создана на сервере MySQL 5.7, в личном кабинете начало -> базы данных

База данных в личном кабинете 1Gb.ru
База данных в личном кабинете 1Gb.ru

Если база данных находится на другом сервере, создайте новую, выбрав версию MySQL 5.7 или выше.

Консольный клиент mysql

Современные MySQL клиенты умеют автоматически устанавливать SSL соединение, если видят, что данная возможность присутствует на сервере. Например, подключение из консольного клиента mysql:

$ mysql -s -hадрес_сервера_mysql -uимя_пользователя имя_базы -p
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.7.24, for Linux (x86_64) using  EditLine wrapper

Connection id:          374517
SSL:                    Cipher in use is DHE-RSA-AES256-SHA

Если у вас mysql-клиент младше версии 5.7.3, то для подключения потребуется специальный сертификат для проверки подлинности, скачать вы можете его со страницы Корневой сертификат безопасности 1Gb.ru, например

$ wget https://www.1gb.ru/in-solve-2016.crt
$ mysql -s --ssl-ca=in-solve-2016.crt -hадрес_сервера_mysql -uимя_пользователя имя_базы -p
mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.6.36, for Linux (x86_64) using  EditLine wrapper

Connection id:          377004
SSL:                    Cipher in use is DHE-RSA-AES256-SHA

Подключение из PHP

PHP 7 и выше

<?php

$db_host = 'адрес_сервера_бд';
$db_user = 'имя_пользователя_бд';
$db_name = 'имя_бд';
$db_pass = 'пароль_бд';

$db = mysqli_init();
if (! $link = mysqli_real_connect($db, $db_host, $db_user, $db_pass, $db_name, NULL, NULL, MYSQLI_CLIENT_SSL)) {
    die('Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error() . "\n");
}

$res = $db->query("SHOW STATUS LIKE 'Ssl_cipher'");
while ($row = $res->fetch_array()) {
    print_r($row);
}

mysqli_close($db);

?>

Результатом работы скрипта будет:

Array
(
    [0] => Ssl_cipher
    [Variable_name] => Ssl_cipher
    [1] => DHE-RSA-AES256-SHA
    [Value] => DHE-RSA-AES256-SHA
)

PHP 5

Поддерживается в ограниченном режиме, только в случае драйвера mysqlnd или внешней библиотеки начиная с версии 5.5 (см. вывод функции phpinfo).

Python

На примере использования модуля mysqlclient. Также потребуется удостоверяющий сертификат:

$ wget https://www.1gb.ru/in-solve-2016.crt
$ python
Python 3.7.0 (default, Sep 14 2018, 13:53:54)
[GCC 4.9.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> ssl = {'ca': 'in-solve-2016.crt'}
>>> db = MySQLdb.connect(host='адрес_сервера_бд', user='пользователь_бд', passwd='пароль_бд', ssl=ssl)
>>> cursor = db.cursor()
>>> cursor.execute("SHOW STATUS LIKE 'Ssl_cipher'")
>>> data = cursor.fetchone()
>>> print (data);
('Ssl_cipher', 'DHE-RSA-AES256-SHA')

Ruby

С использованием модуля mysql2

$ wget https://www.1gb.ru/in-solve-2016.crt
#!/usr/bin/env ruby
require "mysql2"

connect = Mysql2::Client.new(:host => 'адрес_сервера_бд',
                             :username => 'пользователь_бд',
                             :password => 'пароль_бд',
                             :database => 'имя_бд',
                             :sslca => 'in-solve-2016.crt')
result = connect.query("SHOW STATUS LIKE 'Ssl_cipher'")
result.each { |x| puts x }

Результат работы

{"Variable_name"=>"Ssl_cipher", "Value"=>"DHE-RSA-AES256-SHA"}
Личные инструменты