Usuario de Base de Datos MySQL: ¿Qué Privilegios son Necesarios?

6 ene 2011, 14:53:46
Vistas: 82.3K
Votos: 62

Las instrucciones breves de instalación de WordPress ("5 Minutos") establecen que:

Crea una base de datos para WordPress en tu servidor web, así como un usuario MySQL que tenga todos los privilegios para acceder y modificarla.

Mientras configuraba un nuevo blog de manera profesional, me preguntaba cómo se relaciona esto con lo que me ofrece la configuración de privilegios/permisos del usuario de la base de datos MySQL:

  • Datos: SELECT, INSERT, UPDATE, DELETE
  • Definición: CREATE, ALTER, DROP
  • Extra: INDEX
  • Otros:
    1. LOCK TABLES
    2. REFERENCES
    3. CREATE TEMPORARY TABLES
    4. CREATE VIEW
    5. SHOW VIEW
    6. CREATE ROUTINE
    7. EXECUTE
    8. ALTER ROUTINE

Estoy bastante seguro sobre los tres primeros grupos, los que nombré como Datos, Definición y Extra aquí. Pero ¿qué hay de los otros bajo la entrada Otros? Normalmente diría que no son necesarios, pero me gustaría obtener una segunda opinión.

0
Todas las respuestas a la pregunta 5
2
46

"Todos los privilegios" generalmente significa que deberías otorgar todo al usuario. Sin embargo...

He encontrado al menos un artículo que afirma que el usuario de MySQL solo necesita:

  • SELECT
  • INSERT
  • UPDATE

Indagando más, descubrí que para operar completamente (actualizaciones automáticas, instalación/desinstalación de plugins, etc.), WordPress requiere algunos permisos adicionales:

  • DELETE
  • ALTER (para actualizaciones)
  • CREATE TABLE
  • DROP TABLE

También, no referenciado pero tiene sentido:

  • INDEX

Pero esos son los únicos dos referencias sólidas que puedo encontrar respaldadas por opiniones publicadas en otros lugares. Aún así, te animo a que te mantengas con GRANT ALL, pero si absolutamente debes limitar el uso de tu base de datos, comienza con estos 7 privilegios y prueba exhaustivamente para asegurarte de que todo funcione como se espera.

6 ene 2011 17:17:25
Comentarios

Gracias por compartir tus pensamientos. Para ese sitio instalado no hice GRANT ALL ya que no es un sitio de desarrollo y en su lugar me mantuve en todos incluyendo INDEX. Se ve bien hasta ahora, creo que lo mantendré monitoreado en los próximos días, es un sitio real que incluye mucho uso de plugins y similares. Para INDEX podría buscar un poco en el núcleo y en el manual de mysql también.

hakre hakre
6 ene 2011 17:33:14

Solo recuerda que los plugins de terceros pueden ejecutar casi cualquier sentencia SQL que deseen... así que asegúrate de evaluarlos adecuadamente antes de instalar cosas que dependan de privilegios que has revocado.

EAMann EAMann
6 ene 2011 17:41:09
2
16

Los demás no son necesarios como indicas.

Por cierto, lo que podrías hacer es configurar condicionalmente el usuario/contraseña basado en la página solicitada. Como en no privilegiado con select/insert/update/delete para uso normal, y privilegiado con cosas relacionadas a definición/índices adicionalmente cuando se visite la página de actualización.

6 ene 2011 18:09:44
Comentarios

¿Existe alguna referencia sobre cómo establecer condicionalmente el usuario/contraseña basado en la página solicitada en un entorno WordPress? TA

superjos superjos
24 ene 2014 20:44:20

@superjos: No que yo conozca de momento, pero la idea general sería definir el usuario normal de la base de datos para select/insert/update/delete en wp-config y, cuando la URL coincida con las páginas relevantes de /wp-admin (probablemente actualizar, activar tema y activar plugin), definir un usuario alternativo que pueda hacer todo lo demás.

Denis de Bernardy Denis de Bernardy
24 ene 2014 21:58:03
1
13

Esto es lo que dice el artículo Reforzando la Seguridad en WordPress sobre restringir los privilegios de usuario de la base de datos:

Para las operaciones normales de WordPress, como publicar entradas de blog, subir archivos multimedia, publicar comentarios, crear nuevos usuarios de WordPress e instalar plugins, el usuario de la base de datos MySQL solo necesita privilegios de lectura y escritura de datos; SELECT, INSERT, UPDATE y DELETE.

Por lo tanto, cualquier otro privilegio de estructura y administración de la base de datos, como DROP, ALTER y GRANT, puede ser revocado. Al revocar estos privilegios, también estás mejorando las políticas de contención.

Nota: Algunos plugins, temas y actualizaciones importantes de WordPress podrían requerir realizar cambios estructurales en la base de datos, como añadir nuevas tablas o modificar el esquema. En tal caso, antes de instalar el plugin o actualizar el software, permite temporalmente al usuario de la base de datos los privilegios necesarios.

https://wordpress.org/support/article/hardening-wordpress/

12 ene 2014 19:09:25
Comentarios

Intento practicar el principio de Mínimo Privilegio siempre que sea posible. La información citada (útil) ya no está en el artículo del Codex enlazado, así que gracias por copiarla aquí.

Anthony Geoghegan Anthony Geoghegan
2 mar 2017 12:38:06
0

En relación a la "Nota" en el post de redburn, el Codex de WordPress también tiene una Advertencia que deberías leer sobre actualizaciones y cambios en el esquema de la base de datos...

(Edición: Sin embargo, noto que YA NO VEO "GRANT" en la lista de privilegios al crear o actualizar un usuario. ¿Quizás "CREATE" debería añadirse a la lista? ¿Alguien tiene información al respecto? -- usando Hostgator cPanel, marzo 2016 --)

ADVERTENCIA:
Intentar actualizaciones sin tener estos privilegios [SELECT, INSERT, UPDATE, DELETE, DROP, ALTER y GRANT] puede causar problemas cuando ocurren cambios en el esquema de la base de datos. Por lo tanto, NO se recomienda revocar estos privilegios. Si sientes la necesidad de hacer esto por razones de seguridad, entonces asegúrate de tener un plan sólido de copias de seguridad, con respaldos regulares de toda la base de datos que hayas comprobado que son válidos y que puedan restaurarse fácilmente. Una actualización fallida de la base de datos generalmente puede solucionarse restaurando la base de datos a una versión anterior, otorgando los permisos adecuados y luego permitiendo que WordPress intente la actualización de la base de datos nuevamente. Restaurar la base de datos la devolverá a esa versión anterior y las pantallas de administración de WordPress detectarán la versión antigua y te permitirán ejecutar los comandos SQL necesarios. La mayoría de las actualizaciones de WordPress no cambian el esquema, pero algunas sí. Solo las actualizaciones principales de versión (por ejemplo, de 3.7 a 3.8) alterarán el esquema. Las actualizaciones menores (de 3.8 a 3.8.1) generalmente no lo harán. No obstante, mantén un respaldo regular.

Codex: http://codex.wordpress.org/Hardening_WordPress

30 mar 2016 09:59:25
0

Mi opinión es la misma que la de @EAMann anteriormente mencionado, así como las fuentes que él referenció: GRANT ALL es necesario para garantizar que tu sitio sea funcional y preparado para el futuro. Incluso en un sitio en producción, deberías intentar seguir el manual del usuario.

Como alguien que contribuye código al núcleo de WordPress y a algunos plugins, te recomiendo que mantengas los privilegios de base de datos predeterminados como se sugiere en el manual del usuario (GRANT ALL PRIVILEGES ON wpdatabasename.* TO "wordpressusername"@"hostname").

El código fuente de WordPress (tanto actual como futuro) asume que el usuario de la base de datos de WordPress tiene todos los privilegios para la base de datos de WordPress correspondiente. Si tu configuración carece de algún privilegio de base de datos, podrías encontrarte con problemas al actualizar WordPress y añadir más plugins.

Así que realmente no deberías usar privilegios de base de datos diferentes a los privilegios predeterminados recomendados por el manual, a menos que sepas lo que estás haciendo, tengas necesidades muy específicas y no olvides que tienes privilegios personalizados.

La página del Codex ha sido actualizada con instrucciones sobre cómo hacer esto, incluyendo ejemplos en varios sistemas y capturas de pantalla. https://codex.wordpress.org/Installing_WordPress#Step_2:_Create_the_Database_and_a_User

Crear un nombre de base de datos y usuario (vía PHPMyAdmin): https://codex.wordpress.org/Installing_WordPress#Using_phpMyAdmin

Crear un nombre de base de datos y usuario (vía cliente de línea de comandos MySQL): https://codex.wordpress.org/Installing_WordPress#Using_the_MySQL_Client

mysql> CREATE DATABASE wpdatabasename;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON wpdatabasename.* TO "wordpressusername"@"hostname"
    -> IDENTIFIED BY "password";
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> EXIT
8 oct 2018 18:42:16