Buscar..


Configuración para sistemas basados ​​en Debian

(Esto supone que MySQL se ha instalado y que se está utilizando sudo ).

Generando una CA y claves SSL

Asegúrese de que OpenSSL y las bibliotecas estén instaladas:

apt-get -y install openssl
apt-get -y install libssl-dev

Luego haga e ingrese un directorio para los archivos SSL:

mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts

Para generar claves, cree una autoridad de certificación (CA) para firmar las claves (autofirmadas):

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem

Los valores ingresados ​​en cada solicitud no afectarán la configuración. A continuación, cree una clave para el servidor y firme utilizando la CA de antes:

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

Luego crea una clave para un cliente:

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

Para asegurarse de que todo se haya configurado correctamente, verifique las claves:

openssl verify -CAfile ca.pem server-cert.pem client-cert.pem

Añadiendo las claves a MySQL

Abra el archivo de configuración de MySQL . Por ejemplo:

vim /etc/mysql/mysql.conf.d/mysqld.cnf

En la sección [mysqld] , agregue las siguientes opciones:

ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem

Reinicie MySQL. Por ejemplo:

service mysql restart

Probar la conexión SSL

Conéctese de la misma manera, pasando las opciones adicionales ssl-ca , ssl-cert y ssl-key , utilizando la clave de cliente generada. Por ejemplo, asumiendo 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

Después de iniciar sesión, verifique que la conexión sea segura:

[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  |
+---------------+-----------------------------------------+

También puedes consultar:

[email protected] [None]> STATUS;
...
SSL:                    Cipher in use is DHE-RSA-AES256-SHA
...

Cumplimiento de SSL

Esto es a través de GRANT , utilizando REQUIRE SSL :

GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;

Ahora, superman debe conectarse a través de SSL.

Si no desea administrar las claves de cliente, use la clave de cliente anterior y úsela automáticamente para todos los clientes. Abra el archivo de configuración de MySQL , por ejemplo:

vim /etc/mysql/mysql.conf.d/mysqld.cnf

En la sección [client] , agregue las siguientes opciones:

ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem

Ahora superman solo tiene que escribir lo siguiente para iniciar sesión a través de SSL:

mysql -h 127.0.0.1 -u superman -p

La conexión desde otro programa, por ejemplo en Python, normalmente solo requiere un parámetro adicional a la función de conexión. Un ejemplo de 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)

Referencias y lecturas adicionales:

Configuración para CentOS7 / RHEL7

Este ejemplo asume dos servidores:

  1. dbserver (donde vive nuestra base de datos)
  2. appclient (donde viven nuestras aplicaciones)

FWIW, ambos servidores están ejecutando SELinux.

Primero, inicie sesión en dbserver

Crear un directorio temporal para crear los certificados.

mkdir /root/certs/mysql/ && cd /root/certs/mysql/

Crear los certificados del servidor.

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

Mueva los certificados del servidor a / etc / pki / tls / certs / mysql /

La ruta del directorio asume CentOS o RHEL (ajuste según sea necesario para otras distribuciones):

mkdir /etc/pki/tls/certs/mysql/

Asegúrese de establecer permisos en la carpeta y los archivos. mysql necesita plena propiedad y acceso.

chown -R mysql:mysql /etc/pki/tls/certs/mysql

Ahora configura 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 

Entonces

systemctl restart mariadb

No olvide abrir su firewall para permitir conexiones desde appclient (usando 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.

Ahora reinicia firewalld

service firewalld restart

A continuación, inicie sesión en el servidor mysql de dbserver:

mysql -uroot -p 

Emita lo siguiente para crear un usuario para el cliente. nota REQUIRE SSL en la sentencia GRANT.

GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES; 
# quit mysql

Aún debe estar en / root / certs / mysql desde el primer paso. Si no, cd de nuevo a él para uno de los comandos a continuación.

Crear los certificados de cliente.

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

Nota : usé el mismo nombre común para los certificados de servidor y cliente. YMMV.

Asegúrese de que todavía esté en / root / certs / mysql / para este próximo comando

Combine el certificado de CA del servidor y del cliente en un solo archivo:

cat server-cert.pem client-cert.pem > ca.pem

Asegúrese de ver dos certificados:

cat ca.pem 

TRABAJO LATERAL DEL FIN DEL SERVIDOR POR AHORA.

Abre otra terminal y

ssh appclient

Como antes, crea un hogar permanente para los certificados del cliente.

mkdir /etc/pki/tls/certs/mysql/

Ahora, coloque los certificados de cliente (creados en dbserver) en appclient. Puede hacer una copia de ellos o simplemente copiar y pegar los archivos uno por uno.

scp dbserver
# copy files from dbserver to appclient
# exit scp

Una vez más, asegúrese de establecer permisos en la carpeta y los archivos. mysql necesita plena propiedad y acceso.

chown -R mysql:mysql /etc/pki/tls/certs/mysql

Debe tener tres archivos, cada uno de los cuales pertenece al usuario mysql:

/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem

Ahora edite la configuración MariaDB / MySQL de appclient en la sección [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 

Reinicie el servicio mariadb de appclient:

systemctl restart mariadb

todavía en el cliente aquí

Esto debería devolver: ssl TRUE

mysql --ssl --help

Ahora, inicie sesión en la instancia de mysql de appclient

mysql -uroot -p

Debería ver SÍ a las dos variables a continuación

show variables LIKE '%ssl';
    have_openssl    YES
    have_ssl              YES

Inicialmente vi

 have_openssl NO

Una mirada rápida a mariadb.log reveló:

Error de SSL: no se puede obtener el certificado de '/etc/pki/tls/certs/mysql/client-cert.pem'

El problema era que root era propiedad de client-cert.pem y la carpeta que lo contenía. La solución fue establecer la propiedad de / etc / pki / tls / certs / mysql / a mysql.

chown -R mysql:mysql /etc/pki/tls/certs/mysql

Reinicie mariadb si es necesario desde el paso inmediatamente anterior

AHORA ESTAMOS LISTOS PARA PROBAR LA CONEXIÓN SEGURA

Todavía estamos en apuros aquí

Intente conectarse a la instancia mysql de dbserver utilizando la cuenta creada anteriormente.

mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)

Con un poco de suerte debes iniciar sesión sin error.

Para confirmar que está conectado con SSL habilitado, emita el siguiente comando desde el indicador MariaDB / MySQL:

\s 

Eso es una barra invertida, también conocido como estado

Eso mostrará el estado de tu conexión, que debería verse así:

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

Si obtiene un permiso denegado errores en su intento de conexión, verifique la declaración GRANT que se encuentra arriba para asegurarse de que no haya caracteres erráticos o marcas.

Si tiene errores de SSL, vuelva a leer esta guía para asegurarse de que los pasos estén ordenados.

Esto funcionó en RHEL7 y probablemente también funcionará en CentOS7. No se puede confirmar si estos pasos exactos funcionarán en otro lugar.

Espero que esto le ahorre a alguien un poco de tiempo y molestia.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow