Как я могу создать пользователя только для чтения для резервных копий в PostgreSQL?


15

Правда ли, что в PostgreSQL создать резервного пользователя только для чтения невозможно?

Мне сообщили на IRC-канале, что у вас просто не может быть резервного пользователя только без прав владения. Я нахожу это очень странным, поэтому хочу убедиться, что я ничего не пропустил.

Ниже то, что я пытался, но это не дает мне результатов, которые я ищу. Когда я делаю pg_dumpна данном столе, я получаю Permission denied for relation...:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO backup; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO backup; 
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO backup;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO backup;

Любая помощь будет принята с благодарностью!


Ответы:


9

Нет, это легко (теперь так или иначе).

  1. Предоставьте разрешение на подключение новому пользователю

    GRANT CONNECT ON DATABASE mydb TO myReadolyUser;
  2. Предоставьте разрешения для всех текущих объектов базы данных. Это зависит от схемы, и вам придется запускать одну копию для каждой схемы, которую вы хотите, чтобы ваш пользователь использовал,

    GRANT SELECT ON ALL TABLES IN SCHEMA mySchema TO myReadonlyUser;

    Из документовALL TABLES включает в себя все , что вы хотите.

    Существует также возможность предоставления привилегий всем объектам одного типа в одной или нескольких схемах. Эта функциональность в настоящее время поддерживается только для таблиц, последовательностей и функций (но учтите, что ВСЕ ТАБЛИЦЫ включают в себя представления и сторонние таблицы.

  3. Затем ALTER DEFAULT PRIVLEGESпредоставить будущие SELECT привилегии для еще не созданных объектов.

    ALTER DEFAULT PRIVILEGES IN SCHEMA mySchema
    GRANT SELECT ON TABLES TO myReadonlyUser;

Я заметил , что при работе ALTER DEFAULT PRIVILEGES ... myReadonlyUser, 2 дополнительные линии добавляются на свалку: ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES FOR ROLE root IN SCHEMA public REVOKE ALL ON TABLES FROM root;. Похоже, это будет означать, что root не сможет ничего делать на новых таблицах. Это правда?
dthor

Кроме того, если ваши таблицы используют только bigintдля чтения, пользователю, вероятно, также понадобитсяGRANT SELECT ON ALL SEQUENCES
dthor

6

Простой и приятный способ - создать суперпользователя с правами только для чтения.

  • Войдите psqlкак postgres или другой суперпользователь.
  • Создайте новую роль суперпользователя и установите для нее только чтение:

    CREATE USER backadm SUPERUSER  password '<PASS>';
    ALTER USER backadm set default_transaction_read_only = on;
    • Замените <PASS>на выбранный вами пароль.
    • Вы можете заменить backadm выбранное имя пользователя. (Я положил backadmдля Backup Administrator).
    • НЕ забывайте одинарные кавычки для пароля.

Теперь вы можете использовать эту роль для резервного копирования.


6
Ewww. Суперпользователь для резервного копирования? Он специально попросил только для чтения. Этот пользователь один SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITEили ALTER USER backadm set default_transaction_read_only = off;имеет неограниченный доступ к базе данных.
Эван Кэрролл

Этот пользователь по-прежнему сможет удалять таблицы / схемы / базы данных независимо от того, что транзакции доступны только для чтения.
Игорь Мухин

4

Обратите внимание, что блог, на который ссылается ответ @Gyre , не будет работать для создания пользователя «только для чтения» (т. Е. Для создания роли только для чтения для веб-приложения для подключения к базе данных) и может привести к серьезному уязвимость безопасности, поскольку ее легко обойти, как объясняется в этом ответе из списка postgresql . Для справки, клиент переопределяет настройки сеанса:

SET SESSION CHARACTERISTICS AS TRANSACTION READ WRITE

Обратитесь к презентации «Управление правами в postgresql», связанной с вики postgres, для более детального метода, подобного тому, который был опубликован в вопросе.


Это не совсем ответ, это критика других ответов за небезопасность, которые я скопировал в качестве комментария. Я правильно ответил на этот вопрос сейчас.
Эван Кэрролл

3

После тестирования с помощью решения Эвана Кэролла я столкнулся с этой ошибкой:

ОШИБКА: отказано в разрешении для отношения «таблица»

пропало еще одно разрешение:

GRANT SELECT ON ALL SEQUENCES IN SCHEMA mySchema TO myReadonlyUser

Добавление этого разрешения позволило мне сделать резервную копию с моим пользователем только для чтения.


2

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


Вместо того, чтобы просто ссылаться на сообщение в блоге, вы должны добавить некоторые детали к своему ответу на случай, если сообщение в блоге страдает от link-rot (см. En.wikipedia.org/wiki/Link_rot )
Макс Вернон,

Основная идея блога заключается в том ALTER USER set default_transaction_read_only = on;, что пользователь не может поменять его.
синеватый

Ewww. Суперпользователь для резервного копирования? Он специально попросил только для чтения. Этот пользователь является одной из SET SET SESSION CHARACTERISTICS AS TRANSADTION READ WRITE или ALTER USER backadm set default_transaction_read_only = off; от неограниченного доступа к базе данных.
Эван Кэрролл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.