Почему новый пользователь может создавать таблицы в PostgreSQL?

13

Я следовал двум урокам, чтобы создать БД с:

  1. полностью привилегированная ссылка пользователя
  2. пользовательская ссылка только для чтения

Затем я получил совет из руководства CJ Estel, в котором говорилось, что «вы, возможно, унаследовали возможность создавать таблицы, даже если мы никогда явно не передавали их нашему новому пользователю». Конечно, пользователь, имеющий права только на чтение, может создавать собственные таблицы!

CJ Estel очень хорошо указал на основную причину, а именно на базу данных шаблонов. Но способность создавать таблицы подрывает большинство уроков, которые вы получаете от поиска в Google «только для чтения пользователей postgres», включая один, размещенный на postgresql.org . У вашего пользователя больше привилегий только для чтения!

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

Джесвин Хосе
источник

Ответы:

13

TL; DR: Новые пользователи могут создавать таблицы в publicсхеме, потому что люди жаловались, что это было слишком сложно, когда они не могли.

Если вам не нравятся настройки по умолчанию, вам, вероятно, следует создать новую базу данных шаблонов с начальной конфигурацией, которую вы хотите. Например, вы можете:

DROP SCHEMA public;

или

REVOKE ALL ON SCHEMA public FROM public;
GRANT USAGE ON SCHEMA public TO public;

в вашем шаблоне.

Если вы хотите, чтобы publicпользователь не имел прав на базу данных, вам следует дополнительно:

REVOKE ALL ON DATABASE mydbname FROM public;
GRANT CONNECT ON DATABASE mydbname TO public;

так что publicпользователь не может создавать схемы или использовать временные таблицы.


Лично, если бы я проектировал это, я бы дал пользователям TEMPправо на базу данных по умолчанию, но не CREATE(схемы в базе данных) или CREATE(таблицы в publicсхеме). Я бы зарезервировал их для владельца.

Это выбор, который был сделан давным-давно, и изменить его сейчас довольно сложно.


На самом деле, есть регулярные жалобы на то, что слишком сложно начать работу с PostgreSQL, потому что вам нужно создать учетную запись пользователя и часто хотеть создать базу данных. Почему бы нам просто не создать их автоматически и не использовать по умолчанию доверие в качестве режима авторизации, чтобы упростить его? Почему postgresпользователь по умолчанию не имеет пароль postgres? Почему бы нам просто не создавать пользователей автоматически, если они существуют в ОС? и т.п.

Есть некоторые подлинные проблемы с юзабилити для новых пользователей - в частности, большинство людей не имеют ни малейшего представления о том, что такое peerauth, или почему простой запуск psqlпосле установки PostgreSQL говорит им, что нет пользователя с именем, в которое они вошли.

Это также грязный pg_hba.confфайл конфигурации, но пользователи создаются на уровне SQL. Этот раскол смущает пользователей.

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

Крейг Рингер
источник
Итак, я запускаю, revoke create on database [databasename] from [username];и БД теперь действительно доступна только для [имя пользователя]. Правильно? Я вернусь к этому ответу снова, когда прочитаю хорошую книгу
Постгреса
2
В ответ на предыдущий комментарий его нет.
Джесвин Хосе