MySQL и SSL

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

Перейти к: навигация, поиск

Начиная с версии 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"}
Личные инструменты