Привилегии пользователя базы данных MySQL: Какие права доступа необходимы?

6 янв. 2011 г., 14:53:46
Просмотры: 82.3K
Голосов: 62

В краткой инструкции по установке WordPress ("5 минут") указано, что:

Создайте базу данных для WordPress на вашем веб-сервере, а также пользователя MySQL, который имеет все привилегии для доступа и изменения этой базы.

При профессиональной настройке нового блога я задумался, как это соотносится с тем, что предлагает мне конфигурация привилегий/разрешений пользователя базы данных MySQL:

  • Данные: SELECT, INSERT, UPDATE, DELETE
  • Определение: CREATE, ALTER, DROP
  • Дополнительно: INDEX
  • Прочее:
    1. LOCK TABLES
    2. REFERENCES
    3. CREATE TEMPORARY TABLES
    4. CREATE VIEW
    5. SHOW VIEW
    6. CREATE ROUTINE
    7. EXECUTE
    8. ALTER ROUTINE

Я достаточно уверен в первых трех группах, которые я здесь назвал Данные, Определение и Дополнительно. Но что насчет остальных пунктов под записью Прочее? Обычно я бы сказал, что они не нужны, но хотелось бы получить второе мнение.

0
Все ответы на вопрос 5
2
46

"Все привилегии" обычно означают, что нужно предоставить пользователю полный доступ. Однако...

Я нашел как минимум одну статью, в которой утверждается, что пользователю MySQL необходимы только:

  • SELECT
  • INSERT
  • UPDATE

Копнув глубже, я обнаружил, что для полноценной работы (автоматические обновления, установка/удаление плагинов и т.д.) WordPress требует дополнительных прав:

  • DELETE
  • ALTER (для обновлений)
  • CREATE TABLE
  • DROP TABLE

Также, хотя это прямо не указано, логично добавить:

  • INDEX

Но это всего лишь две надежные ссылки, подтвержденные мнениями из других источников. Я все же рекомендую использовать GRANT ALL, но если вам необходимо ограничить права базы данных, начните с этих 7 привилегий и тщательно протестируйте, чтобы убедиться, что все работает как ожидается.

6 янв. 2011 г. 17:17:25
Комментарии

Спасибо, что поделились своими мыслями. Для этого сайта я не использовал GRANT ALL, так как это не тестовый сайт, а оставил все права, включая INDEX. Пока всё выглядит хорошо, думаю, буду отслеживать ситуацию в ближайшие дни — это реальный сайт с большим количеством плагинов и тому подобного. Насчёт INDEX я также поищу информацию в ядре WordPress и документации MySQL.

hakre hakre
6 янв. 2011 г. 17:33:14

Просто помните, что сторонние плагины могут выполнять практически любые SQL-запросы... Поэтому убедитесь, что тщательно проверяете их перед установкой, если они зависят от привилегий, которые вы отозвали.

EAMann EAMann
6 янв. 2011 г. 17:41:09
2
16

Другие, как вы правильно заметили, не нужны.

Кстати, что можно сделать — это условно задавать пользователя/пароль в зависимости от запрашиваемой страницы. Например, использовать непривилегированного пользователя с правами select/insert/update/delete для обычного использования, и привилегированного с дополнительными правами на определение/индексирование при посещении страницы обновления.

6 янв. 2011 г. 18:09:44
Комментарии

Есть ли какие-то рекомендации по тому, как условно устанавливать пользователя/пароль на основе запрашиваемой страницы в среде WordPress? Спасибо.

superjos superjos
24 янв. 2014 г. 20:44:20

@superjos: Навскидку не припомню, но суть в том, чтобы определить обычного пользователя БД для select/insert/update/delete в wp-config, а когда URL совпадает с соответствующими страницами /wp-admin (вероятно, обновление, активация темы и активация плагина), определить альтернативного пользователя, который может делать все остальное.

Denis de Bernardy Denis de Bernardy
24 янв. 2014 г. 21:58:03
1
13

Вот что говорится в статье Усиление защиты WordPress об ограничении привилегий пользователя базы данных:

Для обычных операций WordPress, таких как публикация записей, загрузка медиафайлов, размещение комментариев, создание новых пользователей и установка плагинов, пользователю MySQL требуются только права на чтение и запись данных в базе MySQL: SELECT, INSERT, UPDATE и DELETE.

Следовательно, все остальные привилегии, связанные с изменением структуры базы данных и администрированием, такие как DROP, ALTER и GRANT, могут быть отозваны. Отзыв таких привилегий также улучшает политики ограничения доступа.

Примечание: Некоторые плагины, темы и крупные обновления WordPress могут требовать внесения структурных изменений в базу данных, например, добавления новых таблиц или изменения схемы. В таких случаях перед установкой плагина или обновлением ПО временно предоставьте пользователю базы данных необходимые привилегии.

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

12 янв. 2014 г. 19:09:25
Комментарии

Я стараюсь придерживаться принципа Наименьших Привилегий (Principle of Least Privilege) везде, где это возможно. Полезная цитируемая информация больше не содержится в указанной статье Кодекса, так что спасибо, что продублировали её здесь.

Anthony Geoghegan Anthony Geoghegan
2 мар. 2017 г. 12:38:06
0

Что касается "Примечания" в посте redburn, в WordPress Codex также есть Предупреждение, которое вам следует прочитать об обновлениях и изменениях схемы базы данных...

(Примечание редактора: Однако я заметил, что Я НЕ ВИЖУ "GRANT" в списке привилегий при создании или обновлении пользователя. Возможно, "CREATE" следует добавить в список? У кого-нибудь есть информация по этому поводу? — использую Hostgator cPanel, март 2016 —)

ПРЕДУПРЕЖДЕНИЕ:
Попытка обновлений без наличия этих привилегий [SELECT, INSERT, UPDATE, DELETE, DROP, ALTER и GRANT] может вызвать проблемы при изменениях схемы базы данных. Таким образом, НЕ рекомендуется отзывать эти привилегии. Если вы все же чувствуете необходимость сделать это по соображениям безопасности, убедитесь, что у вас есть надежный план резервного копирования с регулярным полным резервным копированием базы данных, которое вы проверили на валидность и которое можно легко восстановить. Неудачное обновление базы данных обычно можно исправить, восстановив базу данных до старой версии, предоставив соответствующие разрешения, а затем позволив WordPress снова попытаться обновить базу данных. Восстановление базы данных вернет её к старой версии, и административные экраны WordPress затем обнаружат старую версию и позволят вам запустить необходимые SQL-команды. Большинство обновлений WordPress не изменяют схему, но некоторые делают это. Только основные обновления (например, с 3.7 до 3.8) изменяют схему. Минорные обновления (например, с 3.8 до 3.8.1) обычно не изменяют её. Тем не менее, регулярно делайте резервные копии.

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

30 мар. 2016 г. 09:59:25
0

Моё мнение совпадает с мнением @EAMann выше, а также с источниками, на которые он ссылается: GRANT ALL необходим для обеспечения функциональности и будущей совместимости вашего сайта. Даже на рабочем сайте следует придерживаться руководства пользователя.

Как человек, который вносит вклад в код ядра WordPress и нескольких плагинов, я рекомендую оставлять права доступа к базе данных по умолчанию, как указано в руководстве пользователя (GRANT ALL PRIVILEGES ON wpdatabasename.* TO "wordpressusername"@"hostname").

Исходный код WordPress (как текущий, так и будущий) предполагает, что пользователь базы данных WordPress имеет все права для указанной базы данных. Если в вашей настройке не хватает каких-либо прав, вы можете столкнуться с проблемами при обновлении WordPress и добавлении новых плагинов.

Поэтому вам действительно не следует использовать права доступа к базе данных, отличные от рекомендуемых по умолчанию в руководстве, если только вы не знаете, что делаете, имеете очень специфические потребности и не забудете, что у вас настроены особые права доступа.

Страница Codex была обновлена с примерами для различных систем и скриншотами о том, как это сделать. https://codex.wordpress.org/Installing_WordPress#Step_2:_Create_the_Database_and_a_User

Создание имени базы данных и пользователя (через PHPMyAdmin): https://codex.wordpress.org/Installing_WordPress#Using_phpMyAdmin

Создание имени базы данных и пользователя (через клиентскую строку 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 окт. 2018 г. 18:42:16