GNU/Linux >> Tutoriales Linux >  >> Cent OS

Cómo habilitar SSL y conexiones remotas para MySQL en CentOS 7

MySQL es un sistema de base de datos relacional de código abierto que funciona en muchos sistemas operativos, incluidos Windows, Linux, MacOS y FreeBSD. Es probablemente el RDBMS de código abierto más popular y un componente central de las pilas LAMP y LEMP. Hay muchas aplicaciones que dependen de MySQL como Wordpress, Joomla, TYPO3, phpBB y muchas más.

En este tutorial, le mostraré paso a paso cómo configurar MySQL de forma segura para conexiones remotas. Cuando necesite acceder a MySQL de forma remota, es necesario usar una VPN ya que MySQL no cifra los datos transferidos o puede configurar MySQL para usar SSL, como le mostraré en este tutorial. En esta configuración, solo los usuarios con los archivos de certificado SSL correctos pueden conectarse al servidor MySQL y el tráfico está encriptado. Instalaremos la última versión de MySQL y luego configuraremos SSL para la conexión remota. Para el sistema base, usaré un servidor CentOS 7.

Qué haremos:

  1. Instalar MySQL.
  2. Configure la contraseña raíz de MySQL.
  3. Generar nuevos archivos de certificado SSL autofirmados.
  4. Habilite SSL para MySQL.
  5. Habilitar conexión remota.
  6. Pruebas.

Requisito previo

  • Servidor CentOS 7
  • Privilegios de raíz

Paso 1:instalar MySQL

En este tutorial, usaremos MySQL 5.7, la última versión en este momento. Se instala desde el repositorio de MySQL, por lo que primero debemos agregar un nuevo repositorio de CentOS al sistema.

Agregue el nuevo repositorio para MySQL con el comando yum a continuación.

yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm

Se le pedirá que instale un nuevo paquete, escriba 'y ' y presione 'Entrar ' para confirmar.

Ahora puede instalar la última versión 5.7 de MySQL en el servidor de esta manera:

yum -y install mysql-community-server

Cuando se haya completado la instalación, inicie el servicio MySQL y habilítelo para que se ejecute automáticamente en el momento del arranque con el comando systemctl.

systemctl start mysqld
systemctl enable mysqld

Asegúrese de que MySQL se esté ejecutando comprobando el puerto utilizado por MySQL (3306). Compruébalo con el siguiente comando netstat.

netstat -plntu

MySQL se ha instalado en CentOS 7 desde el repositorio de MySQL.

Paso 2:configure la contraseña raíz de MySQL

De forma predeterminada, MySQL 5.7 genera una contraseña raíz predeterminada para usted cuando inicia el servicio por primera vez. La contraseña se almacena en el archivo de registro de MySQL '/var/log/mysqld.log'.

Para ver la contraseña raíz predeterminada de MySQL, puede usar el siguiente comando grep.

grep 'temporary' /var/log/mysqld.log

Verá un resultado similar al siguiente, mi contraseña predeterminada es 'wxtX8Te&Uh1K '.

A temporary password is generated for [email protected]: wxtX8Te&Uh1K

Conéctese al shell de MySQL con la contraseña predeterminada y reemplace la contraseña con su propia contraseña.

mysql -u root -p
TYPE IN DEFAULT PASSWORD

Ahora reemplace la contraseña predeterminada con su propia contraseña. En este tutorial, usaré '[email protected] ' como la nueva contraseña de root de MySQL. Ejecute las consultas de MySQL a continuación.

ALTER USER 'root'@'localhost' IDENTIFIED BY '[email protected]';
flush privileges;
exit;

Ahora puede volver a conectarse con la nueva contraseña '[email protected]'.

mysql -u root -p
TYPE NEW PASSWORD '[email protected]'

Paso 3:generar nuevos archivos de certificados autofirmados

Por defecto, MySQL 5.7 tiene sus propios archivos de certificado SSL en el directorio '/var/lib/mysql'. Pero en este tutorial, le mostraré cómo generar sus propios archivos de certificado SSL con OpenSSL y luego configurarlos con MySQL.

En este paso, generaremos nuevos archivos de certificados autofirmados. Necesitamos 3 certificados, Certificado CA, Certificado y clave del servidor, Certificado y clave del cliente . Los crearemos con OpenSSL.

Cree un nuevo directorio para los archivos de certificado SSL '/etc/certs/' y vaya a ese directorio.

mkdir -p /etc/certs
cd /etc/certs

Generar nuevo archivo ca.pem de certificado de CA.

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

A continuación, tenemos que crear los certificados del lado del servidor. Cree nuevos archivos de certificado de servidor server-cert.pem y server-key.pem. Genere nuevos archivos de certificado, elimine la frase de contraseña y fírmelos con el certificado de 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

Ahora genere archivos de certificado para el cliente. El servidor MySQL solo aceptará la conexión remota del cliente que tenga estos archivos de certificado. Genere nuevos archivos de certificado de cliente, elimine la frase de contraseña y fírmelos con el certificado de CA.

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

Nota:

La información del certificado de CA debe ser diferente de la información del cliente y del servidor.

Se han generado todos los certificados que requerimos para esta configuración. Ahora podemos verificar los archivos de certificado con el siguiente comando.

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

Asegúrese de que no haya ningún error, los resultados son los siguientes.

Todos los archivos del Certificado han sido verificados. Cambie el propietario del directorio de certificados al usuario 'mysql' y cambie los permisos de todos los archivos clave.

chown -R mysql:mysql /etc/certs/
chmod 600 client-key.pem server-key.pem ca-key.pem

Paso 4:habilite SSL para MySQL

En este paso, habilitaremos SSL para MySQL. Antes de comenzar a configurar y habilitar SSL en MySQL, debemos hacer una copia de seguridad de los archivos de certificado predeterminados en el nuevo directorio de copia de seguridad.

Cree un nuevo directorio de copia de seguridad 'mysql-certs ' para todos los certificados.

mkdir -p ~/mysql-certs/

Vaya al directorio '/var/lib/mysql' y mueva todos los certificados predeterminados al directorio de respaldo.

cd /var/lib/mysql/
mv ca.pem ca-key.pem ~/mysql-certs/
mv server-key.pem server-cert.pem ~/mysql-certs/
mv client-key.pem client-cert.pem ~/mysql-certs/
mv private_key.pem public_key.pem ~/mysql-certs/

Ahora reinicie el servicio MySQL.

systemctl restart mysqld

A continuación, verifique SSL desde el shell de MySQL. Inicie sesión en mysql con la nueva contraseña:

mysql -u root -p
TYPE NEW PASSWORD '[email protected]'

Ejecute la consulta a continuación para que podamos ver el estado de SSL para MySQL.

SHOW GLOBAL VARIABLES LIKE '%ssl%';
STATUS;

Verá que el estado de SSL es 'DESHABILITADO ', y el usuario raíz se ha conectado sin SSL .

A continuación, habilitaremos la conexión SSL para MySQL. Tenemos que editar el archivo de configuración de MySQL 'my.cnf ' archivo con vim.

vim /etc/my.cnf

En el '[mysqld] ', pegue la configuración a continuación.

# Type your own certificates directory
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/server-cert.pem
ssl-key=/etc/certs/server-key.pem

Guarde el archivo y salga de vim, reinicie el servicio MySQL.

systemctl restart mysqld

Ahora inicie sesión en MySQL nuevamente y verifique el SSL.

mysql -u root -p
TYPE NEW PASSWORD '[email protected]'

Ejecute la consulta a continuación para asegurarse de que el valor de la sección SSL sea ' '.

SHOW VARIABLES LIKE '%ssl%';
STATUS;

Verá que SSL para MySQL está habilitado, pero el usuario raíz aún no está conectado mediante la conexión SSL.

Para forzar la conexión de todos los usuarios locales con SSL, edite el archivo de configuración mysql 'my.cnf ' de nuevo.

vim /etc/my.cnf

Pegue la configuración a continuación al final de la línea.

[client]
ssl-ca=/etc/certs/ca.pem
ssl-cert=/etc/certs/client-cert.pem
ssl-key=/etc/certs/client-key.pem

Guarde y salga, luego reinicie MySQL.

systemctl restart mysqld

Conéctese a MySQL nuevamente y verifique la conexión y SSL habilitado.

mysql -u root -p
TYPE NEW PASSWORD '[email protected]'


SHOW VARIABLES LIKE '%ssl%';
STATUS;

SSL se ha habilitado y la conexión local también usa SSL.

Paso 5:habilite las conexiones remotas

En los pasos anteriores, ya habilitamos SSL para el servidor MySQL y las conexiones locales están obligadas a usar SSL. En este paso, habilitaremos las conexiones remotas para MySQL, pero solo permitiremos que los clientes tengan archivos de certificado firmados por nuestra CA para conectarse al servidor MySQL.

Edite el archivo de configuración de MySQL con vim.

vim /etc/my.cnf

Pegue esta configuración a continuación al final de '[mysqld] ' sección.

bind-address = *
require_secure_transport = ON

Guarde el archivo y salga del editor, luego reinicie MySQL.

systemctl restart mysqld

A continuación, cree un nuevo usuario para la conexión remota. Crearé un nuevo usuario llamado 'hakase ' con contraseña '[email protected] ' y otorgar todos los privilegios al 'hakase ' usuario. 'hakase ' el usuario solo podrá conectarse con la clave del certificado.

mysql -u root -p
TYPE NEW PASSWORD '[email protected]'

create user 'hakase'@'%' identified by '[email protected]' REQUIRE X509;
grant all privileges on *.* to 'hakase'@'%' identified by '[email protected]' REQUIRE X509;
flush privileges;

Se ha creado un nuevo usuario para la conexión remota.

Nota:

Es posible que vea '1 advertencia ' en el resultado de la consulta mysql. Es solo una advertencia sobre el uso de la consulta ALTER USER en lugar de GRANT porque la consulta 'GRANT' quedará obsoleta en la próxima versión.

Paso 6 - Prueba

En la sección final de este tutorial, probaremos si el nuevo usuario llamado 'hakase' puede conectarse al servidor MySQL de forma remota con archivos de certificado. Se deben descargar tres certificados para el cliente.

  1. Certificado CA - ca.pem
  2. Certificado de cliente - client-cert.pem
  3. Clave de cliente:cliente-clave.pem

Inicié sesión en otro sistema Linux e instalé los paquetes mysql-client allí. Luego descargué todos los archivos de certificado de cliente con SCP. Ahora me conectaré al servidor MySQL con los archivos del certificado.

mysql -h 10.0.15.11 -u hakase \
--ssl-ca=ca.pem \
--ssl-cert=client-cert.pem \
--ssl-key=client-key.pem -p

10.0.15.11 =dirección IP del servidor MySQL.

Puede ver el estado de la conexión con esta consulta a continuación.

STATUS;

Usuario hakase con dirección IP 10.0.15.10 Conectado al servidor MySQL con dirección IP 10.0.15.11 , la conexión a través de TCP/IP en el puerto 3306 y usando SSL .

Cuando intente conectarse sin archivos de certificado, verá el siguiente error.

A continuación, probaré con MySQLWorkbench GUI desde mi host.

A continuación se muestra mi configuración - Parámetro de configuración.

Configuración de SSL - Configuración de SSL.

Y debajo los resultados de la conexión con archivos de Certificado de Cliente SSL.

Un nuevo usuario se conectó con éxito de forma remota al servidor de base de datos MySQL con una conexión SSL. Cuando un usuario intenta conectarse sin los archivos del certificado, el resultado será 'denegado '. La instalación y configuración de MySQL con conexión SSL ha sido exitosa.


Cent OS
  1. Cómo restablecer su contraseña raíz de MySQL en CentOS 6

  2. Cómo configurar conexiones remotas y seguras para MySQL en Ubuntu 16.04

  3. ¿Cómo instalar MySQL en CentOS 7.x?

  4. Habilitar SSL y conexiones remotas para MySQL

  5. Cómo habilitar FTP en CentOS/RHEL 5 y 6

Cómo habilitar Kdump en RHEL 7 y CentOS 7

Cómo habilitar el repositorio EPEL en el servidor CentOS 8 y RHEL 8

Cómo instalar Nginx con PHP y MySQL (LEMP Stack) en CentOS 7

Cómo instalar ONLYOFFICE en Red Hat Linux (RHEL) y CentOS

Cómo instalar Nginx con PHP y MySQL (LEMP Stack) en CentOS 7.6

Cómo instalar y habilitar Remi Repository en CentOS 5, CentOS 6 y CentOS 7