MySQL
Configuración de la conexión SSL
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:
- 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
Configuración para CentOS7 / RHEL7
Este ejemplo asume dos servidores:
- dbserver (donde vive nuestra base de datos)
- 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.