В этой статье мы покажем вам, как настроить удаленно и защитить соединение для MySQL на Ubuntu 16.04 VPS. Если вы используете нешифрованное соединение для подключения к удаленному серверу MariaDB/MySQL, то все с доступом к сети могут контролировать и анализировать данные, отправленные или полученные между клиентом и сервером. Это руководство должно работать на других системах Linux VPS также хорошо, но было проверено и написано для Ubuntu 16.04 VPS.
ssh my_sudo_user@my_server
Действия, описанные в этом руководстве предполагают, что вы установили MySQL 5.7 с конфигурацией по умолчанию.
Мы будем использовать местный орган сертификации как самоподписной корневой сертификат, чтобы подписать оба клиента и сервер сертификатов. Для того, чтобы создать новый файл органа местного сертификата, выполните следующие команды:
sudo openssl genrsa -out /etc/mysql/ca-key.pem 2048 sudo chmod 600 /etc/mysql/ca-key.pem sudo openssl req -new -key /etc/mysql/ca-key.pem -out /etc/mysql/ca-csr.pem -subj /CN=mysql-CA/ sudo openssl x509 -req -in /etc/mysql/ca-csr.pem -out /etc/mysql/cacert.pem -signkey /etc/mysql/ca-key.pem -days 3650 sudo echo 01 > /etc/mysql/cacert.srl
Для получения сертификата сервера и ключа, выполните следующие команды:
sudo openssl genrsa -out /etc/mysql/server-key.pem 2048 sudo chmod 600 /etc/mysql/server-key.pem sudo openssl req -new -key /etc/mysql/server-key.pem -out /etc/mysql/server-csr.pem -subj /CN=mysql/ sudo openssl x509 -req -in /etc/mysql/server-csr.pem -out /etc/mysql/server-cert.pem -CA /etc/mysql/cacert.pem -CAkey /etc/mysql/ca-key.pem -days 365
Далее, нам необходимо сгенерировать сертификат клиента. Выполните следующие команды, чтобы сгенерировать сертификат клиента и ключ:
sudo openssl genrsa -out /etc/mysql/client-key.pem 2048 sudo chmod 600 /etc/mysql/client-key.pem sudo openssl req -new -key /etc/mysql/client-key.pem -out /etc/mysql/client-csr.pem -subj /CN=mysql/ sudo openssl x509 -req -in /etc/mysql/client-csr.pem -out /etc/mysql/client-cert.pem -CA /etc/mysql/cacert.pem -CAkey /etc/mysql/ca-key.pem -days 365
Если вы хотите иметь бесплатный сертификат SSL, вы можете установить доверенный сертификат SSL по гиду указанному здесь.
Откройте файл конфигурации MySQL с помощью текстового редактора:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
и раскомментируйте следующие строки:
ssl-ca=/etc/mysql/cacert.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pem
Сохраните файл и перезапустите службу MySQL:
sudo systemctl restart mysql
Для того, чтобы убедиться, что SSL включен, войдите на сервер MySQL
mysql -uroot -p
и выполните следующую команду:
mysql> show variables LIKE '%ssl%';
Вывод должен быть похож на следующий:
+---------------+----------------------------+ | Variable_name | Value | +---------------+----------------------------+ | have_openssl | YES | | have_ssl | YES | | ssl_ca | /etc/mysql/cacert.pem | | ssl_capath | | | ssl_cert | /etc/mysql/server-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | /etc/mysql/server-key.pem | +---------------+----------------------------+ 9 rows in set (0.15 sec)
По умолчанию MySQL прослушивает соединения на локальном хосте. Чтобы разрешить удаленные подключения нужно переконфигурировать MySQL на сервере, чтобы слушать на всех интерфейсах, чтобы сделать это, откройте файл конфигурации MySQL:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
и измените
bind-address = 127.0.0.1
на
bind-address = 0.0.0.0
Для того, чтобы изменения вступили в силу, перезапустите сервер MySQL с помощью следующей команды:
sudo systemctl restart mysql
Убедитесь, что ваш сервер MySQL прослушивает все интерфейсы:
sudo netstat -anp | grep 3306
вывод должен быть похож на следующий:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 938/mysqld
Чтобы разрешить клиенту MySQL подключаться к серверу MySQL, необходимо предоставить пользователю доступ в базе данных к базе данных на удаленном сервере.
Например, если вы хотите предоставить доступ к пользователю dbuser
к базе данных database_name
и включить SSL, подключитесь к MySQL оболочке как root и выполните следующую команду:
GRANT ALL ON database_name.* TO dbuser@192.168.1.10 IDENTIFIED BY 'dbuserpassword' REQUIRE SSL;
где 192.168.1.10
ваш IP — адрес машины MySQL клиента.
Далее, вам нужно настроить клиент MySQL использовать сгенерированный ранее сертификат SSL. Скопируйте следующие файлы с сервера MySQL на клиентскую машину MySQL:
/etc/mysql/cacert.pem /etc/mysql/client-cert.pem /etc/mysql/client-key.pem
откройте конфигурацию клиента MySQL и добавьте следующие строки:
[client] ssl-ca=/etc/mysql/cacert.pem ssl-cert=/etc/mysql/client-cert.pem ssl-key=/etc/mysql/client-key.pem
Теперь вы можете проверить соединение с клиентского компьютера на сервер базы данных MySQL:
mysql -udbuser -pdbuserpassword -h 192.168.1.5
где 192.168.1.5
IP — адрес нахождения сервера базы данных MySQL.
Вот и все. Вы успешно настроили удаленно и защитили соединение для MySQL на вашей Ubuntu 16,04 VPS. Дополнительные сведения о защищенных соединений MySQL, пожалуйста, обратитесь к официальной документации MySQL (https://dev.mysql.com/doc/refman/5.7/en/secure-connections.html).
Сстранно, при попвтке поджключения вывалимвается ошибка «SSL Connection required, but not provided by server.»