Primeira tentativa de migrar o EC2 MySQL para o Amazon RDS não está indo bem - privilégios SUPER

11

Eu tenho tentado mover um banco de dados existente do MySQL em execução no EC2 para uma nova instância do Amazon RDS (uma experiência para ver se podemos nos mover). Até agora, não está indo bem. Estou preso na importação inicial antes de configurar a replicação (instruções aqui ).

Eu preparei a instância do RDS conforme descrito e posso conectar-me a ela a partir da instância do EC2 usando o mysql. Eu corri o comando mysqldump como:

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

Em seguida, tentou enviá-lo para o RDS com:

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

O primeiro problema foi na linha 22 do dump:

CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;

Esta linha causou o erro ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation . Não tem problema, apenas comentou essa linha e espero consertá-la depois via mysql.rds_set_external_master (). Repetiu o upload e recebeu um erro muito semelhante: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation . A seção em torno da linha 7844 é assim:

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

Ao comentar as duas primeiras linhas e adicionar um 'CREATE' ao terceiro, consegui passar por essa. Mas existem toneladas de seções como esta. Existe alguma maneira de contornar isso sem toda a edição? Como uma opção para mysqldump para não produzir nada que precise de privilégios SUPER?

Parece que muitas pessoas tiveram problemas semelhantes, como ter que executar sed na saída do mysqldump / mysqlbinlog! Também vou postar no fórum da AWS - realmente acho que o RDS deve ter uma maneira mais tolerante de importar do mysqldump, ou uma ferramenta específica que pode ser executada em um db existente para criar um dump que seja reclamação com a segurança do RDS. Só queria saber se alguém tinha outras receitas ou truques que possam ajudar aqui.

Obrigado,

Dave

    
por dsl101 19.11.2013 / 11:50

2 respostas

26

Você provavelmente precisará de log_bin_trust_function_creators = 1 no RDS, mas esse não é o problema aqui.

You can specify a DEFINER value other than your own account only if you have the SUPER privilege.

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

Quando um programa armazenado (proc, function, event ou trigger) está em execução, tudo o que ele faz tem as permissões do usuário que o definiu ou do usuário explicitamente declarado com uma declaração DEFINER . Isso permite, entre outras coisas, que os programas armazenados permitam que outros usuários façam coisas com dados que eles não têm permissão para manipular diretamente, desde que tenham permissão para usar o próprio programa armazenado.

Seria uma vulnerabilidade séria, então, se um usuário que não fosse SUPER pudesse criar um procedimento com um definidor arbitrário, porque o usuário poderia escalonar seus privilégios à vontade.

Isso também vale para as visualizações, é claro, quando o contexto de segurança definidor é usado, como no exemplo que você postou.

Uma das maiores reclamações que tenho com o RDS é que você não pode ter SUPER ... e agora ele pode ser um dos seus também :) porque esse fato é a causa do problema que você está tendo.

É claro que, se eu estivesse executando um serviço MySQL gerenciado, também não daria a ninguém SUPER , portanto seu modelo de segurança faz sentido, mesmo que às vezes seja difícil de gerenciar.

Se todos os seus objetos tiverem o mesmo definidor, uma solução alternativa seria restaurar o despejo usando essa conta em vez da que você está usando agora, mas isso parece improvável.

Excluir apenas a linha com a declaração DEFINER deve fazer o dumpfile funcionar nos casos em que ela aparece em uma linha sozinha, ou você pode usar sed ou perl para modificar o arquivo ... uma ideia que eu já conheço não gostei muito, mas é realmente uma coisa legal sobre o MySQL que tal hackery é bastante legítimo, e não realmente muito distante dos tipos de coisas que eu tenho que fazer como um DBA mesmo em um ambiente não-RDS. / p>

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

... possivelmente não é a resposta que você esperava, mas você pode executar isso contra o dumpfile e deve acabar com um arquivo um pouco mais utilizável.

    
por 19.11.2013 / 13:39
1

No meu caso foi a linha "CHANGE MASTER TO MASTER_LOG_FILE = ..." no despejo que estava me dando o erro. Esta linha foi adicionada pela opção "--master-data" do mysqldump. No Amazon AWS, você precisa iniciar a replicação definindo os detalhes mestres com o procedimento "mysql.rds_set_external_master", em vez de ler aqui

Então eu só faço anotações daquela linha "head 22 backup.dump" onde a linha 22 relatou o erro. Em seguida, remova-o antes de importar, para o meu arquivo grande eu uso: "sed '22d' backup.dump > backup_clean.dump"

    
por 22.07.2014 / 18:46