- How to настроки репликации в mysql с использованием шифрования ssl на debian lenny
- Mysql :: mysql 5.7 reference manual :: 6.3.3.2 creating ssl certificates and keys using openssl
- Включение ssl соединений на сервере mysql
- Генерация ssl/tls сертификатов и ключей
- Настраиваем мастер-сервер
- Настройка удаленного доступа с обязательным ssl
- Передача клиентских сертификатов на клиентский компьютер
- Подготовительные работы — делаем ключи
- Предпосылки
- Проверьте текущий статус ssl/tls
- Создание файла конфигурации клиента mysql
How to настроки репликации в mysql с использованием шифрования ssl на debian lenny
Это руководство описывает, как настроить репликацию базы данных в MySQL с использованием SSL соединение для шифрования.
MySQL репликация синхронизирует базу данных, что позволяет иметь точную копию БД на другом сервере. Все обновления БД на главном сервере автоматически реплицируются на другой сервер, что позволяет защитить базу от аппаратных сбоев. В этой статье будет показано, как реализовать репликации БД exampledb с сервера server1.example.com(ip адресом 192.168.0.100) на сервер server2.example.com(ip адресом 192.168.0.101) с использованием SSL соединения
Оба сервера работают на Debian Lenny но конфигурация может применяться практически на всех дистрибутивах без изменений. БД exampledb с таблицами и данными уже существующих только на главном. Все команды выполняются с привилегиями пользователя root.
Если на обоих серверах не установлен сервер MySQL то приступим к инсталляции, выполнив на главном и на вторичном сервере команду:
aptitude install mysql-server mysql-client
Вам будет предложено ввести пароль root для MySQL, как на главном так и на вторичном сервере.
Теперь проверим поддержку соединения по протоколу SSL с MySQL. Давайте войдем в MySQL и введем команду в командной строке MySQL:
mysql -u root -p
mysql> show variables like '%ssl%';
--------------- ----------
| Variable_name | Value |
--------------- ----------
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
--------------- ----------
7 rows in set (0.00 sec)
mysql>quit;
Если вывод выглядит следующим образом то это означает что MySQL был скомпилирован с поддежкой SSL, но у нас как видно из таблици have_openssl DISABLED и have_ssl DISABLED не активен.
Что бы включить поддержку SSL нужно отредактировать файл my.cnf который расположен в /etc/mysql/
vi /etc/mysql/my.cnf
Найдите строки * Security Features и добавьте строку ssl
[...]
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
ssl
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
[...]
Перезапустим MySQL:
/etc/init.d/mysql restart
и проверим активена ли поддержка ssl
mysql -u root -p
show variables like '%ssl%';
mysql> show variables like '%ssl%';
--------------- -------
| Variable_name | Value |
--------------- -------
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
--------------- -------
7 rows in set (0.00 sec)
mysql>quit;
Вывод показывает что ssl включен.
Далее настроить MySQL для прослушивался на всех интерфейсах, закоментировав строчку bind-address = 127.0.0.1 в /etc/mysql/my.cnf:
server1:
vi /etc/mysql/my.cnf
[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1
[...]
рестар MySQL:
/etc/init.d/mysql restart
Теперь посмотрим что висит у нас на портах:
netstat -tap | grep mysql
server1:~# netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 3771/mysqld
server1:~#
Видимо что MySQL транслируется на всех интерфейсах.
Теперь нам необходимо создать CA, серверов и клиентских сертификатов, для SSL соединений. Я создаю их обычно в каталоге /etc/mysql/newcerts
Создадим каталог newcerts:
mkdir /etc/mysql/newcerts && cd /etc/mysql/newcerts
Убедимся что OpenSSL унас установлен:
aptitude install openssl
Создаем CA сертификат:
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
Далее создаем сертификат для сервера…:
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
и для клиента:
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
Вывод должен выглядеть следующим образом:
ls -l
server1:/etc/mysql/newcerts# ls -l
total 32
-rw-r--r-- 1 root root 1346 2021-08-18 20:13 ca-cert.pem
-rw-r--r-- 1 root root 1675 2021-08-18 20:13 ca-key.pem
-rw-r--r-- 1 root root 1099 2021-08-18 20:14 client-cert.pem
-rw-r--r-- 1 root root 1675 2021-08-18 20:14 client-key.pem
-rw-r--r-- 1 root root 956 2021-08-18 20:14 client-req.pem
-rw-r--r-- 1 root root 1099 2021-08-18 20:14 server-cert.pem
-rw-r--r-- 1 root root 1679 2021-08-18 20:14 server-key.pem
-rw-r--r-- 1 root root 956 2021-08-18 20:14 server-req.pem
server1:/etc/mysql/newcerts#
Теперь мы должны передать сертификаты ca-cert.pem, client-cert.pem и client-key.pem на второй сервер. Создадим директорию на втором сервере:
server2:
mkdir /etc/mysql/newcerts
Вернемся на server1 и передадим сертификаты следующим образом:
server1:
scp /etc/mysql/newcerts/ca-cert.pem root@192.168.0.101:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-cert.pem root@192.168.0.101:/etc/mysql/newcerts
scp /etc/mysql/newcerts/client-key.pem root@192.168.0.101:/etc/mysql/newcerts
Далее откроем на server1 /etc/mysql/my.cnf и внесем изменения в область * Security Features раскоментировав строки ssl-ca, ssl-cert и ssl-key:
vi /etc/mysql/my.cnf
[...]
# * Security Features
#
# Read the manual, too, if you want chroot!
# chroot = /var/lib/mysql/
#
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
ssl
ssl-ca=/etc/mysql/newcerts/ca-cert.pem
ssl-cert=/etc/mysql/newcerts/server-cert.pem
ssl-key=/etc/mysql/newcerts/server-key.pem
[...]
Перезапустим MySQL:
/etc/init.d/mysql restart
Теперь мы создадим slave_user пользователя репликации, который будет использоваться на server2, для доступа к базе данных на server1
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'slave_password' REQUIRE SSL;
Сторока REQUIRE SSL не является обязательной, если Вы оставите ее, slave_user будет разрешено подключатся через зашифрованное и не зашифрованное соединение. При использовании SSL разрешено будет только зашифрованное соединение.
(Если пользователь репликации уже создан и нужно указать только SSL соединение то нужно изменить пользователя следующим образом:
GRANT USAGE ON *.* TO 'slave_user'@'%' REQUIRE SSL;
)
FLUSH PRIVILEGES;
quit;
Кроме того, мы должны MySQL указать где хранить наши логи для репликации, а также указать какой сервер является главным, а какой репликационным:
vi /etc/mysql/my.cnf
[...]
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = exampledb
[...]
Рестарт MySQL
/etc/init.d/mysql restart
Далее нам нужно провести несколько операций:
1. Заблокировать базу exampledb на server1
2. Узнать master status server1
3. Создать дамп SQL exampledb (для импорта на server2)
4. Разблокировать нашу базу
mysql -u root -p
USE exampledb;
FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
------------------ ---------- -------------- ------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
------------------ ---------- -------------- ------------------
| mysql-bin.000001 | 98 | exampledb | |
------------------ ---------- -------------- ------------------
1 row in set (0.00 sec)
mysql>
Теперь не выходя из консоли mysql(т.к. блокировка бд будет удалена) мы сделаем бекап и перенесем его на server2
server1:
cd /tmp
mysqldump -u root -pyourrootsqlpassword --opt exampledb > snapshot.sql
scp snapshot.sql root@192.168.0.101:/tmp
После проделаной операции можно смело разблокировать нашу БД
server1:
UNLOCK TABLES;
quit;
На этом настройка server1 завершена. Приступим к настройке server2 открыв конфиг мускуля:
server2:
vi /etc/mysql/my.cnf
убедимся что у нас есть следующие настройки строки(если их нет то добавим):
[...]
server-id=2
master-connect-retry=60
replicate-do-db=exampledb
[...]
Значение server-id=2 уникальное и оно должно отличатся от значения которое на server1
Перезапустим MySQL:
/etc/init.d/mysql restart
Прежде чем начать настройку репликации создадим пустую БД:
mysql -u root -p
CREATE DATABASE exampledb;
quit;
Теперь можно импортировать на server2 дамп базы snapshot.sql
/usr/bin/mysqladmin --user=root --password=yourrootsqlpassword stop-slave
cd /tmp
mysql -u root -pyourrootsqlpassword exampledb < snapshot.sql
Заходим в MySQL и выполним команду, что бы server2 был вторичным сервером, а server1 определялся как первычный сервер:
mysql -u root -p
CHANGE MASTER TO MASTER_HOST='192.168.0.100', MASTER_USER='slave_user', MASTER_PASSWORD='slave_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98, MASTER_SSL=1, MASTER_SSL_CA = '/etc/mysql/newcerts/ca-cert.pem', MASTER_SSL_CERT = '/etc/mysql/newcerts/client-cert.pem', MASTER_SSL_KEY = '/etc/mysql/newcerts/client-key.pem';
* MASTER_HOST — ip адрес или имя хоста в нашем случае это ip
* MASTER_USER — пользователь репликации для первичного сервера
* MASTER_PASSWORD — Пароль пользователя
* MASTER_LOG_FILE — Значение Лог файла на server1 которое мы узнали выполним команду SHOW MASTER STATUS;
* MASTER_LOG_POS — Значение полученное при выполнении команды SHOW MASTER STATUS;
* MASTER_SSL — Создает соединение главного и вторичного сервера с использованием SSL
* MASTER_SSL_CA — Путь к сертификату CA (server2)
* MASTER_SSL_CERT — Путь к сертификату client-cert.pem (server2)
* MASTER_SSL_KEY — Путь к сертификату client-key.pem (server2)
И наконец
START SLAVE;
Теперь проверим статус server2
SHOW SLAVE STATUS G
mysql> SHOW SLAVE STATUS G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.100
Master_User: slave_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 98
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: exampledb
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File: /etc/mysql/newcerts/ca-cert.pem
Master_SSL_CA_Path:
Master_SSL_Cert: /etc/mysql/newcerts/client-cert.pem
Master_SSL_Cipher:
Master_SSL_Key: /etc/mysql/newcerts/client-key.pem
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
mysql>
После этого можно выйти с MySQL:
quit;
Вот и все, настройка серверов закончена. Если Вы сделали все верно то репликация настроена правильно и работоспособна.
Большое спасибо за внимание!
P.S. Если вы нашли очепятку или не правильно сформулированное предложение сообщите пожалуйста в ЛС.
Mysql :: mysql 5.7 reference manual :: 6.3.3.2 creating ssl certificates and keys using openssl
This section describes how to use the openssl
command to set up SSL certificate and key files for use by MySQL
servers and clients. The first example shows a simplified
procedure such as you might use from the command line. The
second shows a script that contains more detail. The first two
examples are intended for use on Unix and both use the
openssl command that is part of OpenSSL. The
third example describes how to set up SSL files on Windows.
The following example shows a set of commands to create MySQL
server and client certificate and key files. You must respond
to several prompts by the openssl commands.
To generate test files, you can press Enter to all prompts. To
generate files for production use, you should provide nonempty
responses.
# Create clean environment
rm -rf newcerts
mkdir newcerts && cd newcerts
# Create CA certificate
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600
-key ca-key.pem -out ca.pem
# Create server certificate, remove passphrase, and sign it
# server-cert.pem = public key, server-key.pem = private key
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
# Create client certificate, remove passphrase, and sign it
# client-cert.pem = public key, client-key.pem = private key
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
After generating the certificates, verify them:
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
You should see a response like this:
server-cert.pem: OK
client-cert.pem: OK
To see the contents of a certificate (for example, to check
the range of dates over which a certificate is valid), invoke
openssl like this:
openssl x509 -text -in ca.pem
openssl x509 -text -in server-cert.pem
openssl x509 -text -in client-cert.pem
Now you have a set of files that can be used as follows:
For additional usage instructions, see
Section 6.3.1, “Configuring MySQL to Use Encrypted Connections”.
Here is an example script that shows how to set up SSL
certificate and key files for MySQL. After executing the
script, use the files for SSL connections as described in
Section 6.3.1, “Configuring MySQL to Use Encrypted Connections”.
DIR=`pwd`/openssl
PRIV=$DIR/private
mkdir $DIR $PRIV $DIR/newcerts
cp /usr/share/ssl/openssl.cnf $DIR
replace ./demoCA $DIR -- $DIR/openssl.cnf
# Create necessary files: $database, $serial and $new_certs_dir
# directory (optional)
touch $DIR/index.txt
echo "01" > $DIR/serial
#
# Generation of Certificate Authority(CA)
#
openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/ca.pem
-days 3600 -config $DIR/openssl.cnf
# Sample output:
# Using configuration from /home/finley/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ................
# .........
# writing new private key to '/home/finley/openssl/private/cakey.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL admin
# Email Address []:
#
# Create server request and key
#
openssl req -new -keyout $DIR/server-key.pem -out
$DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf
# Sample output:
# Using configuration from /home/finley/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ..
# ..........
# writing new private key to '/home/finley/openssl/server-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL server
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:
#
# Remove the passphrase from the key
#
openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem
#
# Sign server cert
#
openssl ca -cert $DIR/ca.pem -policy policy_anything
-out $DIR/server-cert.pem -config $DIR/openssl.cnf
-infiles $DIR/server-req.pem
# Sample output:
# Using configuration from /home/finley/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName :PRINTABLE:'FI'
# organizationName :PRINTABLE:'MySQL AB'
# commonName :PRINTABLE:'MySQL admin'
# Certificate is to be certified until Sep 13 14:22:46 2003 GMT
# (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated
#
# Create client request and key
#
openssl req -new -keyout $DIR/client-key.pem -out
$DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf
# Sample output:
# Using configuration from /home/finley/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# .....................................
# .............................................
# writing new private key to '/home/finley/openssl/client-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL user
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:
#
# Remove the passphrase from the key
#
openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem
#
# Sign client cert
#
openssl ca -cert $DIR/ca.pem -policy policy_anything
-out $DIR/client-cert.pem -config $DIR/openssl.cnf
-infiles $DIR/client-req.pem
# Sample output:
# Using configuration from /home/finley/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName :PRINTABLE:'FI'
# organizationName :PRINTABLE:'MySQL AB'
# commonName :PRINTABLE:'MySQL user'
# Certificate is to be certified until Sep 13 16:45:17 2003 GMT
# (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated
#
# Create a my.cnf file that you can use to test the certificates
#
cat <<EOF > $DIR/my.cnf
[client]
ssl-ca=$DIR/ca.pem
ssl-cert=$DIR/client-cert.pem
ssl-key=$DIR/client-key.pem
[mysqld]
ssl_ca=$DIR/ca.pem
ssl_cert=$DIR/server-cert.pem
ssl_key=$DIR/server-key.pem
EOF
Download OpenSSL for Windows if it is not installed on your
system. An overview of available packages can be seen here:
http://www.slproweb.com/products/Win32OpenSSL.html
Choose the Win32 OpenSSL Light or Win64 OpenSSL Light package,
depending on your architecture (32-bit or 64-bit). The default
installation location is C:OpenSSL-Win32
or C:OpenSSL-Win64
, depending on which
package you downloaded. The following instructions assume a
default location of C:OpenSSL-Win32
.
Modify this as necessary if you are using the 64-bit package.
If a message occurs during setup indicating
'...critical component is missing: Microsoft Visual
, cancel the setup and
C 2008 Redistributables'
download one of the following packages as well, again
depending on your architecture (32-bit or 64-bit):
After installing the additional package, restart the OpenSSL
setup procedure.
During installation, leave the default
C:OpenSSL-Win32
as the install path, and
also leave the default option 'Copy OpenSSL DLL files
selected.
to the Windows system directory'
When the installation has finished, add
C:OpenSSL-Win32bin
to the Windows
System Path variable of your server (depending on your version
of Windows, the following path-setting instructions might
differ slightly):
After OpenSSL has been installed, use instructions similar to
those from Example 1 (shown earlier in this section), with the
following changes:
After generating the certificate and key files, to use them
for SSL connections, see
Section 6.3.1, “Configuring MySQL to Use Encrypted Connections”.
Включение ssl соединений на сервере mysql
Современные версии MySQL будут искать соответствующие файлы сертификатов в пределах каталога данных MySQL при запуске сервера. Из-за этого нам на самом деле не нужно изменить конфигурацию MySQL, чтобы включить SSL.
Мы можем просто перезапустить службу MySQL вместо этого:
sudo systemctl restart mysql
После перезагрузки, откройте новый сеанс MySQL, используя ту же команду, как и раньше. Клиент MySQL автоматически попытается подключиться с помощью SSL, если она поддерживается сервером:
mysql -u root -p -h 127.0.0.1
Давайте посмотрим на ту же информацию, которую мы запрашивали в прошлый раз. Проверьте значения переменных, связанных с SSL:
mysql> SHOW VARIABLES LIKE '%ssl%';
Вывод
--------------- ----------------- | Variable_name | Value | --------------- ----------------- | have_openssl | YES | | have_ssl | YES | | ssl_ca | ca.pem | | ssl_capath | | | ssl_cert | server-cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | server-key.pem | --------------- ----------------- 9 rows in set (0.00 sec)
Переменные have_openssl и have_ssl чтения “YES” вместо “ОТКЛ” на этот раз. Кроме того, переменные ssl_ca, ssl_cert и ssl_key были указаны с именами соответствующих сертификатов, которые мы получили.
Затем проверьте параметры соединения снова:
mysql> s
Вывод
-------------- . . . SSL: Cipher in use is DHE-RSA-AES256-SHA . . . Connection: 127.0.0.1 via TCP/IP . . . --------------
На этот раз, отображается конкретный SSL, указывая, что SSL используется для того чтобы обеспечить наше соединение.
Выход обратно в оболочку:
mysql> exit
Наш сервер теперь может использовать шифрование, но требуется некоторая дополнительная настройка для обеспечения возможности удаленного доступа и использования безопасного соединения.
Генерация ssl/tls сертификатов и ключей
Чтобы включить SSL соединения с MySQL, нам в первую очередь необходимо сформировать соответствующий сертификат и файлы ключей. Утилита называется mysql_ssl_rsa_setup снабжена MySQL 5.7 и выше, чтобы упростить этот процесс. Ubuntu 16.04 имеет совместимую версию MySQL, поэтому мы можем использовать эту команду, чтобы создать необходимые файлы.
Файлы будут создаваться в директории данных MySQL, расположенных в /var/lib/mysql. Нам нужен процесс MySQL, чтобы иметь возможность читать генерируемые файлы, так что мы будем заходить как mysql в качестве пользователя, который должен владеть сгенерированными файлами:
mysql-server$ sudo mysql_ssl_rsa_setup --uid=mysql
Генерирование будет производить вывод, который выглядит примерно так:
Вывод
Generating a 2048 bit RSA private key ................................... ..... writing new private key to 'ca-key.pem' ----- Generating a 2048 bit RSA private key ...... ................................. writing new private key to 'server-key.pem' ----- Generating a 2048 bit RSA private key ...................................................... ................................................................................. writing new private key to 'client-key.pem' -----
Проверьте созданные файлы, набрав:
mysql-server$ sudo find /var/lib/mysql -name '*.pem' -ls
Вывод
256740 4 -rw-r--r-- 1 mysql mysql 1078 Mar 17 17:24 /var/lib/mysql/server-cert.pem 256735 4 -rw------- 1 mysql mysql 1675 Mar 17 17:24 /var/lib/mysqlsql/ca-key.pem<^> 256739 4 -rw-r--r-- 1 mysql mysql 451 Mar 17 17:24 /var/lib/mysqlsql/public_key.pem<^> 256741 4 -rw------- 1 mysql mysql 1679 Mar 17 17:24 /var/lib/mysqlsql/client-key.pem<^> 256737 4 -rw-r--r-- 1 mysql mysql 1074 Mar 17 17:24 /var/lib/mysqlsql/ca.pem<^> 256743 4 -rw-r--r-- 1 mysql mysql 1078 Mar 17 17:24 /var/lib/mysqlsql/client-cert.pem<^> 256736 4 -rw------- 1 mysql mysql 1675 Mar 17 17:24 /var/lib/mysqlsql/private_key.pem<^> 256738 4 -rw------- 1 mysql mysql 1675 Mar 17 17:24 /var/lib/mysqlsql/server-key.pem<^>
В последнем столбце показаны сгенерированные имена файлов. Центральные столбцы, которые показывают “MySQL” указывают, что генерируемые файлы имеют правильного пользователя и группы владельца.
Эти файлы являются ключевыми и сертификат пары для сертификации (начиная с “ca”), процесс сервера MySQL (начиная с “server”), так и для клиентов MySQL (начиная с “client”). Кроме того, файлы private_key.pem и public_key.pem используются MySQL для безопасной передачи пароля, если не используется SSL.
Настраиваем мастер-сервер
В дебиан-подобных системах (по крайней мере) в файле my.cnf указана команда
!includedir /etc/mysql/conf.d/
которая говорит включить все файлы конфигурации (*.cnf) из указанной директории. Создадим там файл replica.cnf со следующим содержанием:
[mysqld] log-bin = /var/log/mysql/mysql-bin.log slave-compressed = 1 binlog-do-db = mydbserver-id = 1
# ssl paramsssl-ca=/etc/mysql/my-cacert.pem ssl-cert=/etc/mysql/my-server-cert.pem ssl-key=/etc/mysql/my-server-key.pem
Параметры ssl указываются в случае, если есть желание защитить соединение для репликаций. Указываются созданные ранее ключи. Положить их нужно в папку мускула, рядом с my.cnf. Мои попытки положить их в папку /etc/mysql/certs/ приводили к ошибкам типа «Не могу получить сертификат из файла …». Возможно, есть решения и для других папок, но я не стал их искать.
После произведенных телодвижений нужно перегрузить мускул, зайти в него и посмотреть
SHOW VARIABLES LIKE ‘%ssl%’;
В ответе параметр have_ssl и/или have_openssl имеет значение YES в случае суксь, и DISABLED во всех плохих других случаях (отсутствие параметра говорит о том, что ваша сборка мускула не поддерживает ssl). Если йес нас не нашел, идем в логи искать причину: /var/log/mysql.log, /var/log/mysql.err, /var/log/syslog или еще куда, в зависимости от того, куда настроен логировать себя мускул на вашей системе.
Еще нам нужно настроить пользователя отдельного для репликаций. Решается это выполнением запроса
Настройка удаленного доступа с обязательным ssl
В настоящее время сервер MySQL настроен на прием SSL соединения от клиентов. Тем не менее, он все равно будет разрешить нешифрованные соединения, по требованию клиента.
Мы можем исправить это путем включения опции require_secure_transport. Это требует, чтобы все соединения должны быть сделаны либо с помощью SSL или с локального сокета Unix. Так как Unix сокеты доступны только внутри самого сервера, единственный вариант подключения открыт для удаленных пользователей будет с помощью SSL.
Чтобы включить эту настройку, откройте файл /etc/mysql/my.cnf в текстовом редакторе:
sudo nano /etc/mysql/my.cnf
Внутри будет две директивы !includedir, используемые для источника дополнительных конфигурационных файлов. Нам нужно будет поставить нашу собственную конфигурацию под этими линиями так, чтобы они отменяли любые конфликтующие параметры.
Начните с создания раздела [mysqld] целевого процесса сервера MySQL. Под этим заголовком раздела, установите require_secure_transport на ON:
/etc/mysql/my.cnf
. . . !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ [mysqld] # Require clients to connect either using SSL # or through a local socket file require_secure_transport = ON
Эта линия является единственным значением, которое требуется для обеспечения безопасных соединений.
По умолчанию MySQL настроен на прослушивание только для подключений, происходящих на локальном компьютере. Для того, чтобы настроить его для прослушивания удаленных соединений, мы можем установить bind-address с другим интерфейсом.
Чтобы разрешить MySQL принимать соединения на любой из его интерфейсов, мы можем установить bind-address на “0.0.0.0”:
/etc/mysql/my.cnf
. . . !includedir /etc/mysql/conf.d/ !includedir /etc/mysql/mysql.conf.d/ [mysqld] # Require clients to connect either using SSL # or through a local socket file require_secure_transport = ON bind-address = 0.0.0.0
Сохраните и закройте файл, когда вы закончите.
Затем перезапустите MySQL, чтобы применить новые параметры:
sudo systemctl restart mysql
Убедитесь в том, что MySQL прослушивает “0.0.0.0” вместо “127.0.0.1”, набрав:
sudo netstat -plunt
Вывод
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 4330/mysqld tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1874/sshd tcp6 0 0 :::22 :::* LISTEN 1874/sshd
“0.0.0.0” в приведенном выше выводе указывает на то, что MySQL прослушивает подключения на всех доступных интерфейсов.
Далее, нам необходимо разрешить соединения MySQL через наш брандмауэр. Создайте исключение, набрав:
sudo ufw allow mysql
Вывод
Rule added Rule added (v6)
Теперь попытки удаленного подключения должны быть в состоянии достигнуть нашим сервером MySQL.
Передача клиентских сертификатов на клиентский компьютер
Для начала, нам нужно передать в MySQL CA и файлы сертификатов клиента с сервера MySQL и поместить их на машину клиента MySQL.
Начните с создания каталога на клиенте MySQL в домашнем каталоге пользователя, который будет использоваться для подключения. Назовем client-ssl:
mysql-client$ mkdir ~/client-ssl
Так как сертификат ключа чувствителен, мы должны заблокировать доступ к этому каталогу, так что только текущий пользователь может получить доступ к нему:
mysql-client$ chmod 700 ~/client-ssl
Теперь мы можем скопировать информацию о сертификате в новый каталог.
На машине сервере MySQL, отобразим содержимое сертификата CA, набрав:
mysql-client$ sudo cat /var/lib/mysql/ca.pem
Вывод
-----BEGIN CERTIFICATE----- . . . -----END CERTIFICATE-----
Скопируйте весь вывод, в том числе линии BEGIN CERTIFICATE и END CERTIFICATE в буфер обмена.
На клиенте MySQL , создайте файл с таким же именем внутри нового каталога:
mysql-client$ nano ~/client-ssl/ca.pem
Внутри, вставить скопированное содержимое сертификата из буфера обмена. Сохраните и закройте файл, когда вы закончите.
Затем отобразите сертификат клиента на сервере MySQL :
mysql-client$ sudo cat /var/lib/mysql/client-cert.pem
Вывод
-----BEGIN CERTIFICATE----- . . . -----END CERTIFICATE-----
Опять же, скопируйте содержимое в буфер обмена. Не забудьте включить первую и последнюю строку.
Откройте файл с тем же именем на клиенте MySQL в пределах директории client-ssl:
mysql-client$ nano ~/client-ssl/client-cert.pem
Вставить содержимое из буфера обмена. Сохраните и закройте файл.
И, наконец, отобразите содержимое файла ключа клиента на сервере MySQL:
mysql-client$ sudo cat /var/lib/mysql/client-key.pem
Вывод
-----BEGIN RSA PRIVATE KEY----- . . . -----END RSA PRIVATE KEY-----
Скопируйте отображаемые содержимое, в том числе первую и последнюю строку, в буфер обмена.
На клиенте MySQL, откройте файл с тем же именем в каталоге client-ssl:
mysql-client$ nano ~/client-ssl/client-key.pem
Вставьте содержимое из буфера обмена. Сохраните и закройте файл.
Теперь клиент машина должна иметь все учетные данные, необходимые для доступа к серверу MySQL. Далее, мы должны изменить нашего удаленного пользователя.
Подготовительные работы — делаем ключи
Далее будет рассказано о том, как настроить сами репликации. Если безопасность соединения вас не волнует, этот пункт не для вас.
Файл настроек мускула предлагает для создания ключей воспользоваться прогой — тиникой:
# For generating SSL certificates I recommend the OpenSSL GUI “tinyca”.
Я его послушал, хотя истинные линуксоиды обязаны создавать ключи из командной строки. Если вы не тру, то:
sudo apt-get install tinycasudo tinyca2
В проге нужно:
- Создать СА-сертификат (параметр Common Name установим в cacert). Далее, создать сертификат и ключ (создаются в паре) для сервера и клиента (не забыть внести пароль СА-сертификата, который мы придумывали, когда его создавали).
- Экспортировать СА-сертификат и сертификаты сервера и клиента в формат PEM с именами cacert.pem, my-server-cert.pem и my-client-cert.pem соответсвенно.
- Экспортировать ключи сервера и клиента (внимание, опция Without passphrase = Yes, иначе мускуль не сможет расшифровать ваш сертификат, потребует пароль СА-сертификата) в формат PEM с именами my-server-key.pem и my-client-key.pem соответственно.
- Указать всем 5-ти файлам права на чтение владельцу и группе, прав на запись — не давать. Ну и проследить, чтобы мускуль был либо владельцем, либо входил в группу.
Команды для изменения прав и владельцев в порядке упоминания:
chmod 440 *.pemchown root:mysql *.pem
СА-сертификат — это сертификат автора, он служит для связки сертификатов сервера и клиента. На сервере будут нужны сертификат и ключ сервера, на клиенте — сертификат и ключ клиента, и на обоих будет нужен сертификат автора — cacert.
Предпосылки
Для того, чтобы следовать вместе с этим руководством, вам потребуется два сервера Ubuntu 16.04. Мы будем использовать один в качестве сервера MySQL, а другой в качестве клиента. Создайте некорневого пользователя с sudo привилегиями на каждом из этих серверов.
На первой машине, вы должны иметь установленный и настроенный сервер MySQL. Следуйте нашему руководство по установке MySQL на Ubuntu 16.04 для установки и настройки программного обеспечения.
На второй машине установите пакет клиент MySQL. Вы можете обновить индекс пакетов apt и установить необходимое программное обеспечение, набрав:
sudo apt-get update sudo apt-get install mysql-client
Когда ваш сервер и клиент готов, продолжайте дальше следовать нашему гиду.
Проверьте текущий статус ssl/tls
Прежде чем мы начнем, мы можем проверить текущее состояние SSL/TLS на нашем экземпляре MySQL сервера.
Войдите в сеанс MySQL с помощью пользователя root в MySQL. Мы будем использовать -h чтобы указать локальный интерфейс обратной петли IPv4 для того , чтобы заставить клиента соединиться с TCP вместо использования локального файла сокета. Это позволит нам проверить состояние SSL для TCP соединений:
mysql -u root -p -h 127.0.0.1
Вам будет предложено ввести MySQL пароль root, который вы выбрали в процессе установки. После этого вы попадёте в интерактивную сессию MySQL.
Показать состояние переменных SSL/TLS, набрав:
mysql> SHOW VARIABLES LIKE '%ssl%';
Вывод
--------------- ----------
| Variable_name | Value |
--------------- ----------
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | |
--------------- ----------
9 rows in set (0.01 sec)
Переменные have_openssl и have_ssl помечены как DISABLED. Это означает, что функциональность SSL собран в сервере, но еще не включена.
Проверьте состояние нашего текущего соединения, чтобы подтвердить:
mysql> s
Вывод
Создание файла конфигурации клиента mysql
Для того, чтобы избежать необходимости указать файлы сертификата каждый раз при подключении к сети, мы можем создать простой файл конфигурации клиента MySQL.
Внутри вашей домашней директории на машине клиенте MySQL, создайте скрытый файл с именем ~/.my.cnf:
mysql-client$ nano ~/.my.cnf
В верхней части файла, создайте раздел под названием [client]. Внизу, мы можем установить параметры ssl-ca, ssl-cert и ssl-key, чтобы указать на файлы, которые мы копируем с сервера. Он должен выглядеть следующим образом :
~ / .my.cnf
[client] ssl-ca = ~/client-ssl/ca.pem ssl-cert = ~/client-ssl/client-cert.pem ssl-key = ~/client-ssl/client-key.pem
Опция ssl-ca сообщает клиенту, чтобы убедиться, что сертификат, представленный сервером MySQL подписывается центром сертификации, который мы указали. Это позволяет клиенту верить, что он подключается к доверенному серверу MySQL.
параметры ssl-cert и ssl-key указывают на файлы, необходимые для доказательства сервера MySQL, что он тоже имеет сертификат, подписанный тем же органом сертификации. Нам это нужно, если мы хотим, чтобы сервер MySQL убедиться, что клиент был доверенным центром сертификации.
Сохраните и закройте файл, когда вы закончите.
Теперь вы можете подключиться к серверу MySQL, не добавляя опции –ssl-ca, –ssl-cert и –ssl-key к командной строке: