Error ‘not found’ en la carga de un fichero con init-file de MySQL

De vez en cuando recurro a este mecanismo de MySQL para cambiar la contraseña del administrador.

En las distribuciones que tengan activo apparmor es muy probable que no funcione (dependerá, como vamos a ver, de la configuración apparmor) dando el error (que encontraremos en /var/log/mysql/error.log):

[ERROR] /usr/sbin/mysqld: File '/path_al_fichero/nuevopasswd.sql' not found (Errcode: 13)

(obviamente, estoy suponiendo que el fichero existe y tenemos permisos de lectura 😉 )

El error, como ya podéis imaginar, está provocado por apparmor y, para conseguir nuestro objetivo (ejecutar el fichero para cambiar la contraseña) debemos habilitar la ejecución del guión. Para ello:

  • En el fichero /etc/apparmor.d/usr.sbin.mysqld añadimos la orden ‘/path_al_fichero/*.sql r, ‘ dentro de las opciones de MySQLCaptura de pantalla de 2015-07-03 16:44:08
  • Reiniciamos apparmor: /etc/init.d/apparmor reload
  • Reiniciamos MySQL: /etc/init.d/mysql restart

¡Espero que os sea útil!

PD: La imagen no representa el fichero /etc/apparmor.d/usr.sbin.mysqld completo; donde están los ‘……’  hay otras opciones necesarias para que convivan apparmor y MySQL.


ownCloud y Raspberry PI

Tras un aviso de Dropbox para que reduzca los muchísimos GB que me sobran al haber “caducado la oferta” por pertenecer a la UA, he decidio crearme mi “ownCloud” con un disco duro de 1TB que tenía y una Raspberry PI.

Sobre como instalarlo hay muchas entradas en la red (I, II, III, IV,  …) así que poco más que añadir o comentar, salvo:

Leer más


Deshabilitar la carga de ficheros en MySQL

Un posible ataque que se puede realizar contra cualquier aplicación web y, por extensión, contra el gestor de base de datos y el sistema donde este corre, son las SQLi. Sí, al sistema operativo, también. ¿Cómo? Pues, aprovechando una SQLi descubierta, intentar descargar ficheros críticos del sistema. Qué ficheros se podrá cargar dependerá del usuario con el que se esté ejecutando el demonio del gestor de base de datos. Es decir, podrá descargar aquellos para los que tenga permisos de lectura (y /etc/passwd lo puede leer cualquier usuario, ¡recuérdalo!)

Para evitar la fuga de información crítica de nuestro sistema, podemos:

  1. Como buena práctica recomendada para todos los servicios, ejecutar el demonio con un usuario con los mínimos permisos necesarios.
  2. Otra buena práctica recomendada: “enjaular el servicio” Con chroot impedir el acceso al sistema de archivos de nuestro sistema.
  3. Y el caso que nos ocupa: Dehabilitar la carga del ficheros en el gestor. Para el caso del MySQL en /etc/mysql/my.cnf, escribiremos

[mysqld]

local-infile=0

secure-file-priv=/dev/null

Si queremos hacerlo solo para determinados usuarios (los que usan nuestra aplicación web para conectarse a la base de datos son unos excelentes candidatos 😉 ), basta con revocar el privilegio file_priv a esos usuarios:

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    FROM user [, user] ...
FLUSH PRIVILEGES;

Referencias


Páginas lentas

Al igual que MySQL nos proporciona información sobre consultas lentas, con Apache, podemos registrar el tiempo de servicio de las páginas simplemente modificando el formato de los eventos que guarda.
Así, con

LogFormat “%h %P %l %u ””%r” %>s %b “%{Referer}i” “%{User-Agent}i” tiempo: %T segundos”

tendremos guardado el tiempo de servicio en segundos (es decir, basta con añadir %T al formato que tengamos. En este caso, también he añadido texto que facilite un control posterior que analice esa información en los “logs” del sistema. Así podremos lanzar avisos a los administradores y/o programadores para que miren qué pasa con esa “slow page“.

Solo queda un detalle atener en cuenta: si la página no se sirve, por lo que sea,  no se escribirá nada en el log ya que éste es el último paso que realiza Apache.

Más información sobre los formatos de log de Apache en http://httpd.apache.org/docs/2.0/es/mod/mod_log_config.html#formats


Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más información.