Як я можу створити користувача лише для читання для створення резервних копій у 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
читають,

6

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

  • Увійдіть psqlяк постгрес або інший суперпользователь.
  • Створіть нову роль суперпользователя і встановіть її лише для читання:

    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

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


Замість того, щоб просто посилатися на допис у блозі, слід додати деякі деталі до своєї відповіді, якщо повідомлення блогу страждає від гниття посилань (див. En.wikipedia.org/wiki/Link_rot )
Макс Вернон

Основна ідея від блогу - це ALTER USER set default_transaction_read_only = on;, що не заважає користувачеві його змінити.
синюватий

Ewww Суперусер для резервного копіювання? Він спеціально просив лише читати. Цей користувач - одна НАЗАДАЛЬНА ХАРАКТЕРИСТИКА СЕСІЇ ЯК ПЕРЕГЛЯДИ ЧИТАТИ НАПИСИ або ПІДТРИМАТИ ПОТРІБНИК, коли встановлена ​​заднім числом default_transaction_read_only = вимкнено; далеко від необмеженого доступу до бази даних.
Еван Керролл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.