Поиск…


Настройка для систем на базе 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)

Ссылки и дальнейшее чтение:

Настройка для CentOS7 / RHEL7

В этом примере предполагается два сервера:

  1. dbserver (где живет наша база данных)
  2. 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. Не удается подтвердить, будут ли эти точные шаги работать в другом месте.

Надеюсь, это спасет кого-то еще немного времени и обострения.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow