Solucionando problemas con secure-file-priv
Al iniciar un servidor de mysql, se pueden especificar las opciones del programa en el archivo de opciones o por terminal. Estas opciones están destinadas a desbloquear otras funciones de MySQL, cambiar variables o imponer restricciones.
Así es como se leen las opciones en el servidor MySQL:
- mysqld lee las opciones de los grupos
[mysqld]
y[server]
- mysqld_safe lee las opciones de los grupos
[mysqld]
,[server]
,[mysqld_safe]
y[safe_mysqld]
- mysql.server lee las opciones de los grupos
[mysqld]
y[mysql.server]
.
Se puede ver un breve resumen de las opciones admitidas por MySQL usando:
$ mysqld - help
Para ver la lista completa, con este comando:
$ mysqld --verbose --help
Una de esas variables del sistema que se pueden configurar al iniciar el servidor es mysqld_secure-file-priv
¿Qué es y que hace la variable mysqld_secure-file-priv ?
La variable secure_file_priv
se usa para limitar el impacto de las operaciones de importación y exportación de datos. Ejemplo de las operaciones afectadas son las realizadas por las SELECT ... INTO OUTFILE
LOAD DATA
y SELECT ... INTO OUTFILE
y la función LOAD_FILE()
. Estas operaciones están permitidas solo para usuarios que tienen el privilegio de FILE
.
Para ver la configuración actual en tiempo de ejecución, use se puede usar un SHOW VARIABLES;
.
Accede por shell a MySQL como usuario root
$ mysql -u root -p
Ejecuta el siguiente comando
mysql> SHOW VARIABLES LIKE "secure_file_priv"; +------------------+-----------------------+ | Variable_name | Value | +------------------+-----------------------+ | secure_file_priv | /var/lib/mysql-files/ | +------------------+-----------------------+ 1 row in set Time: 0.023s
Aquí puedes ver el directorio donde esta configurado /var/lib/mysql-files/
Cambiando el directorio de la variable secure-file-priv
Este valor se puede cambiar en el archivo de opciones de MySQL en la sección [mysqld].
sudo vim /etc/my.cnf
Establecer la variable en la sección [mysqld]
[mysqld]
secure-file-priv=/mysqlfiles
Luego crea el directorio configurado
sudo mkdir /mysqlfiles sudo chown -R mysql:mysql /mysqlfiles/
Reinicia el servicio MySQL para que los cambios surtan efecto.
sudo systemctl restart mysqld
Vuelve a iniciar sesión para confirmar la nueva configuración
mysql> SHOW VARIABLES LIKE "secure_file_priv"; +------------------+--------------+ | Variable_name | Value | +------------------+--------------+ | secure_file_priv | /mysqlfiles/ | +------------------+--------------+ 1 row in set (0.00 sec)
Vamos a probar para confirmar que podemos exportar a la ruta especificada.
mysql> SELECT * FROM information_schema.processlist into outfile '/tmp/mysql_processes.txt'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
Intentemos de nuevo escribiendo para corregir la ruta.
mysql> SELECT * FROM information_schema.processlist into outfile '/mysqlfiles/mysql_processes.txt'; Query OK, 1 row affected (0.00 sec)
Deshabilitar la variable secure-file-priv
Para deshabilitarlo, establezca la variable en un valor NULO.
[mysqld]
secure-file-priv = ""
Reiniciamos de nuevo mysqld
sudo systemctl restart mysqld
Confirmamos después de reiniciar el servicio
mysql> SHOW VARIABLES LIKE "secure_file_priv"; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | secure_file_priv | | +------------------+-------+ 1 row in set (0.00 sec)
Intenta guardar el contenido de QUERY en una ruta diferente
mysql> SELECT * FROM information_schema.processlist into outfile '/tmp/mysql_processes.txt'; Query OK, 1 row affected (0.00 sec)
Con esto hemos aprendido a configurar la variable secure-file-priv
para adaptarse al uso que queramos darle.