Первая попытка перенести EC2 MySQL на Amazon RDS не удалась - СУПЕР привилегии
Я пытался переместить существующую базу данных из MySQL, работающую на EC2, в новый экземпляр Amazon RDS (эксперимент, чтобы увидеть, сможем ли мы перейти). Пока что все идет не очень хорошо. Я застрял при первоначальном импорте до настройки репликации (инструкции здесь).
Я подготовил экземпляр RDS, как описано, и могу подключиться к нему из экземпляра EC2 с помощью mysql. Я выполнил команду mysqldump как:
mysqldump --master-data --databases db1 db2 > dump.sql
Затем попытался загрузить его в RDS с помощью:
mysql -h RDSHost -P 3306 -u rdsuser --password=rdspassword < dump.sql
Первая проблема была в строке 22 дампа:
ИЗМЕНИТЬ MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;
Эта строка вызвала ошибку ERROR 1227 (42000) at line 22: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
, Нет проблем, просто закомментировал эту строку и надеюсь исправить это позже через mysql.rds_set_external_master(). Повторил загрузку и получил очень похожую ошибку: ERROR 1227 (42000) at line 7844: Access denied; you need (at least one of) the SUPER privilege(s) for this operation
, Раздел вокруг линии 7844 выглядит следующим образом:
/*!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` */;
Комментируя первые 2 строки и добавляя "CREATE" к третьей, я смог обойти эту. Но есть множество таких разделов. Есть ли способ обойти это без всего редактирования? Как вариант mysqldump
не производить ничего, что требует СУПЕР привилегий?
Похоже, что у многих людей были похожие проблемы, такие как необходимость бегать sed
против вывода mysqldump / mysqlbinlog! Я также собираюсь публиковать сообщения на форуме AWS - на самом деле я думаю, что RDS должен иметь более терпимый способ импорта из mysqldump или специальный инструмент, который можно запустить с существующей базой данных для создания дампа, который является жалобой на безопасность RDS. Просто подумал, есть ли у кого-нибудь другие рецепты или хитрости, которые могли бы здесь помочь.
Спасибо,
Дейв
2 ответа
Вам, скорее всего, нужно log_bin_trust_function_creators
= 1 на RDS, но это не проблема, здесь.
Вы можете указать
DEFINER
Значение, отличное от вашей учетной записи, только если у вас естьSUPER
привилегия.- http://dev.mysql.com/doc/refman/5.6/en/stored-programs-security.html
Когда запущена хранимая программа (proc, function, event или trigger), все, что она делает, имеет права пользователя, который ее определил, или пользователя, явно указанного с помощью DEFINER
декларация. Это позволяет, среди прочего, хранимым программам разрешать другим пользователям выполнять действия с данными, которыми они напрямую не имеют разрешения манипулировать, если у них есть разрешение на использование самой хранимой программы.
Тогда это будет серьезной уязвимостью, еслиSUPER
Пользователь может создать процедуру с произвольным определителем, поскольку пользователь может наращивать свои привилегии по желанию.
Конечно, это также верно и для представлений, когда используется определенный контекст безопасности, как в примере, который вы опубликовали.
Одна из самых больших жалоб, которые я имею с RDS, - то, что вы не можете иметь SUPER
... и теперь он может быть одним из ваших тоже:), потому что этот факт является причиной проблемы, с которой вы столкнулись.
Конечно, если бы я запускал управляемую службу MySQL, я бы никому не дал SUPER
Кроме того, их модель безопасности имеет смысл, даже если она иногда громоздка.
Если все ваши объекты имеют одинаковый определитель, обходным решением будет восстановление дампа с использованием этой учетной записи вместо той, которую вы используете сейчас, но это кажется маловероятным.
Удаление только строки с DEFINER
объявление должно заставить дампфайл работать в тех случаях, когда он появляется в строке сам по себе, или вы можете использовать sed или perl для изменения файла... идея, которую я уже знаю, вы не любите, но это действительно приятно Что касается MySQL, то такая хакерская атака вполне законна, и не так уж далеко от того, что я должен делать как администратор БД даже в среде без RDS.
perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < oldfile.sql > newfile.sql
... возможно, это не тот ответ, на который вы надеялись, но вы можете запустить его для своего файла дампа, и в результате получится немного более пригодный для использования файл.
В моем случае это была строка "CHANGE MASTER TO MASTER_LOG_FILE= ... " в дампе, которая выдала мне ошибку. Эта строка была добавлена опцией "--master-data" mysqldump. В Amazon AWS необходимо запустить репликацию, задав основные данные с помощью процедуры "mysql.rds_set_external_master", вместо этого читайте здесь
Так что я просто отмечаю эту строку "head 22 backup.dump", где строка 22 сообщает об ошибке. Затем удалите его перед импортом, для моего большого файла, который я использую: "sed '22d' backup.dump> backup_clean.dump"