Administración de Moodle (Parte 2) – Actualización

Lo siguiente se debe tener en cuenta al momento de una actualización a versiones a partir de la 3.3+, y varias de las consideraciones son útiles también para nuevas instalaciones.

Primero, se aconseja fuertemente agregar una clave de actualización al archivo config.php, así:

$CFG->upgradekey = 'acá una clave larga que solamente conozca quien actualiza';

Además, siempre colocar en mantenimiento la plataforma antes de una actualización. Incluso, es útil hacer el cambio en el Apache para que la plataforma no se cargue sino que en su lugar se cargue una página temporal anunciando la actualización y acceder a la plataforma para la actualización con una clave de seguridad HTTP o mediante intercambio de IP/Dominio.

Ajustar el motor de base de datos

En MySQL la configuración se realiza en el archivo /etc/my.cfg. Aunque en algunos casos la configuración nativa puede ser diferente y es viable hacer la configuración únicamente para la base de datos de Moodle, en general se recomienda la siguiente configuración.

[client]
    default-character-set = utf8mb4
    
    [mysqld]
    innodb_file_format = Barracuda
    innodb_file_per_table = 1
    innodb_large_prefix
    
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    skip-character-set-client-handshake
    
    [mysql]
    default-character-set = utf8mb4

Nota: si se cambia alguno de los parámetros, se requiere reiniciar el servidor de BD.
Para validar si se tomaron correctamente los cambios, ejecutar en el cliente de MySQL:

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

Importante: validar que no hayan usuarios de base de datos con conexiones desde lugares externos o incluso usuarios sin protección de contraseña.

Operaciones sobre la base de datos

Exportar estructura:

mysqldump -d -u usuariobd -p nombrebd > nombrebd_20180102_estructura.sql

Cuando se exporta la estructura, se debe cambiar el tipo de tablas estableciéndolas en ROW_FORMAT=Compressed en el archivo generado. Además, en caso de que aplique, cambiar CHARSET=utf8 a CHARSET=utf8mb4 y COLLATE = utf8_unicode_ci a COLLATE = utf8mb4_unicode_ci.

Exportar datos:

mysqldump --no-create-info --skip-triggers -u usuariobd -p nombrebd > nombrebd_20180102_datos.sql

Cambiar character set de estructura y de BD:

ALTER DATABASE nombrebd DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Borrar la base de datos y crearla con utf8mb4_unicode_ci

DROP DATABASE nombrebd;
    CREATE DATABASE nombrebd DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    GRANT ALL ON nombrebd.* TO 'usuariobd'@'localhost';

Importar la estructura a la base de datos:

mysql -u usuariobd -p nombrebd < nombrebd_20180102_estructura.sql

Importar los datos:

mysql -u usuariobd -p nombrebd < nombrebd_20180102_datos.sql

Después de actualizar

  1. Validar los permisos sobre los archivos, tanto los fuentes como los de datos

  2. Revisar parámetros de configuración

  3. Actualizar registro de la plataforma en moodle.org (recomendado)

  4. Eliminar temas sobrantes, en caso de que perduren

  5. Quitar el modo mantenimiento o regresar el sitio a su estado natural

Permisos sobre los archivos

Una de las vulnerabilidades que más se ataca en las plataformas web es aquella que aprovecha la posibilidad de crear o modificar los archivos fuentes. El primer paso para evitar este comportamiento es limitar los permisos de modificación de los archivos fuentes para el usuario que ejecuta el servidor web. Normalmente basta con asignar permisos 755 o 750 sobre todos los archivos, manteniendo como dueño de los mismos al usuario root u otro usuario especial del sistema y manteniendo en el grupo al usuario Apache.

Nota: lo anterior hace que la instalación y actualización de componentes desde la interfaz de Moodle no sea posible.
Un archivo que merece una atención especial es el config.php, dicho archivo debe tener permisos de lectura únicamente por el usuario principal y el Apache, es decir, no debe tener permisos de lectura para otros usuarios osea que el máximo nivel de permisos debe ser 750. Lo anterior se debe a que en dicho archivo se encuentran las datos de acceso a la base de datos.

En sistemas operativos como Centos, existen niveles adicionales de protección para determinar qué archivos pueden ser ejecutados por el servidor web y es necesaria la configuración para que puedan ejecutarse. Para ello se utiliza un comando como el siguiente:

sudo chcon -Rv --type=httpd_sys_content_t <ruta-fuentes-moodle>

Por otro lado, el directorio de datos de Moodle debe tener permisos de escritura para el usuario Apache por lo que lo normal son permisos 770 o 775, manteniendo al Apache en el grupo propietario. Además, dicho directorio debe estar en una ruta donde no se pueda acceder vía web, sin importar la protección del .htaccess que en algunos casos puede estar deshabilitada y poner en riesgo dichos archivos.

Nuevos componentes

La instalación de nuevos componentes es algo sencillo en Moodle y puede realizarse de dos maneras:

  1. Mediante la interfaz de Moodle, en: Administración del sitio > Extensiones > Instalar módulos externos. Para esta opción es necesario que el usuario del sistema operativo que ejecuta Moodle (normalmente Apache o www-data) tenga permisos de escritura sobre los fuentes de la plataforma, por ello esta opción no es recomendable.

  2. Subiendo los archivos al servidor y ubicándolos en la ruta adecuada. Esta es la opción recomendable, pero se debe tener en cuenta una buena asignación de los permisos sobre los archivos para no dejar expuesta la plataforma.

    En Moodle existen muchos tipos de componentes a diferentes niveles1, incluso muchos componentes suelen tener internamente otros tipos de componentes. Es importante identificar de qué tipo de componente se trata y en qué ruta se debe copiar, normalmente esa información se encuentra revisando la documentación del componente, pero también puede ser de utilidad apoyarse del instalador de la opción 1 que aunque no esté habilitado hace un chequeo de los directorios y en ese caso es útil para saber en que ruta del servidor copiar un componente.