Как включить SSL и удаленные подключения для MySQL в CentOS 7
На этой странице
- Шаг 1. Установите MySQL
- Шаг 2. Настройка корневого пароля MySQL
- Шаг 3. Создание новых файлов самозаверяющих сертификатов
- Шаг 4. Включите SSL для MySQL
- Шаг 5. Включите удаленные подключения
- Шаг 6. Тестирование
- Справочник
MySQL — это система реляционных баз данных с открытым исходным кодом, которая работает во многих операционных системах, включая Windows, Linux, MacOS и FreeBSD. Вероятно, это самая популярная СУБД с открытым исходным кодом и центральный компонент стеков LAMP и LEMP. Существует множество приложений, зависящих от MySQL, таких как Wordpress, Joomla, TYPO3, phpBB и многие другие.
В этом руководстве я пошагово покажу вам, как безопасно настроить MySQL для удаленных подключений. Когда вам нужно получить удаленный доступ к MySQL, необходимо либо использовать VPN, поскольку MySQL не шифрует передаваемые данные, либо вы можете настроить MySQL для использования SSL, как я покажу вам в этом руководстве. В этой конфигурации только пользователям с правильными файлами сертификатов SSL разрешено подключаться к серверу MySQL, а трафик шифруется. Мы установим последнюю версию MySQL, а затем настроим SSL для удаленного подключения. В качестве базовой системы я буду использовать сервер CentOS 7.
Что мы будем делать:
- Установите MySQL.
- Настройте корневой пароль MySQL.
- Создайте новые файлы самозаверяющих сертификатов SSL.
- Включите SSL для MySQL.
- Включить удаленное подключение.
- Тестирование.
Предпосылка
- Сервер CentOS 7
- Привилегии root
Шаг 1 — Установите MySQL
В этом руководстве мы будем использовать MySQL 5.7, последнюю версию на данный момент. Он установлен из репозитория MySQL, поэтому сначала нам нужно добавить в систему новый репозиторий CentOS.
Добавьте новый репозиторий для MySQL с помощью команды yum ниже.
yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
Вам будет предложено установить новый пакет, введите y и нажмите Enter для подтверждения.
Теперь вы можете установить последнюю версию MySQL 5.7 на сервер следующим образом:
yum -y install mysql-community-server
После завершения установки запустите службу MySQL и включите ее автоматический запуск во время загрузки с помощью команды systemctl.
systemctl start mysqld
systemctl enable mysqld
Убедитесь, что MySQL работает, проверив порт, используемый MySQL (3306). Проверьте это с помощью команды netstat ниже.
netstat -plntu
MySQL был установлен на CentOS 7 из репозитория MySQL.
Шаг 2. Настройте корневой пароль MySQL.
По умолчанию MySQL 5.7 генерирует для вас пароль root по умолчанию при первом запуске службы. Пароль хранится в файле журнала MySQL /var/log/mysqld.log.
Чтобы увидеть корневой пароль MySQL по умолчанию, вы можете использовать команду grep ниже.
grep 'temporary' /var/log/mysqld.log
Вы увидите результат, аналогичный приведенному ниже. Мой пароль по умолчанию — wxtX8Te&Uh1K.
A temporary password is generated for : wxtX8Te&Uh1K
Подключитесь к оболочке MySQL с паролем по умолчанию и замените пароль своим собственным паролем.
mysql -u root -p
TYPE IN DEFAULT PASSWORD
Теперь замените пароль по умолчанию своим собственным паролем. В этом руководстве я буду использовать [email в качестве нового корневого пароля MySQL. Запустите запросы MySQL ниже.
ALTER USER 'root'@'localhost' IDENTIFIED BY '';
flush privileges;
exit;
Теперь вы можете снова подключиться с новым паролем [email .
mysql -u root -p
TYPE NEW PASSWORD ''
Шаг 3. Создайте новые файлы самозаверяющих сертификатов
По умолчанию MySQL 5.7 имеет собственные файлы сертификатов SSL в каталоге /var/lib/mysql. Но в этом уроке я покажу вам, как создавать собственные файлы сертификатов SSL с помощью OpenSSL, а затем настраивать их с помощью MySQL.
На этом шаге мы создадим новые файлы самозаверяющих сертификатов. Нам нужны 3 сертификата, сертификат CA, сертификат и ключ сервера, сертификат и ключ клиента. Мы создадим их с помощью OpenSSL.
Создайте новый каталог для файлов сертификатов SSL /etc/certs/ и перейдите в этот каталог.
mkdir -p /etc/certs
cd /etc/certs
Создайте новый файл сертификата ЦС ca.pem.
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Далее нам нужно создать сертификаты на стороне сервера. Создайте новые файлы сертификата сервера server-cert.pem и server-key.pem. Создайте новые файлы сертификатов, удалите парольную фразу и подпишите их с помощью сертификата ЦС.
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Теперь сгенерируйте файлы сертификатов для клиента. Сервер MySQL будет принимать удаленное подключение только от клиента, у которого есть эти файлы сертификатов. Создайте новые файлы сертификатов клиентов, удалите парольную фразу и подпишите их с помощью сертификата ЦС.
openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Примечание:
Информация о сертификате ЦС должна отличаться от информации о клиенте и сервере.
Все сертификаты, необходимые для этой установки, сгенерированы. Теперь мы можем проверить файлы сертификатов с помощью приведенной ниже команды.
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
Убедитесь, что нет ошибки, результаты, как показано ниже.
Все файлы сертификатов проверены. Измените владельца каталога certs на пользователя mysql и измените права доступа ко всем ключевым файлам.
chown -R mysql:mysql /etc/certs/
chmod 600 client-key.pem server-key.pem ca-key.pem
Шаг 4. Включите SSL для MySQL.
На этом шаге мы включим SSL для MySQL. Прежде чем мы начнем настраивать и включать SSL в MySQL, нам нужно сделать резервную копию файлов сертификатов по умолчанию в новый каталог резервных копий.
Создайте новый каталог резервных копий mysql-certs для всех сертификатов.
mkdir -p ~/mysql-certs/
Перейдите в каталог /var/lib/mysql и переместите все сертификаты по умолчанию в резервный каталог.
cd /var/lib/mysql/
mv ca.pem ca-key.pem ~/mysql-certs/
mv server-key.pem server-cert.pem ~/mysql-certs/
mv client-key.pem client-cert.pem ~/mysql-certs/
mv private_key.pem public_key.pem ~/mysql-certs/
Теперь перезапустите службу MySQL.
systemctl restart mysqld
Затем проверьте SSL из оболочки MySQL. Войдите в mysql с новым паролем:
mysql -u root -p
TYPE NEW PASSWORD ''
Запустите приведенный ниже запрос, чтобы мы могли увидеть статус SSL для MySQL.
SHOW GLOBAL VARIABLES LIKE '%ssl%';
STATUS;
Вы увидите, что состояние SSL ОТКЛЮЧЕНО, и пользователь root был подключен без SSL.
Далее мы включим SSL-соединение для MySQL. Мы должны отредактировать файл конфигурации MySQL my.cnf с помощью vim.
vim /etc/my.cnf
В разделе [mysqld] вставьте приведенную ниже конфигурацию.
# Type your own certificates directory
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/server-cert.pem
ssl-key=/etc/certs/server-key.pem
Сохраните файл и выйдите из vim, чтобы перезапустить службу MySQL.
systemctl restart mysqld
Теперь снова войдите в MySQL и проверьте SSL.
mysql -u root -p
TYPE NEW PASSWORD ''
Запустите запрос ниже, чтобы убедиться, что значение раздела SSL равно YES.
SHOW VARIABLES LIKE '%ssl%';
STATUS;
Вы увидите, что SSL для MySQL включен, но пользователь root все еще не подключен с использованием соединения SSL.
Чтобы заставить все локальные пользовательские соединения использовать SSL, снова отредактируйте файл конфигурации mysql my.cnf.
vim /etc/my.cnf
Вставьте конфигурацию ниже в конец строки.
[client]
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/client-cert.pem
ssl-key=/etc/certs/client-key.pem
Сохраните и выйдите, затем перезапустите MySQL.
systemctl restart mysqld
Снова подключитесь к MySQL и проверьте подключение и включенный SSL.
mysql -u root -p
TYPE NEW PASSWORD ''
SHOW VARIABLES LIKE '%ssl%';
STATUS;
SSL включен, и локальное соединение также использует SSL.
Шаг 5. Включите удаленные подключения
В приведенных выше шагах мы уже включили SSL для сервера MySQL, и локальные соединения вынуждены использовать SSL. На этом шаге мы включим удаленные подключения для MySQL, но мы разрешаем только клиентам, имеющим файлы сертификатов, подписанные нашим ЦС, подключаться к серверу MySQL.
Отредактируйте файл конфигурации MySQL с помощью vim.
vim /etc/my.cnf
Вставьте эту конфигурацию ниже в конец раздела [mysqld].
bind-address = *
require_secure_transport = ON
Сохраните файл и выйдите из редактора, перезапустив MySQL.
systemctl restart mysqld
Затем создайте нового пользователя для удаленного подключения. Я создам нового пользователя с именем hakase с паролем [email и предоставлю все привилегии пользователю hakase. Пользователь hakase сможет подключиться только с ключом сертификата.
mysql -u root -p
TYPE NEW PASSWORD '' REQUIRE X509;
flush privileges;
Создан новый пользователь для удаленного подключения.
Примечание:
Вы можете увидеть 1 предупреждение в результате запроса mysql. Это просто предупреждение об использовании запроса ALTER USER вместо GRANT, потому что запрос GRANT будет объявлен устаревшим в следующем выпуске.
Шаг 6 — Тестирование
В последнем разделе этого руководства мы проверим, может ли новый пользователь с именем hakase удаленно подключаться к серверу MySQL с помощью файлов сертификатов. Необходимо загрузить три сертификата для клиента.
- Сертификат CA — ca.pem
- Клиентский сертификат — client-cert.pem
- Ключ клиента – client-key.pem
Я вошел в другую систему Linux и установил там пакеты mysql-client. Затем я загрузил все файлы сертификатов клиентов с помощью SCP. Теперь я подключусь к серверу MySQL с файлами сертификатов.
mysql -h 10.0.15.11 -u hakase \
--ssl-ca=ca.pem \
--ssl-cert=client-cert.pem \
--ssl-key=client-key.pem -p
10.0.15.11=IP-адрес сервера MySQL.
Вы можете увидеть статус соединения с этим запросом ниже.
STATUS;
Пользователь hakase с IP-адресом 10.0.15.10 Подключен к серверу MySQL с IP-адресом 10.0.15.11, соединение осуществляется по протоколу TCP/IP на порту 3306 и с использованием SSL.
Когда вы попытаетесь подключиться без файлов сертификатов, вы увидите ошибку, как показано ниже.
Далее я проведу тестирование с графическим интерфейсом MySQLWorkbench с моего хоста.
Ниже моя конфигурация - Параметр настройки.
Конфигурация SSL - Настройка SSL.
А ниже результаты соединения с файлами SSL Client Certificate.
Новый пользователь успешно удаленно подключился к серверу базы данных MySQL с помощью SSL-соединения. Когда пользователь пытается подключиться без файлов сертификата, результат будет отклонен. Установка и настройка MySQL с SSL-соединением успешно завершена.
Ссылка
- http://mysqlresources.com/grant-connection-restrictions-types