MySQL и SSL
Материал из 1GbWiki.
Начиная с версии MySQL 5.7, хостинг 1gb.ua поддерживает защищенное подключение к базам MySQL с использованием протокола SSL.
Содержание |
[править] Для чего это нужно
MySQL клиент (веб-сайт) и сервер баз данных MySQL обмениваются друг с другом информацией по открытому каналу связи. Это значит, что если злоумышленник имеет доступ к прослушке канала, то данные, которые хранятся или записываются сайтом в базу, могут стать доступными для перехвата, так как передаются открытым текстом.
В случае установления SSL соединения между MySQL клиентом и сервером, данные передаются по каналу в зашифрованным виде, что исключает их свободное чтение при перехвате трафика.
Данная возможность будет полезна, если вы используете базы данных хостинга 1gb.ua с удаленных клиентов через публичные сети, то есть с клиентов, размещенных не на площадке хостинга. Типичные примеры использования: с сайта на другом хостинге, из программы запущенной дома или в офисе и т.п.
В том случае если сайт и база данных размещены в 1gb.ua, то использование SSL нецелесообразно, так как информация не передается по публичным каналам, что исключает ее перехват.
[править] Как воспользоваться
Проверьте, что ваша база данных создана на сервере MySQL 5.7, в личном кабинете начало -> базы данных
Если база данных находится на другом сервере, создайте новую, выбрав версию 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.ua, например
$ wget https://www.1gb.ua/1gbuarootCA.crt $ mysql -s --ssl-ca=1gbuarootCA.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.ua/1gbuarootCA.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.ua/1gbuarootCA.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"}
