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"}