Ir al contenido principal

ProxySQL con SSL/TLS

 

Introducción

Cuando configuras ProxySQL, es fundamental tomar en cuenta varios aspectos de seguridad para proteger la infraestructura y asegurar las comunicaciones entre ProxySQL y los servidores MySQL, así como las conexiones desde los clientes hacia ProxySQL. Aquí te explico algunos puntos de seguridad importantes y la posibilidad de usar SSL/TLS en la configuración de ProxySQL.

Puntos de Seguridad para Configurar ProxySQL

  1. Control de acceso y autenticación:

    • Acceso al panel de administración de ProxySQL: El acceso al panel de administración de ProxySQL (puerto 6032) debe estar restringido a las direcciones IP de confianza. Es importante que este puerto no esté expuesto públicamente.

      • Puedes limitar el acceso a este puerto usando reglas de firewall (como iptables o firewalld) o mediante reglas en el archivo de configuración de ProxySQL (proxysql.cnf), especificando el bind-address.

      Ejemplo en el archivo proxysql.cnf:

      admin_variables =
      {
          # Panel de administración accesible solo localmente
          admin-ui-bind-address = "127.0.0.1"
          admin-ui-port = 6032
      }
      
    • Autenticación fuerte: Asegúrate de usar una contraseña fuerte para los usuarios de administración de ProxySQL, como el usuario admin utilizado para acceder al panel de administración.

    • Acceso a la base de datos: Asegúrate de que los usuarios de ProxySQL (como el mysql_user que usas para conectarte a los servidores MySQL) tengan los privilegios mínimos necesarios. Evita que ProxySQL utilice cuentas con permisos excesivos.

  2. Cifrado de la comunicación entre ProxySQL y los servidores MySQL (SSL/TLS):

    Es altamente recomendable utilizar SSL/TLS para cifrar la comunicación entre ProxySQL y los servidores MySQL. Esto garantiza que los datos transmitidos no sean interceptados ni manipulados, incluso si se transmiten a través de redes no confiables.

  3. Cifrado de las conexiones cliente-ProxSQL:

    Además del cifrado entre ProxySQL y los servidores MySQL, también puedes cifrar las conexiones entre los clientes y ProxySQL utilizando SSL/TLS. Esto es especialmente importante si ProxySQL está expuesto a Internet o se encuentra en una red no segura.

¿Es posible configurar ProxySQL con certificados SSL?

Sí, ProxySQL es totalmente capaz de manejar conexiones cifradas usando SSL/TLS tanto entre ProxySQL y los servidores MySQL como entre ProxySQL y los clientes. A continuación te explico cómo hacerlo.

Configuración de SSL/TLS entre ProxySQL y los servidores MySQL

1. Configurar los servidores MySQL para usar SSL/TLS:

En primer lugar, debes configurar MySQL para permitir conexiones seguras a través de SSL/TLS.

  1. En el servidor MySQL Master y Slave, asegúrate de que el archivo de configuración (my.cnf) tenga habilitado el soporte de SSL:

    [mysqld]
    ssl-ca = /path/to/ca-cert.pem         # Autoridad certificadora (CA)
    ssl-cert = /path/to/server-cert.pem   # Certificado del servidor
    ssl-key = /path/to/server-key.pem     # Clave privada del servidor
    
  2. Reinicia el servidor MySQL para aplicar los cambios.

    systemctl restart mysql
    
  3. Verifica que MySQL está aceptando conexiones SSL:

    SHOW VARIABLES LIKE '%ssl%';
    

2. Configurar ProxySQL para usar SSL/TLS:

En ProxySQL, debes configurar las conexiones a MySQL para que utilicen SSL/TLS. Para esto, tendrás que especificar los certificados correspondientes en el archivo de configuración de ProxySQL.

  1. Abre el archivo de configuración de ProxySQL (proxysql.cnf o proxysql en el directorio de configuración).

  2. Configura las opciones SSL para la conexión entre ProxySQL y los servidores MySQL:

    mysql-server-ssl-ca = /path/to/ca-cert.pem        # Certificado de la autoridad certificadora
    mysql-server-ssl-cert = /path/to/proxysql-cert.pem  # Certificado de ProxySQL
    mysql-server-ssl-key = /path/to/proxysql-key.pem    # Clave privada de ProxySQL
    

    Asegúrate de que los archivos de certificados y claves estén accesibles para el proceso de ProxySQL.

  3. En ProxySQL, cuando agregas los servidores MySQL (master y esclavo), habilita las conexiones SSL:

    INSERT INTO mysql_servers (hostgroup_id, hostname, port, ssl_enabled)
    VALUES (0, 'master_ip', 3306, 1);  -- Para el servidor master
    INSERT INTO mysql_servers (hostgroup_id, hostname, port, ssl_enabled)
    VALUES (1, 'slave_ip', 3306, 1);   -- Para el servidor esclavo
    
    • ssl_enabled = 1: Habilita SSL en la conexión.
  4. Recargar las configuraciones en ProxySQL:

    LOAD MYSQL SERVERS TO RUNTIME;
    SAVE MYSQL SERVERS TO DISK;
    

3. Configurar SSL/TLS en las conexiones cliente-ProxySQL (Opcional, pero recomendado):

Si deseas cifrar también las conexiones entre ProxySQL y los clientes, puedes habilitar SSL/TLS en el puerto de ProxySQL donde los clientes se conectan (usualmente el puerto 6033 para consultas SQL).

  1. Agrega los certificados SSL para las conexiones del cliente en el archivo de configuración de ProxySQL (proxysql.cnf):

    mysql-client-ssl-ca = /path/to/ca-cert.pem
    mysql-client-ssl-cert = /path/to/proxysql-client-cert.pem
    mysql-client-ssl-key = /path/to/proxysql-client-key.pem
    
  2. Habilita SSL en el puerto de escucha de ProxySQL (por ejemplo, en el puerto 6033):

    mysql-bind-address = "0.0.0.0"
    mysql-bind-port = 6033
    mysql-ssl-bind = 1
    
  3. Reinicia ProxySQL para aplicar la configuración.

    systemctl restart proxysql
    
  4. Los clientes pueden ahora conectarse de forma segura a ProxySQL usando SSL. Al conectar con el cliente MySQL, especifica los certificados correspondientes:

    mysql -h proxysql_ip -P 6033 -u your_user -p \
    --ssl-ca=/path/to/ca-cert.pem \
    --ssl-cert=/path/to/client-cert.pem \
    --ssl-key=/path/to/client-key.pem
    

4. Otras Consideraciones de Seguridad en ProxySQL:

  • Firewall: Asegúrate de que solo las IPs necesarias puedan acceder a ProxySQL. Configura un firewall para limitar las conexiones a los puertos de ProxySQL (6032 para administración y 6033 para clientes).

  • Autenticación de usuario: Utiliza contraseñas fuertes para los usuarios que se conectan a ProxySQL y a los servidores MySQL. Limita los permisos de los usuarios en ProxySQL para que solo puedan realizar las acciones necesarias.

  • Reglas de enrutamiento de consultas: Usa reglas de enrutamiento para asegurar que las consultas de escritura solo lleguen al master y las de lectura al esclavo. Esto puede ayudar a prevenir situaciones de sobrecarga en el master o inconsistencias de datos.

Resumen

Sí, ProxySQL permite la configuración con SSL/TLS tanto para las conexiones entre ProxySQL y los servidores MySQL, como para las conexiones cliente-ProxySQL. Debes configurar los certificados en los archivos de configuración de ProxySQL y en MySQL, habilitar SSL/TLS en ambos extremos, y asegurarte de que las reglas de firewall y acceso sean apropiadas para proteger tu infraestructura. También es importante utilizar autenticación fuerte y reglas de enrutamiento para asegurar que el tráfico esté correctamente distribuido entre el master y el esclavo.

Comentarios

Entradas más populares de este blog

Como montar particiones LVM en Linux

Como están lectores, reportandome después de varios meses fuera. Hace un par de días vi un howto que me gusto y quiero compartir. Nota: lo siguiente es una traducción, el original lo pueden ver el siguiente link: How to mount an LVM partition on Linux Introducción LVM es una herramienta de administración de volúmenes lógicos (particiones) la cual te permite administrar el espacio de disco usando la connotación de volúmenes lógicos y grupo de volúmenes. El mayor beneficio de usar LVM sobre las particiones clásicas es la flexibilidad en la asignación de almacenamiento para usuarios y aplicaciones sin verse limitado por el tamaño de los discos individuales. En LVM, el almacenamiento físico, en el cual se crean los volúmenes lógicos, son particiones tradicionales (/dev/sda1, /dev/sda2). Estas particiones deben ser marcadas como "volúmenes físicos" y etiquetadas como "Linux LVM", esto para ser usadas en LVM. Como no montar Unas vez que las particiones h...

Como leer/visualizar archivos utmp, wtmp y btmp en Linux

Lectores, les paso este "Como" de linux, algo que debe ser usado por cualquier sysadmin de Linux. Esperando aportar conocimiento, aqui les dejo. Introducción. En sistemas operativos Linux/Unix todo es registrado en algun lado (los conocidos logs). La mayoria de registros del sistema se almacenan en el directorio /var/log . El directorio contiene registros relacionados a distintos servicios y/o aplicaciones. En este directorio tenemos algunos archivos como utmp , wtmp y btmp . Estos archivos contienen todo el detalle de registro de inicio (login) y termino (logout) de sesiones de usuarios ya sea local, sistemas remoto, como estado en el sistema, tiempo en linea, etc. Informacion sobre los archivos utmp : te mostrara informacion completa del acceso de usuarios, la terminal que usa, termino de sesion, eventos del sistema y el estado actual del mismo, etc. wtmp : contiene el historio del archivo utmp btmp : registros solo intentos fallidos de sesion. Como no ...

Configurando interfaces de red virtuales en Linux

Estimados, de nuevo en acción retomando mi rumbo. Les traigo un traducción de un howto que me llamo la atención y creo que es bueno tener información en castellano. Así que aquí esta: La entrada original la pueden tener aqui (si te gusta leer en ingles), comencemos. Introducción ¿Sabia que puedes asignar mas de una dirección IP a una única interfaz de red? Esta técnica es muy utilizada, por ejemplo cuando se trabaja con Apache y host virtuales, esto para permitir accesar al mismo servicio pero usando dos direcciones IP. Interfaz de red virtual temporal  El proceso de crear interfaces de red virtual en +GNU/Linux  es muy simple. Esto involucra una ejecución simple del comando ifconfig ifconfig eth0:0 123.123.22.22 El comando anterior creara una nueva interfaz de red virtual basada en la interfaz física de eth0 . Lo condición mas importan...