PostgreSQL: у дозволі відмовлено у відносинах


14

Я трохи розгублений щодо налаштування дозволів у PostgreSQL.

У мене такі ролі:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {rails}
 rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {rails}

та бази даних:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

Користувач myappне має проблем із запитом у myapp_productionбазі даних, додаючи та видаляючи записи. Я хотів би, meltemiщоб я також міг запитувати ту саму базу даних. Отже, я створив роль, railsяка є власником бази даних, і зробила її meltemiі myappчленів rails. Але я все одно отримую permission denied for relationпомилки. Meltemiможе переглядати схему, але не може запитувати БД.

Я щойно помітив (з \dtкомандою), що myappє власником таблиць:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

Таблиці були створені за допомогою ORM (міграції ActiveRecord Rails).

Я знаю, що авторизація сильно відрізняється в PostgreSQL (на відміну від MySQL та інших, якими я користувався). Як я повинен налаштувати свою базу даних, щоб різні користувачі мали доступ до неї. Деякі повинні мати можливість CRUD, але інші можуть читати тощо.

Дякуємо за будь-яку допомогу. Вибачте, я знаю, що це дуже основне питання, але я так і не змогла знайти відповідь.

Відповіді:


4

Я щойно писав про це у своїй відповіді на надання прав на базу даних postgresql іншому користувачеві на сервері ServerFault.

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

Тож у вашому випадку ви railsперейменовуєтесь, щоб сказати myapp_users, тоді ви створюєте нову роль (користувача) для входу на ім'я railsта GRANT myapp_users TO rails. Тепер ви GRANT myapp_users TO meltemi. І новий railsобліковий запис, і meltemiкористувач тепер мають права на старий rails.

Для більш дрібного контролю я радимо уникати надання власникам таблиць або їхніх груп право власності на таблиці. Надайте їм доступ через NOINHERITгрупу, яку вони повинні явно SET GROUPвикористовувати або, краще, використовувати зовсім іншого користувача для пільгових операцій, таких як DDL та GRANTs. На жаль, це не працює з Rails, тому що Rails любить застосовувати міграції коли завгодно, і AFAIK не дає вам можливості вказати іншого, більш привілейованого користувача, для запуску міграцій як.


Гаразд, прочитайте публікацію, з якою ви пов’язані; дуже корисний! Тепер, якщо я все розумію правильно, я думаю, ви, можливо, мали намір використати myappзамість railsвище? Тому що myappволодіє таблицями (я ніколи цього не вказував, міграція повинна мати). У будь-якому разі, це має сенс мати сенс, якби я перейменувався myappна нього, myapp_groupа потім зробив нового користувача, myappякий додаток рейки використовував би для підключення до БД. Складіть myappі існуючі meltemi, і обидва учасники myapp_groupролі. Але що відбувається, коли я запускаю наступну міграцію. чи не належить йому myappзнову створити проблему заново?!?
Мелтемі

1
Ви повинні розуміти, що PostgreSQL має лише roles(починаючи з версії 8.1). Терміни userі groupзберігаються навколо з історичних причин і сумісності. В основному "група" - це роль без привілею для входу. Ви можете надати , myappщоб meltemiнавіть якщо myappце просто ще один «користувач». Почніть з читання посібника тут .
Ервін Брандстеттер

Я розумію rolesпроти groupsпроти usersподілу в Postgres, принаймні , я думаю , що я роблю. Вибачте, що ви використовували неправильну (і заплутану) термінологію вище. Але я все ще не розумію, як налаштувати мою базу даних, щоб роль без входу ВІДБУДУвала базу даних та дві ролі входу, myappі вони meltemiможуть мати повний доступ. Однією з цих ролей myappбуде виконання міграцій Rails, які неминуче створюватимуть нові таблиці, які, знову ж таки, належать користувачеві myapp, що здійснює вхід. Чи повинен я просто зробити meltemi"членом" myappі закінчитися з ним? Але це просто здається химерним ... ні?!?
Мелтемі

1
@Meltemi: Якщо ви хочете , щоб надати всі привілеї , які myappтримаються meltemi, то це було б правильно зробити. Якщо ви хочете meltemiотримати лише підмножину привілеїв, це не стане. Потім створіть групову роль, щоб утримувати набір привілеїв і надайте це meltemi. Вас, швидше за все, зацікавить це пов’язане питання щодо SO . Я відповів, пояснюючиDEFAULT PRIVILEGES
Ервін Брандштеттер

@Meltemi Так, як звичайні міграції Rails ускладнюють картину. Rails дійсно повинен дозволяти вам вказати інший обліковий запис користувача для запуску міграцій як. Ви, можливо, можете додати SET ROLEкоманду до початку міграції та а RESET ROLEдо кінця, але я б не довіряв Рейлам, щоб запустити все це в порядку. Право Ервіна; у цьому випадку найкращим рішенням буде те, щоб GRANTкористувачеві рейки надали право власності іншому користувачеві, використовуючи 1-го користувача як групу для другого.
Крейг Рінгер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.