MySQL и SSL
Материал из 1GbWiki.
Начиная с версии MySQL 5.7, хостинг 1Гб.ру поддерживает защищенное подключение к базам MySQL с использованием протокола SSL.
Содержание |
Для чего это нужно
MySQL клиент (веб-сайт) и сервер баз данных MySQL обмениваются друг с другом информацией по открытому каналу связи. Это значит, что если злоумышленник имеет доступ к прослушке канала, то данные, которые хранятся или записываются сайтом в базу, могут стать доступными для перехвата, так как передаются открытым текстом.
В случае установления SSL соединения между MySQL клиентом и сервером, данные передаются по каналу в зашифрованным виде, что исключает их свободное чтение при перехвате трафика.
Данная возможность будет полезна, если вы используете базы данных хостинга 1Гб.ру с удаленных клиентов через публичные сети, то есть с клиентов, размещенных не на площадке хостинга. Типичные примеры использования: с сайта на другом хостинге, из программы запущенной дома или в офисе и т.п.
В том случае если сайт и база данных размещены в 1Гб.ру, то использование 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.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"}