sql >> Base de Datos >  >> RDS >> Database

¿Está protegida su base de datos? Piensa otra vez

1. Proteja su servidor

Muchos ataques conocidos son posibles solo una vez que se accede físicamente a una máquina. Por esta razón, es mejor tener el servidor de aplicaciones y el servidor de bases de datos en máquinas diferentes. Si esto no es posible, se debe tener más cuidado. De lo contrario, al ejecutar comandos remotos a través de un servidor de aplicaciones, un atacante puede dañar su base de datos incluso sin permisos. Por esta razón, a cualquier servicio que se ejecute en la misma máquina que la base de datos se le debe otorgar el permiso más bajo posible que aún permita que el servicio funcione.


No olvide instalar todo el paquete de seguridad:Antivirus y Antispam, Firewall y todos los paquetes de seguridad recomendados por el proveedor de su sistema operativo. Además, no olvide dedicar 10 minutos a pensar en la ubicación física de su servidor:en la ubicación incorrecta, su servidor puede ser robado, inundado, dañado por animales salvajes o vagabundos.

2. Seguridad de host local o deshabilitar o restringir el acceso remoto

Considere si MySQL se recuperará del sistema o se accederá directamente desde su propio servidor. Si se utiliza el acceso remoto, asegúrese de que solo los hosts identificados puedan acceder al servidor. Esto se hace comúnmente a través de contenedores TCP, tablas de IP o alguna otra herramienta de accesibilidad de hardware o programación de firewall.
Para evitar que MySQL abra un socket de red, el parámetro adjunto debe incluirse en el área [mysqld] de my.cnf o my.ini:

omitir redes

El documento se encuentra en "C:\Program Files\MySQL\MySQL Server 5.1" catálogo en el sistema operativo Windows o "/etc/my.cnf" o "/etc/mysql/my.cnf" en Linux.
Esta línea paraliza el inicio de la administración de sistemas en medio del inicio de MySQL. Sería ideal si tuviera en cuenta que se puede utilizar una conexión local para establecer una conexión con el servidor MySQL.

Otra posible solución es obligar a MySQL a escuchar solo el host local agregando la siguiente línea en [mysqld] sección de my.cnf dirección de enlace =127.0.0.1
Es posible que no esté dispuesto a inhabilitar el acceso del sistema a su servidor de base de datos si los clientes de su organización interactúan con el servidor desde sus máquinas o el servidor web introducido en una máquina alternativa. En ese caso, se debe considerar la siguiente sintaxis de concesión restrictiva:

mysql> GRANT SELECT, INSERT ON mydb.\* TO 'someuser'@'somehost';  

3. Deshabilitar el uso de LOCAL INFILE

El siguiente cambio es deshabilitar el uso de "LOAD DATA LOCAL INFILE" Comando, que ayudará a mantener la lectura no autorizada de los registros locales. Esto es particularmente vital cuando se encuentran nuevas vulnerabilidades de inyección SQL en aplicaciones PHP.
Además, en determinados casos, el "LOCAL INFILE" El comando se puede usar para obtener acceso a otros archivos en el sistema operativo, por ejemplo, "/etc/passwd" , usando el siguiente comando:

mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1

O incluso significativamente menos difícil:

mysql> SELECT load\_file("/etc/passwd")

Para deshabilitar el uso de "LOCAL INFILE" comando, se debe agregar el siguiente parámetro en el [mysqld] sección del archivo de configuración de MySQL.

set-variable=local-infile=0

4. Cambie el nombre de usuario y la contraseña raíz, manténgalos seguros.

El nombre de usuario de administrador predeterminado en el servidor MySQL es "root" . Los piratas informáticos a menudo intentan obtener acceso a sus permisos. Para hacer esta tarea más difícil, cambie el nombre de "root" a otra cosa y proporcionarle una contraseña alfanumérica larga y compleja.

Para cambiar el nombre del nombre de usuario del administrador, use el comando de cambio de nombre en la consola de MySQL:

mysql> RENAME USER root TO new\_user;

MySQL "RENOMBRAR USUARIO" El comando apareció por primera vez en MySQL versión 5.0.2. Si usa una versión anterior de MySQL, puede usar otros comandos para cambiar el nombre de un usuario:

mysql> use mysql;

mysql> update user set user="new\_user" where user="root";

mysql> flush privileges;

Para cambiar la contraseña de un usuario, utilice el siguiente comando de línea de comandos:

mysql> SET PASSWORD FOR 'username'@'%hostname' = PASSWORD('newpass');

También es posible cambiar la contraseña usando "mysqladmin" utilidad:

shell> mysqladmin -u username -p password newpass

5. Eliminar la base de datos "Prueba"

MySQL viene con una base de datos de "prueba" destinada a ser un espacio de prueba. El usuario anónimo puede acceder a él y, por lo tanto, es utilizado por numerosos ataques.
Para eliminar esta base de datos, use el comando soltar de la siguiente manera:

mysql> drop database test;  

O utilice "mysqladmin" comando:

shell> mysqladmin -u username -p drop test  

6. Eliminar cuentas anónimas y obsoletas

La base de datos MySQL viene con algunos usuarios anónimos con contraseñas en blanco. Como resultado, cualquiera puede conectarse a la base de datos para verificar si este es el caso, haga lo siguiente:

mysql> select \* from mysql.user where user="";  

En un sistema seguro, no se debe repetir ninguna línea. Otra forma de hacer lo mismo:

mysql> SHOW GRANTS FOR ''@'localhost';

mysql> SHOW GRANTS FOR ''@'myhost';

Si existen las concesiones, cualquiera puede acceder a la base de datos y al menos usar la base de datos predeterminada"test" . Compruébalo con:

shell> mysql -u blablabla

Para eliminar la cuenta, ejecute el siguiente comando:

mysql> DROP USER "";

MySQL "DROP USER" El comando es compatible a partir de la versión 5.0 de MySQL. Si usa una versión anterior de MySQL, puede eliminar la cuenta de la siguiente manera:

mysql> use mysql;

mysql> DELETE FROM user WHERE user="";

mysql> flush privileges;  

7. Aumente la seguridad con el control de acceso basado en roles

Una recomendación de seguridad de base de datos muy común es reducir los permisos otorgados a varias partes. MySQL no es diferente. Por lo general, cuando los desarrolladores trabajan, usan el permiso máximo del sistema y dan menos consideración a los principios de permisos de lo que podríamos esperar. Esta práctica puede exponer la base de datos a un riesgo significativo.
* Cualquier instalación nueva de MySQL 5.x ya instalada usando las medidas de seguridad correctas.
Para proteger su base de datos, asegúrese de que el directorio de archivos en el que se almacena realmente la base de datos MySQL sea propiedad del usuario "mysql" y del grupo "mysql".

shell>ls -l /var/lib/mysql

Además, asegúrese de que solo el usuario "mysql" y "root" tengan acceso al directorio /var/lib/mysql .
Los archivos binarios de mysql, que residen en el directorio /usr/bin/, deben ser propiedad de "root" o del usuario "mysql" del sistema específico. Otros usuarios no deberían tener acceso de escritura a estos archivos.

shell>ls -l /usr/bin/my\*  

8. Controle los privilegios de la base de datos

Los permisos del sistema operativo se arreglaron en la sección anterior. Ahora hablemos de los permisos de la base de datos. En la mayoría de los casos, hay un usuario administrador (el renombrado "raíz") y uno o más usuarios reales que coexisten en la base de datos. Por lo general, la "raíz" no tiene nada que ver con los datos de la base de datos; en cambio, se utiliza para mantener el servidor y sus tablas, para otorgar y revocar permisos, etc.
Por otro lado, algunos ID de usuario se utilizan para acceder a los datos, como el ID de usuario asignado al servidor web para ejecutar consultas "select\update\insert\delete" y para ejecutar procedimientos almacenados. En la mayoría de los casos, no se necesitan otros usuarios; sin embargo, solo usted, como administrador del sistema, puede conocer realmente las necesidades de su aplicación.

Solo las cuentas de administrador deben tener privilegios SUPER / PROCESO / ARCHIVO y acceso a la base de datos mysql. Por lo general, es una buena idea reducir los permisos del administrador para acceder a los datos.

Revise los privilegios del resto de los usuarios y asegúrese de que estén configurados correctamente. Esto se puede hacer usando los siguientes pasos.

mysql> use mysql;  

[Identificar usuarios]

mysql> select \* from users;  

[Lista de concesiones de todos los usuarios]

mysql> show grants for ‘root’@’localhost’;

¡La declaración anterior debe ejecutarse para cada usuario! Tenga en cuenta que solo se les debe otorgar privilegios de root a los usuarios que realmente necesitan.

Otro privilegio interesante es "MOSTRAR BASES DE DATOS". De forma predeterminada, el comando puede ser utilizado por cualquiera que tenga acceso al indicador de MySQL. Pueden usarlo para recopilar información (por ejemplo, obtener nombres de bases de datos) antes de atacar la base de datos, por ejemplo, robando los datos. Para evitar esto, se recomienda que siga los procedimientos que se describen a continuación.

  • Agregue " --skip-show-database" al script de inicio de MySQL o agréguelo al archivo de configuración de MySQL
  • Otorgue el privilegio MOSTRAR BASES DE DATOS solo a los usuarios que desee utilizar este comando

Para deshabilitar el uso del comando "MOSTRAR BASES DE DATOS", se debe agregar el siguiente parámetro en la sección [mysqld] de /etc/my.cnf :

[mysqld]

skip-show-database  

9. Habilitar registro

Si su servidor de base de datos no ejecuta muchas consultas, se recomienda que habilite el registro de transacciones agregando la siguiente línea a la sección [mysqld] de /etc/my.cnf archivo:

[mysqld]

log =/var/log/mylogfile  

Esto no se recomienda para servidores MySQL de gran producción porque provoca una gran sobrecarga en el servidor.
Además, verifique que solo los identificadores "raíz" y "mysql" tengan acceso a estos archivos de registro (al menos acceso de escritura).

Registro de errores Asegúrese de que solo "root" y "mysql" tengan acceso al archivo de registro "hostname.err". El archivo se almacena en el directorio de datos mysql. Este archivo contiene información muy confidencial, como contraseñas, direcciones, nombres de tablas, nombres de procedimientos almacenados y partes del código. Se puede usar para recopilar información y, en algunos casos, puede proporcionar al atacante la información necesaria para explotar la base de datos, la máquina en la que está instalada la base de datos o los datos que contiene.

Registro de MySQL Asegúrese de que solo "root" y "mysql" tengan acceso al archivo de registro "archivo de registro XY". El archivo se almacena en el directorio de datos mysql.

10. Cambiar el directorio raíz

Un chroot en los sistemas operativos UNIX {sistema operativo} es una operación que cambia el directorio raíz del disco aparente para el método de ejecución actual y sus elementos secundarios. Un programa que se vuelve a rootear en un directorio diferente no puede acceder ni nombrar archivos fuera de ese directorio y, por lo tanto, el directorio se denomina "cárcel chroot" o (con menos frecuencia) "prisión chroot".

Al utilizar el entorno chroot, se puede limitar el acceso de escritura de los procesos mySQL (y los procesos secundarios), lo que aumenta la seguridad del servidor.

Asegúrese de que exista un directorio dedicado para el entorno chroot. Esto debería ser algo como:/chroot/mysql Además, para facilitar el uso de las herramientas administrativas de la base de datos, se debe cambiar el siguiente parámetro en la sección [cliente] del archivo de configuración de MySQL:

[cliente]

socket = /chroot/mysql/tmp/mysql.sock

Gracias a esa línea de código, no será necesario proporcionar los comandos mysql, mysqladmin, mysqldump, etc. con el --socket=/chroot/mysql/tmp/mysql.sock parámetro cada vez que se ejecutan estas herramientas.

11. Eliminar registros antiguos periódicamente

Durante los procedimientos de instalación, hay una gran cantidad de datos confidenciales que ayudarán a los usuarios no deseados a asaltar una base de datos. Estos datos se mantienen en el historial del servidor y pueden ser muy útiles si algo sale mal durante la instalación. Al analizar los archivos de historial, los administradores pueden descubrir qué salió mal y probablemente arreglarlo. Sin embargo, estos archivos no son necesarios una vez completada la instalación.
Deberíamos eliminar el contenido del archivo de historial de MySQL (~/.mysql_history), dondequiera que se guarden todos los comandos SQL inactivos (especialmente las contraseñas, que se mantienen como texto sin formato):

cat /dev/null > ~/.mysql\_history

En conclusión, debemos hacer hincapié en la seguridad de la base de datos. Sin embargo, debería ser lo primero para cualquier persona o empresa.