MySQL es un sistema de base de datos relacional multiplataforma totalmente conectado en red y un sistema de gestión de bases de datos distribuido con una arquitectura cliente/servidor. MySQL es un sistema de base de datos relacional multiplataforma totalmente conectado en red y un sistema de gestión de bases de datos distribuido con una arquitectura cliente/servidor. Tiene las ventajas de funciones potentes, fácil uso, administración conveniente, velocidad de ejecución rápida, gran seguridad y confiabilidad. Los usuarios pueden usar muchos lenguajes para escribir programas para acceder a la base de datos MySQL, especialmente cuando se combina con PHP, es un. combinación dorada y es muy utilizada.
Dado que MySQL es una base de datos multiplataforma, su configuración predeterminada debe considerarse aplicable en diversas situaciones, por lo que se debe realizar un mayor refuerzo de seguridad en nuestro propio entorno de uso. Como administrador del sistema MySQL, somos responsables de mantener la seguridad e integridad de los datos del sistema de base de datos MySQL.
La configuración de seguridad de la base de datos MySQL debe partir de dos aspectos, la seguridad interna del sistema y la seguridad de la red externa. Además, también presentaremos brevemente algunos problemas y consejos a los que prestar atención al programar.
Seguridad interna del sistema
Primero, introduzcamos brevemente la estructura del directorio de la base de datos MySQL. Después de instalar MySQL, el directorio de datos y la base de datos se inicializarán después de ejecutar el script mysql_db_install. Si utilizamos el paquete de código fuente MySQL para instalar y el directorio de instalación es /usr/local/mysql, entonces el directorio de datos generalmente será /usr/local/mysql/var. Un sistema de base de datos consta de una serie de bases de datos, cada una de las cuales contiene una serie de tablas de bases de datos. MySQL usa el nombre de la base de datos para crear un directorio de base de datos en el directorio de datos. Cada tabla de la base de datos usa el nombre de la tabla de la base de datos como nombre de archivo, y tres archivos con las extensiones MYD, MYI y frm se colocan en el directorio de la base de datos.
La tabla de autorización de MySQL proporciona un control de permisos flexible para el acceso a la base de datos, pero si el usuario local tiene permisos de lectura para el archivo de la biblioteca, el atacante solo necesita empaquetar y copiar el directorio de la base de datos y luego copiarlo a su propio directorio de datos para obtener acceso al robo. bases de datos. Por lo tanto, la seguridad del host donde se encuentra MySQL es el tema más importante. Si el host no es seguro y no está controlado por atacantes, entonces no se puede discutir la seguridad de MySQL. El segundo es la seguridad del directorio de datos y los archivos de datos, que es la cuestión de la configuración de permisos.
A juzgar por algunas versiones binarias antiguas del sitio principal de MySQL, el atributo del directorio de datos en la versión 3.21.xx es 775, lo cual es muy peligroso. Cualquier usuario local puede leer el directorio de datos, por lo que el archivo de la base de datos es muy inseguro. El atributo del directorio de datos en la versión 3.22.xx es 770. Este atributo también es algo peligroso. Los usuarios locales del mismo grupo pueden leer y escribir, por lo que los archivos de datos no son seguros. El atributo del directorio de datos en la versión 3.23.xx es 700, lo cual es mejor. Solo el usuario que inicia la base de datos puede leer y escribir el archivo de la base de datos, lo que garantiza la seguridad de los archivos de datos locales.
Si el usuario que inicia la base de datos MySQL es mysql, entonces los siguientes directorios y archivos son seguros. Preste atención al directorio de datos y a los siguientes atributos:
shell>ls -l /usr/local/mysql
total 40
drwxrwxr-x 2 raíz raíz 4096 27 de febrero 20:07 bin
drwxrwxr-x 3 raíz raíz 4096 27 de febrero 20:07 incluir
drwxrwxr-x 2 raíz raíz 4096 27 de febrero 20:07 info
drwxrwxr-x 3 raíz raíz 4096 27 de febrero 20:07 lib
drwxrwxr-x 2 raíz raíz 4096 27 de febrero 20:07 libexec
drwxrwxr-x 3 raíz raíz 4096 27 de febrero 20:07 hombre
drwxrwxr-x 6 raíz raíz 4096 27 de febrero 20:07 mysql-test
drwxrwxr-x 3 raíz raíz 4096 27 de febrero 20:07 compartir
drwxrwxr-x 7 raíz raíz 4096 27 de febrero 20:07 sql-bench
drwx------ 4 mysql mysql 4096 27 de febrero 20:07 var
shell>ls -l /usr/local/mysql/var
total 8
drwx------ 2 mysql mysql 4096 27 de febrero 20:08 mysql
drwx------ 2 mysql mysql 4096 27 de febrero 20:08 prueba
shell>ls -l /usr/local/mysql/var/mysql
total 104
-rw------- 1 mysql mysql 0 27 de febrero 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 27 de febrero 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 27 de febrero 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 27 de febrero 20:08 db.MYD
-rw------- 1 mysql mysql 3072 27 de febrero 20:08 db.MYI
-rw------- 1 mysql mysql 8982 27 de febrero 20:08 db.frm
-rw------- 1 mysql mysql 0 27 de febrero 20:08 func.MYD
-rw------- 1 mysql mysql 1024 27 de febrero 20:08 func.MYI
-rw------- 1 mysql mysql 8641 27 de febrero 20:08 func.frm
-rw------- 1 mysql mysql 0 27 de febrero 20:08 host.MYD
-rw------- 1 mysql mysql 1024 27 de febrero 20:08 host.MYI
-rw------- 1 mysql mysql 8958 27 de febrero 20:08 host.frm
-rw------- 1 mysql mysql 0 27 de febrero 20:08 tablas_priv.MYD
-rw------- 1 mysql mysql 1024 27 de febrero 20:08 tablas_priv.MYI
-rw------- 1 mysql mysql 8877 27 de febrero 20:08 table_priv.frm
-rw------- 1 mysql mysql 428 27 de febrero 20:08 usuario.MYD
-rw------- 1 mysql mysql 2048 27 de febrero 20:08 usuario.MYI
-rw------- 1 mysql mysql 9148 27 de febrero 20:08 usuario.frm
Si los propietarios y atributos de estos archivos no son así, utilice los dos comandos siguientes para corregirlo:
shell>chown -R mysql.mysql /usr/local/mysql/var
shell>chmod -R go-rwx /usr/local/mysql/var
Usar el usuario root para iniciar servicios remotos siempre ha sido un tabú de seguridad, porque si hay un problema con el programa de servicio, es muy probable que un atacante remoto obtenga el control total del host. MySQL ha realizado cambios menores desde la versión 3.23.15. De forma predeterminada, el usuario de MySQL debe iniciar el servicio después de la instalación y el usuario root no puede iniciarlo. Si debe utilizar el usuario root para comenzar, debe agregar el parámetro --user=root (./safe_mysqld --user=root &). Debido a que hay declaraciones SQL de LOAD DATA INFILE y SELECT... INTO OUTFILE en MySQL, si el usuario root inicia el servidor MySQL, entonces el usuario de la base de datos tiene el permiso de escritura del usuario root. Sin embargo, MySQL todavía tiene algunas restricciones. Por ejemplo, LOAD DATA INFILE solo puede leer archivos legibles globalmente y SELECT... INTO OUTFILE no puede sobrescribir archivos existentes.
Los archivos de registro locales no se pueden ignorar, incluidos los registros de shell y los propios registros de MySQL. Para mayor comodidad al iniciar sesión localmente o hacer una copia de seguridad de la base de datos, algunos usuarios a veces incluyen directamente la contraseña de la base de datos en los parámetros de la línea de comando, como por ejemplo:
shell>/usr/local/mysql/bin/mysqldump -uroot -ptest prueba>test.sql
shell>/usr/local/mysql/bin/mysql -uroot -ptest
El shell registrará estos comandos en el archivo histórico. Por ejemplo, bash escribirá el archivo .bash_history en el directorio del usuario. Si estos archivos se leen accidentalmente, se filtrará la contraseña de la base de datos. MySQL también registrará los comandos SQL ejecutados después de que el usuario inicie sesión en la base de datos en el archivo .mysql_history en el directorio del usuario. Si el usuario de la base de datos cambia la contraseña de la base de datos mediante declaraciones SQL, también se filtrará a través del archivo .mysql_history. Por lo tanto, no debemos agregar la contraseña directamente después de -p durante el inicio de sesión y la copia de seguridad del shell, sino ingresar la contraseña de la base de datos después del mensaje.
Además, no debemos dejar que estos dos archivos registren nuestras operaciones, por si acaso.
shell>rm .bash_history .mysql_history
shell>ln -s /dev/null .bash_history
shell>ln -s /dev/null .mysql_history
Estos dos comandos vinculan estos dos archivos a /dev/null, por lo que nuestras operaciones no se registrarán en estos dos archivos.
Seguridad de la red externa
Una vez instalada la base de datos MySQL, la tabla de usuarios en la plataforma Unix se ve así:
mysql> usar mysql;
Base de datos cambiada
mysql> seleccione Host, Usuario, Contraseña, Select_priv, Grant_priv del usuario;
+-----------+------+----------+-------------+----- -------+
| Anfitrión | Usuario | Contraseña | Select_priv |
+-----------+------+----------+-------------+----- -------+
| servidor local | raíz | Y |
| sombrero rojo | raíz | y |
| servidor local |
| sombrero rojo |
+-----------+------+----------+-------------+----- -------+
4 filas en conjunto (0,00 seg)
La tabla de usuarios en la plataforma Windows se ve así:
mysql> usar mysql;
Base de datos cambiada
mysql> seleccione Host, Usuario, Contraseña, Select_priv, Grant_priv del usuario;
+-----------+------+----------+-------------+----- -------+
| Anfitrión | Usuario | Contraseña | Select_priv |
+-----------+------+----------+-------------+----- -------+
| servidor local | raíz | Y |
|
| servidor local |
|
+-----------+------+----------+-------------+----- -------+
4 filas en conjunto (0,00 seg)
Primero veamos la tabla de usuarios en la plataforma Unix. Entre ellos, redhat es solo el nombre de mi máquina de prueba, por lo que, de hecho, MySQL en la plataforma Unix solo permite que esta máquina se conecte a la base de datos de forma predeterminada. Sin embargo, la contraseña predeterminada del usuario root está vacía, por lo que la máxima prioridad es agregar una contraseña al usuario root. Hay tres formas de agregar una contraseña a un usuario de base de datos:
1) Utilice el comando mysqladmin en el símbolo del shell para cambiar la contraseña del usuario root:
shell>mysqladmin -prueba de contraseña uroot
De esta forma se cambia la contraseña del usuario root de la base de datos MySQL para realizar la prueba. (La prueba es solo un ejemplo. La contraseña que realmente usamos no debe usar una contraseña débil tan fácil de adivinar)
2) Utilice establecer contraseña para modificar la contraseña:
mysql> establecer contraseña para root@localhost=contraseña('prueba' );
En este momento, la contraseña del usuario root se cambia para probar.
3) Modifique directamente la contraseña del usuario root de la tabla de usuarios:
mysql> usar mysql;
mysql> actualizar usuario establecido contraseña=contraseña('prueba') donde usuario='raíz';
mysql> privilegios de vaciado;
De esta forma también se ha cambiado la contraseña del usuario root de la base de datos MySQL para realizar pruebas. El último comando, vaciar privilegios, significa actualizar a la fuerza la tabla de autorización de memoria. De lo contrario, se seguirá utilizando la contraseña en el caché. En este momento, los usuarios ilegales también pueden iniciar sesión con el usuario root y una contraseña vacía hasta el servidor MySQL. se reinicia.
También vemos el usuario anónimo cuyo usuario está vacío. Aunque no tiene permisos bajo la plataforma Unix, debemos eliminarlo por razones de seguridad:
mysql> eliminar del usuario donde usuario='';