MySQL
Настройка подключения SSL
Поиск…
Настройка для систем на базе Debian
(Предполагается, что MySQL установлен и используется sudo
.)
Создание ключей CA и SSL
Убедитесь, что установлены OpenSSL и библиотеки:
apt-get -y install openssl
apt-get -y install libssl-dev
Затем введите и введите каталог для файлов SSL:
mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts
Чтобы сгенерировать ключи, создайте центр сертификации (CA) для подписания ключей (самозаверяющих):
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
Значения, введенные в каждое приглашение, не будут влиять на конфигурацию. Затем создайте ключ для сервера и подпишите с помощью CA:
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
Затем создайте ключ для клиента:
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
Добавление ключей в MySQL
Откройте файл конфигурации MySQL . Например:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
В разделе [mysqld]
добавьте следующие параметры:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem
Перезапустите MySQL. Например:
service mysql restart
Тестирование SSL-соединения
Подключитесь таким же образом, передав дополнительные опции ssl-ca
, ssl-cert
и ssl-key
, используя сгенерированный ключ клиента. Например, если предположить, что cd /home/ubuntu/mysqlcerts
:
mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h 127.0.0.1 -u superman -p
После входа в систему убедитесь, что соединение действительно безопасно:
[email protected] [None]> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /home/ubuntu/mysqlcerts/ca.pem |
| ssl_capath | |
| ssl_cert | /home/ubuntu/mysqlcerts/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /home/ubuntu/mysqlcerts/server-key.pem |
+---------------+-----------------------------------------+
Вы также можете проверить:
[email protected] [None]> STATUS;
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
Применение SSL
Это через GRANT
, используя REQUIRE SSL
:
GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;
Теперь superman
должен подключиться через SSL.
Если вы не хотите управлять клиентскими ключами, используйте ключ клиента раньше и автоматически используйте это для всех клиентов. Откройте файл конфигурации MySQL , например:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
В разделе [client]
добавьте следующие параметры:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem
Теперь superman
нужно только ввести следующее для входа через SSL:
mysql -h 127.0.0.1 -u superman -p
Подключение из другой программы, например, в Python, обычно требует дополнительного параметра для функции соединения. Пример Python:
import MySQLdb
ssl = {'cert': '/home/ubuntu/mysqlcerts/client-cert.pem', 'key': '/home/ubuntu/mysqlcerts/client-key.pem'}
conn = MySQLdb.connect(host='127.0.0.1', user='superman', passwd='imsoawesome', ssl=ssl)
Ссылки и дальнейшее чтение:
- https://www.percona.com/blog/2013/06/22/setting-up-mysql-ssl-and-secure-connections/
- https://lowendbox.com/blog/getting-started-with-mysql-over-ssl/
- http://xmodulo.com/enable-ssl-mysql-server-client.html
- https://ubuntuforums.org/showthread.php?t=1121458
Настройка для CentOS7 / RHEL7
В этом примере предполагается два сервера:
- dbserver (где живет наша база данных)
- appclient (где живут наши приложения)
FWIW, оба сервера - это принудительное выполнение SELinux.
Сначала войдите в dbserver
Создайте временный каталог для создания сертификатов.
mkdir /root/certs/mysql/ && cd /root/certs/mysql/
Создание сертификатов сервера
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
Переместить сертификаты сервера в / etc / pki / tls / certs / mysql /
Путь к каталогу предполагает CentOS или RHEL (при необходимости настраивается для других дистрибутивов):
mkdir /etc/pki/tls/certs/mysql/
Обязательно установите разрешения для папки и файлов. mysql требует полного владения и доступа.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Теперь настройте MySQL / MariaDB
# vi /etc/my.cnf
# i
[mysqld]
bind-address=*
ssl-ca=/etc/pki/tls/certs/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/server-cert.pem
ssl-key=/etc/pki/tls/certs/server-key.pem
# :wq
затем
systemctl restart mariadb
Не забудьте открыть брандмауэр, чтобы разрешать подключения с помощью appclient (используя IP 1.2.3.4)
firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
# I force everything to the drop zone. Season the above command to taste.
Теперь перезапустите firewalld
service firewalld restart
Затем войдите в сервер mysql dbserver:
mysql -uroot -p
Выполните следующие действия, чтобы создать пользователя для клиента. обратите внимание на REQUIRE SSL в заявлении GRANT.
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
Вы должны по-прежнему находиться в / root / certs / mysql с первого шага. Если нет, cd вернется к нему для одной из приведенных ниже команд.
Создание клиентских сертификатов
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
Примечание . Я использовал одно и то же общее имя для сертификатов сервера и клиента. YMMV.
Убедитесь, что вы все еще / root / certs / mysql / для этой следующей команды
Объединение сертификата сервера и клиента CA в один файл:
cat server-cert.pem client-cert.pem > ca.pem
Убедитесь, что вы видите два сертификата:
cat ca.pem
КОНЕЦ СЕВЕРНОЙ РАБОТЫ СЕЙЧАС.
Откройте другой терминал и
ssh appclient
Как и прежде, создайте постоянный дом для клиентских сертификатов
mkdir /etc/pki/tls/certs/mysql/
Теперь поместите клиентские сертификаты (созданные на dbserver) на appclient. Вы можете либо скопировать их, либо просто скопировать и вставить файлы по одному.
scp dbserver
# copy files from dbserver to appclient
# exit scp
Опять же, обязательно установите разрешения для папки и файлов. mysql требует полного владения и доступа.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
У вас должно быть три файла, каждый из которых принадлежит пользователю mysql:
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
Теперь отредактируйте конфигурацию MariaDB / MySQL appclient в разделе [client]
.
vi /etc/my.cnf
# i
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
# :wq
Перезапустить службу mariadb для приложения appclient:
systemctl restart mariadb
все еще на клиенте здесь
Это должно возвратиться: ssl TRUE
mysql --ssl --help
Теперь войдите в экземпляр mysql appclient
mysql -uroot -p
Должно видеть ДА для обеих переменных ниже
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
Первоначально я видел
have_openssl NO
Быстрый просмотр mariadb.log показал:
Ошибка SSL: невозможно получить сертификат из '/etc/pki/tls/certs/mysql/client-cert.pem'
Проблема заключалась в том, что root-client-cert.pem и содержащая папка принадлежали root. Решение заключалось в том, чтобы установить принадлежность / etc / pki / tls / certs / mysql / к mysql.
chown -R mysql:mysql /etc/pki/tls/certs/mysql
Перезапустите mariadb, если необходимо, с шага, следующего выше
ТЕПЕРЬ МЫ ГОТОВЫ ИСПЫТАТЬ БЕЗОПАСНОЕ СОЕДИНЕНИЕ
Мы все еще здесь.
Попытайтесь подключиться к экземпляру mysql dbserver, используя созданную выше учетную запись.
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
С небольшой удачей вы должны войти в систему без ошибок.
Чтобы подтвердить, что вы подключены с поддержкой SSL, введите следующую команду из приглашения MariaDB / MySQL:
\s
Это обратная косая черта, ака статус
Это покажет статус вашего соединения, которое должно выглядеть примерно так:
Connection id: 4
Current database:
Current user: iamsecure@appclient
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.X.X-MariaDB MariaDB Server
Protocol version: 10
Connection: dbserver via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 42 min 13 sec
Если вы получили разрешение на отклонения ошибок при попытке подключения, проверьте приведенный выше оператор GRANT, чтобы убедиться, что нет никаких бродячих символов или «отметок».
Если у вас есть ошибки SSL, вернитесь к этому руководству, чтобы убедиться, что шаги упорядочены.
Это работало на RHEL7 и, вероятно, будет работать и на CentOS7. Не удается подтвердить, будут ли эти точные шаги работать в другом месте.
Надеюсь, это спасет кого-то еще немного времени и обострения.