Il primo tentativo di migrare MySQL EC2 su Amazon RDS non sta andando bene - privilegi SUPER


11

Ho cercato di spostare un db esistente da MySQL in esecuzione su EC2 in una nuova istanza di Amazon RDS (un esperimento per vedere se possiamo spostarci). Finora non sta andando bene. Sono bloccato all'importazione iniziale prima di impostare la replica (istruzioni qui ).

Ho preparato l'istanza RDS come descritto e posso collegarmi ad essa dall'istanza EC2 usando mysql. Ho eseguito il comando mysqldump come:

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

Quindi ha tentato di caricarlo su RDS con:

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

Il primo problema era alla riga 22 della discarica:

CAMBIA MASTER IN MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 106;

Questa riga ha causato errori ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. Nessun problema, ho appena commentato quella riga e spero di risolverlo in un secondo momento tramite mysql.rds_set_external_master (). Ritentato l'upload, e ottenuto un errore molto simile: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation. La sezione attorno alla linea 7844 è simile alla seguente:

/*!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` */;

Commentando le prime 2 righe e aggiungendo un "CREATE" alla terza, sono stato in grado di superare questa. Ma ci sono tonnellate di sezioni come questa. C'è un modo per aggirare questo senza tutte le modifiche? Ti piace un'opzione per mysqldumpnon produrre nulla che abbia bisogno dei privilegi SUPER?

Sembra che molte persone abbiano avuto problemi simili, come dover correre sedcontro l'output di mysqldump / mysqlbinlog! Pubblicherò anche sul forum AWS - penso davvero che RDS dovrebbe avere un modo più tollerante di importare da mysqldump, o uno strumento specifico che può essere eseguito contro un db esistente per creare un dump che si lamenta della sicurezza RDS. Mi chiedevo solo se qualcuno avesse altre ricette o trucchi che potrebbero aiutare qui.

Grazie,

Dave


Siamo spiacenti, ho dimenticato di dire che ho provato a modificare il log_bin_trust_function_creatorsparametro su 1, ma ottengo ancora lo stesso errore alla riga 7844.
dsl101

Vecchio post, ma il primo errore che puoi evitare dicendo --masterdata=2. La riga verrà quindi commentata nella discarica.
Halfgaar

Risposte:


26

Probabilmente hai bisogno di log_bin_trust_function_creators= 1 su RDS ma non è questo il problema, qui.

È possibile specificare un  DEFINER valore diverso dal proprio account solo se si dispone del  SUPER privilegio.

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

Quando un programma memorizzato (proc, funzione, evento o trigger) è in esecuzione, tutto ciò che fa ha le autorizzazioni dell'utente che lo ha definito o dell'utente esplicitamente dichiarato con una DEFINERdichiarazione. Ciò consente, tra l'altro, ai programmi memorizzati di consentire ad altri utenti di fare cose con dati che non hanno direttamente il permesso di manipolare, purché abbiano il permesso di usare il programma memorizzato stesso.

Sarebbe una grave vulnerabilità, quindi, se un non SUPERutente potesse creare una procedura con un definitore arbitrario, poiché l'utente potrebbe aumentare i propri privilegi a piacimento.

Questo vale anche per le viste, ovviamente, quando viene utilizzato il contesto di sicurezza definitivo, come nell'esempio che hai pubblicato.

Una delle più grandi lamentele che ho con RDS è che non puoi avere SUPER... e ora può essere anche una delle tue :) perché questo fatto è la causa del problema che stai riscontrando.

Ovviamente, se stessi eseguendo un servizio MySQL gestito, non lo darei nemmeno a nessuno SUPER, quindi il loro modello di sicurezza ha senso, anche se a volte è ingombrante.

Se tutti i tuoi oggetti hanno lo stesso definitore, una soluzione alternativa sarebbe quella di ripristinare il dump usando quell'account invece di quello che stai usando ora, ma sembra improbabile.

L'eliminazione della sola riga con la DEFINERdichiarazione dovrebbe far funzionare il file di dump nei casi in cui appare su una riga da solo, oppure potresti usare sed o perl per modificare il file ... un'idea che so già che non ti piace, ma è davvero una buona cosa su MySQL che un tale hacker sia abbastanza legittimo, e non molto lontano dai tipi di cose che devo fare come DBA anche in un ambiente non RDS.

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

... forse non la risposta che speravi, ma potresti lanciarla contro il tuo dumpfile e dovresti finire con un file leggermente più utilizzabile.


Mille grazie per la risposta esaustiva e per aver confermato ciò che pensavo che sed / perl fosse l'unica soluzione. L'app che sto usando è Joomla altamente personalizzata, e mentre open-source non ho il tempo / le competenze per analizzarlo per capire se si sposterà bene su RDS. Il mio pensiero era "provalo e vedi" - ma sembra che il primo passo sia il più difficile - in gran parte a causa degli strumenti di migrazione inadeguati (a mio avviso). Concordo sul modello di sicurezza, ma se l'output predefinito di mysqldump crea così tanti problemi, perché non hanno una soluzione migliore? Lo chiederò anche a loro.
dsl101,

1
ECCEZIONALE. grazie mille per quello script perl. il mio backup era di 4+ GB e aprirlo era una sfida. questo mi ha salvato la giornata.
Emile Baizel,

1
Grande spiegazione, ottima risposta e ottima soluzione! Definitore stupido.
rkaregaran,

4
Grazie mille per il tuo perl one liner. È l'unico che sono stato in grado di trovare che funziona davvero. Molti altri su queste schede semplicemente non lo fanno. Vorrei nuovamente votare se potessi.
lucian303,

1

Nel mio caso c'era la riga "CHANGE MASTER TO MASTER_LOG_FILE = ..." nella discarica che mi stava dando l'errore. Questa riga è stata aggiunta dall'opzione "--master-data" di mysqldump. In Amazon AWS devi avviare la replica impostando i dettagli principali con la procedura "mysql.rds_set_external_master" invece leggi qui

Quindi ho appena preso appunti di quella riga "head 22 backup.dump" in cui la riga 22 riportava l'errore. Quindi rimuoverlo prima dell'importazione, per il mio file di grandi dimensioni che uso: "sed '22d' backup.dump> backup_clean.dump"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.