sql >> Base de Datos >  >> RDS >> Mysql

Asegurar el servidor MySQL

MySQL

MySQL es un sistema de gestión de bases de datos relacionales de código abierto. Esta guía le mostrará cómo proteger y auditar un servidor MySQL. El nombre es una combinación de "My", el nombre de la hija del cofundador Michael Widenius, y "SQL", la abreviatura de Structured Query Language.

Antes de comenzar

  1. Asegúrese de haber seguido las guías Primeros pasos y Protección de su servidor. Asegúrese de que el nombre de host de Linode esté configurado.

    Verifique el nombre de host de su Linode. El primer comando debe mostrar su nombre de host abreviado y el segundo debe mostrar su nombre de dominio completo (FQDN).

    hostname
    hostname -f
    
    Nota Si tiene un nombre de dominio registrado para su sitio web, agregue el dominio al servidor Linode en el que planea instalar la pila LAMP. Si no tiene un nombre de dominio registrado, reemplace example.com con la dirección IP del servidor Linode en las siguientes instrucciones.
  2. Actualice su sistema:

    sudo yum update
    
    Nota Esta guía está escrita para un usuario no root. Los comandos que requieren privilegios elevados tienen el prefijo sudo . Si no está familiarizado con sudo comando, puede consultar nuestra guía de Usuarios y Grupos.
  3. Para proteger y auditar MySQL, debe tener un servidor Linux con el MySQL Server servicios funcionando. Para obtener información sobre la instalación de MySQL, consulte Instalar MySQL

    Nota Las instrucciones de esta guía se basan en Ubuntu 18.04, aunque todos los pasos son independientes de la distribución con la excepción de los nombres de los paquetes y los administradores de paquetes.

Uso del instalador seguro de MySQL

El paquete mysql-server viene preconfigurado con una utilidad llamada mysql_secure_installation que se utiliza para configurar un punto de partida seguro para el servidor MySQL, eliminando usuarios anónimos y permitiéndole especificar la política de seguridad de contraseña deseada.

mysql_secure_installation es un script de shell disponible en los sistemas Unix y le permite asegurar la instalación de MySQL permitiéndole:

  • establecer una contraseña para las cuentas raíz
  • eliminar las cuentas raíz a las que se puede acceder desde fuera del host local
  • eliminar cuentas de usuarios anónimos
  • eliminar la base de datos de prueba, a la que pueden acceder de forma predeterminada los usuarios anónimos

Comience el proceso de seguridad ejecutando esta utilidad inmediatamente después de instalar mysql-server.

  1. Invoque la utilidad ejecutando el siguiente comando:

     sudo mysql_secure_installation
    
  2. Comienza el proceso de configuración y la utilidad le solicita que especifique si desea habilitar el complemento de validación de contraseña que se utiliza para probar contraseñas y mejorar la seguridad. Se recomienda habilitar esta función.

    Securing the MySQL server deployment.
    
    Connecting to MySQL using a blank password.
    
    VALIDATE PASSWORD PLUGIN can be used to test passwords
    and improve security. It checks the strength of password
    and allows the users to set only those passwords which are
    secure enough. Would you like to setup VALIDATE PASSWORD plugin?
    
    Press y|Y for Yes, any other key for No: y

  3. Después de habilitar el complemento de contraseña, especifique su política de validación de contraseñas según el nivel de seguridad de las contraseñas deseadas.

    There are three levels of password validation policy:
    
    LOW    Length >= 8
    MEDIUM Length >= 8, numeric, mixed case, and special characters
    STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file
    
    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
    Please set the password for root here.
    
    New password:
    
    Re-enter new password:
    
    Estimated strength of the password: 100
    Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

  4. Eliminar usuarios anónimos. Esta es una opción de seguridad importante, ya que los atacantes pueden aprovechar a los usuarios anónimos para obtener acceso al servidor de la base de datos.

    By default, a MySQL installation has an anonymous user,
    allowing anyone to log into MySQL without having to have
    a user account created for them. This is intended only for
    testing, and to make the installation go a bit smoother.
    You should remove them before moving into a production
    environment.
    
    Remove anonymous users? (Press y|Y for Yes, any other key for No) : y

  5. Deshabilite el inicio de sesión raíz de forma remota, esta es una configuración de seguridad extremadamente importante, ya que evita que los atacantes se autentiquen de forma remota en el servidor MySQL como raíz o realicen ataques de fuerza bruta de contraseña. La autenticación remota también se puede deshabilitar por completo, veremos cómo hacerlo en la siguiente sección.

    Normally, root should only be allowed to connect from
    'localhost'. This ensures that someone cannot guess at
    the root password from the network.
    
    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y

  6. Elimine la base de datos de prueba creada durante el proceso de instalación del servidor mysql, esta base de datos se crea con fines de prueba, como buena práctica, se recomienda eliminar esta base de datos.

    By default, MySQL comes with a database named 'test' that
    anyone can access. This is also intended only for testing,
    and should be removed before moving into a production
    environment.
    
    
    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y

  7. Vuelva a cargar las tablas de privilegios para asegurarse de que todos los cambios se apliquen y tengan efecto.

    Reloading the privilege tables will ensure that all changes
    made so far will take effect immediately.
    
    Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
    Success.
    
    All done!
    Ahora tiene una base segura para trabajar, en la siguiente sección, encuentre las instrucciones para cambiar la raíz predeterminada nombre de usuario y contraseña.

Modificando el usuario “raíz”

Por defecto, el servidor MySQL viene predefinido con un superuser/admin cuenta que tiene acceso a todos los privilegios y funcionalidades de las bases de datos y usuarios de bases de datos. Dado este control y acceso incomparables, es importante bloquear y proteger la cuenta raíz, ya que los atacantes suelen apuntar a la cuenta raíz en un servidor MySQL porque tiene el potencial de proporcionar acceso completo a las bases de datos y a los usuarios de las bases de datos.

El primer paso para proteger al usuario "raíz" es cambiar el nombre de usuario de root a algo más inflexible, el objetivo es hacer que el nombre de usuario raíz sea tan difícil de adivinar o de fuerza bruta para los atacantes. Después de lo cual, también se recomienda cambiar la root contraseña de la cuenta regularmente como una buena práctica.

  1. Inicie sesión en el servidor MySQL con el siguiente comando:

     sudo mysql -u root
    
  2. Cambie el nombre de usuario de la cuenta "raíz" ejecutando la siguiente consulta:

     rename user 'root'@'localhost' to '<new-username>'@'localhost';
    
  3. Cambiar la root contraseña de la cuenta a algo fuerte y difícil de adivinar, se recomienda utilizar un generador de contraseñas. Si habilitó el complemento de verificación de contraseña durante el proceso de instalación segura, debe proporcionar una contraseña que cumpla con los requisitos de la política en términos de seguridad.

     ALTER USER 'example_username'@'localhost' IDENTIFIED BY '<new-password>';
    
  4. Vuelva a cargar la tabla de privilegios para asegurarse de que todos los cambios se guarden y activen ejecutando el siguiente comando:

     flush privileges;
    
  5. Para confirmar si la root se cambian el nombre de usuario y la contraseña, ejecute la siguiente consulta:

     use mysql;
     select user,host,authentication_string from mysql.user;
    

Esto muestra las tablas de usuario almacenadas en la base de datos mysql y debería reflejar los cambios realizados.

+------------------+-----------+-------------------------------------------+
| user             | host      | authentication_string                     |
+------------------+-----------+-------------------------------------------+
| example_user     | localhost | *A2550B00C6DF81DACE33551E8293462F6CAE33DA |
| mysql.session    | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys        | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| debian-sys-maint | localhost | *241DC5A20F017D55EE82E46E7996784ED4A5CD8A |
+------------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)

Creando un Nuevo Usuario

Una buena práctica de seguridad es el concepto de segregación por funciones o roles. Esto significa que para cada base de datos o aplicación que use la base de datos, cree un nuevo usuario que tenga permisos CRUD para esa base de datos en particular. Esto garantiza que, en cualquier momento, solo un usuario tenga acceso a una base de datos a la vez y los usuarios no puedan acceder a otras bases de datos.

  1. Crear una Test base de datos, ejecutando la siguiente consulta dentro de MYSQL:

     create database Test;
    
  2. Cree el usuario responsable de administrar esta base de datos de prueba:

     CREATE USER '<username>'@'localhost' IDENTIFIED BY '<password>';
    
  3. Asigne los permisos CRUD apropiados al usuario para la Test base de datos:

     GRANT SELECT,UPDATE,DELETE ON Test.* TO '<username>'@'localhost';
    
  4. Es importante tener en cuenta que estos privilegios se aplican solo a la Test base de datos, si está creando un usuario para una aplicación como phpMyAdmin , debe proporcionar al usuario root permisos.

  5. Si decide eliminar un usuario en particular, ejecute la siguiente consulta:

     drop user '<username>'@'localhost';
    
  6. Vuelva a cargar la tabla de privilegios para asegurarse de que los cambios realizados se apliquen y activen ejecutando la siguiente consulta:

     flush privileges;
    

Configuración personalizada de MySQL

Ahora puede configurar una configuración personalizada segura para MySQL que proporciona opciones de configuración de seguridad adicionales.

  1. El archivo de configuración global de MySQL se encuentra en /etc/mysql/my.cnf , todas las configuraciones globales personalizadas deben establecerse en el archivo de configuración.

  2. La configuración personalizada debe especificarse para mysqld (demonio MySQL), las opciones que se muestran en la imagen son configuraciones de seguridad personalizadas.

  3. Después de agregar las configuraciones personalizadas, debe reiniciar mysql servicio para garantizar que se apliquen todos los cambios.

     systemctl restart mysql
    

Auditando la seguridad de MySQL

Ahora puede auditar la seguridad del servidor MySQL usando una herramienta llamada MySAT. MySAT realiza varias pruebas para analizar las configuraciones de la base de datos y las políticas de seguridad. MySAT ayuda a evaluar y, por lo tanto, a aumentar la seguridad de la base de datos MySQL. MySAT es un script SQL simple, fácil de entender y fácil de mantener. Los resultados de MySAT se muestran en formato HTML.

  1. Clone el repositorio MySAT Github ejecutando el siguiente comando:

     git clone https://github.com/meob/MySAT.git
    
  2. Después de clonar el directorio, navegue al directorio MySAT, donde se encuentra el mysat.sql se encuentra el archivo y se usa junto con el servidor MySQL para enviar los resultados a un MySAT.htm archivo.

  3. Audite la seguridad ejecutando el siguiente comando:

     mysql --user=<root-user> -p<password> --skip-column-names -f < mysat.sql > MySAT.htm
    
  4. Como se indica, MySAT requiere acceso de root a MySQL para ejecutar las pruebas requeridas, después de ejecutar el comando, se genera el archivo MySAT.htm, copie el archivo MySAT.htm y el mysat.css archivo a un servidor Apache o NGINX, o descárguelos localmente con scp , para que puedas analizar los resultados de la auditoría.

  5. Los resultados tienen un formato fácil de leer y comprender, donde las configuraciones se verifican y los resultados están codificados por colores según su configuración actual y cómo afecta la seguridad del servidor mysql. Por ejemplo, una verificación de configuración fallida tiene un código de color naranja y una verificación aprobada tiene un código de color verde.

  6. El informe de auditoría revela qué configuraciones deben cambiarse o modificarse y le presenta una imagen de alto nivel de la seguridad general del servidor MySQL.