El primer intento de migrar EC2 MySQL a Amazon RDS no funciona bien: privilegios SUPER

11

He estado tratando de mover un db existente de MySQL que se ejecuta en EC2 a una nueva instancia de Amazon RDS (un experimento para ver si podemos movernos). Hasta ahora, no va bien. Estoy atascado en la importación inicial antes de configurar la replicación (instrucciones aquí ).

He preparado la instancia RDS como se describe y puedo conectarme a ella desde la instancia EC2 usando mysql. Ejecuté el comando mysqldump como:

mysqldump --master-data --databases db1 db2 > dump.sql

Luego intenté subirlo a RDS con:

mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql

El primer problema estaba en la línea 22 del basurero:

CAMBIAR MASTER A MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;

Esta línea causó un error ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. No hay problema, solo comenté esa línea y espero arreglarla más tarde a través de mysql.rds_set_external_master (). Juzgados de la carga, y consiguió un error muy similar: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. La sección alrededor de la línea 7844 se ve así:

/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`dev`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `jos_contributor_ids_view` AS select `jos_resource_contributors_view`.`uidNumber` AS `uidNumber` from `jos_resource_contributors_view` union select `jos_wiki_contributors_view`.`uidNumber` AS `uidNumber` from `jos_wiki_contributors_view` */;

Al comentar las primeras 2 líneas y agregar un 'CREAR' a la tercera, pude superar esta. Pero hay toneladas de secciones como esta. ¿Hay alguna forma de evitar esto sin toda la edición? ¿Te gusta una opción para mysqldumpno producir nada que necesite SUPER privilegios?

¡Parece que muchas personas han tenido problemas similares, como tener que correr sedcontra la salida de mysqldump / mysqlbinlog! También voy a publicar en el foro de AWS, realmente creo que RDS debería tener una forma más tolerante de importar desde mysqldump, o una herramienta específica que se pueda ejecutar contra un db existente para crear un volcado que es una queja con la seguridad de RDS. Me preguntaba si alguien tenía otras recetas o trucos que pudieran ayudar aquí.

Gracias,

Dave

dsl101
fuente
Lo sentimos, olvidé decir que he intentado cambiar el log_bin_trust_function_creatorsparámetro a 1, pero sigo teniendo el mismo error en la línea 7844.
dsl101
Publicación anterior, pero el primer error que puede evitar diciendo --masterdata=2. La línea se comentará en el volcado.
Halfgaar

Respuestas:

26

Es probable que necesite log_bin_trust_function_creators= 1 en RDS, pero ese no es el problema, aquí.

Puede especificar un  DEFINER valor que no sea su propia cuenta solo si tiene el  SUPER privilegio.

- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html

Cuando se ejecuta un programa almacenado (proc, función, evento o desencadenador), todo lo que hace tiene los permisos del usuario que lo definió o del usuario que se declara explícitamente con una DEFINERdeclaración. Esto permite, entre otras cosas, que los programas almacenados permitan a otros usuarios hacer cosas con datos que no tienen permiso directo para manipular, siempre que tengan permiso para usar el programa almacenado.

Sería una grave vulnerabilidad, entonces, si un no SUPERusuario pudiera crear un procedimiento con un definidor arbitrario, porque el usuario podría escalar sus privilegios a voluntad.

Esto también se aplica a las vistas, por supuesto, cuando se utiliza el contexto de seguridad definitivo, como en el ejemplo que publicó.

Una de las mayores quejas que tengo con RDS es que no puede tener SUPER... y ahora también puede ser una de las suyas :) porque ese hecho es la causa del problema que está teniendo.

Por supuesto, si estuviera ejecutando un servicio MySQL administrado, tampoco le daría a nadie SUPER, por lo que su modelo de seguridad tiene sentido, incluso si a veces es difícil de manejar.

Si todos sus objetos tienen el mismo definidor, una solución sería restaurar el volcado usando esa cuenta en lugar de la que está usando ahora, pero eso parece poco probable.

Eliminar solo la línea con la DEFINERdeclaración debería hacer que el archivo de volcado funcione en los casos en que aparece en una línea por sí solo, o podría usar sed o perl para modificar el archivo ... una idea que ya sé que no le gusta, pero es realmente bueno acerca de MySQL que tal piratería es bastante legítima, y ​​no está tan lejos del tipo de cosas que tengo que hacer como DBA incluso en un entorno que no es RDS.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < oldfile.sql > newfile.sql

... posiblemente no sea la respuesta que esperaba, pero podría ejecutarla contra su archivo de volcado y debería terminar con un archivo un poco más utilizable.

Michael - sqlbot
fuente
Muchas gracias por la respuesta integral y por confirmar lo que pensaba sobre sed / perl como la única solución. La aplicación que estoy usando es Joomla altamente personalizada, y aunque es de código abierto, no tengo el tiempo / la habilidad para analizarla para determinar si se moverá bien a RDS. Mi pensamiento era 'pruébalo y verás', pero parece que el primer paso es el más difícil, en gran parte debido a las herramientas de migración inadecuadas (en mi opinión) de Amazon. Estoy de acuerdo con el modelo de seguridad, pero si la salida predeterminada de mysqldump crea tantos problemas, ¿por qué no tienen una mejor solución? También les preguntaré esto a ellos.
dsl101
1
INCREÍBLE. Muchas gracias por ese guión perl. mi copia de seguridad tenía más de 4 GB y solo abrirlo fue un desafío. Esto me salvó el día.
Emile Baizel
1
¡Gran explicación, gran respuesta y gran solución! Estúpido definidor.
rkaregaran
44
Muchas gracias por tu perl one liner. Es el único que he podido encontrar que realmente funciona. Muchos otros en estos tableros simplemente no lo hacen. Votaría de nuevo si pudiera.
lucian303
1

En mi caso fue la línea "CHANGE MASTER TO MASTER_LOG_FILE = ..." en el volcado que me estaba dando el error. Esta línea fue agregada por la opción "--master-data" de mysqldump. En Amazon AWS, debe iniciar la replicación configurando los detalles maestros con el procedimiento "mysql.rds_set_external_master" en su lugar, lea aquí

Así que solo tomé notas de esa línea "head 22 backup.dump" donde la línea 22 informó en el error. Luego elimínelo antes de importar, para mi archivo grande uso: "sed '22d' backup.dump> backup_clean.dump"

Igor Toma
fuente