Postgresql включает расширения без суперпользователя

13

У меня есть сервер PostgreSQL 9.5, на котором у меня есть скрипты, которые автоматически создают роли и базы данных для пользователей. В этих базах данных было бы полезно включить определенные расширения (например, pgcrypto), но, насколько я понимаю, для запуска нужно быть суперпользователем CREATE EXTENSION. Есть ли способ включить такие расширения, не входя вручную с учетной записью суперпользователя?

beldaz
источник
4
Вы пытались добавить их template1и затем создать базу данных каждого пользователя из template1лайков CREATE DATABASE foo OWNER=userfoo TEMPLATE=template1?
Кассандри
1
@ Кассандри не думал об этом, но это хорошая мысль. В идеале я бы хотел, чтобы владельцы могли добавить расширение, если они этого пожелают, но это все еще приемлемая возможность.
Бельдаз

Ответы:

10

Из документов по расширениям,

superuser (логическое значение) Если этот параметр имеет значение true (по умолчанию), только суперпользователи могут создавать расширение или обновлять его до новой версии. Если установлено значение false, требуются только те привилегии, которые необходимы для выполнения команд в сценарии установки или обновления.

Значение не задано pgcrypto.control, поэтому по умолчанию используется значение true, для которого требуется SuperUser.

Это означает, что вы не можете быть CREATE EXTENSIONпросто владельцем базы данных, несмотря на то, что документы по CREATE EXTENSION заставляют вас верить.

Я старался изо всех сил false, и радости не было. C - ненадежный язык, и вы получите

ОШИБКА: отказано в разрешении для языка c

Из документов на pg_language

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

... конечно, вы можете cдоверять UPDATE pg_language set lanpltrusted = true where lanname = 'c';как суперпользователь. Тогда CREATE EXTENSION pgcryptoбудет нормально работать как не суперпользователь. Но это звучит как плохая идея, если вам нужно беспокоиться о том, что ваши пользователи загружают исходный код в каталог расширений и затем устанавливают его в базу данных. То есть я бы не пошел так далеко. Я бы нашел другой способ снять кожу с этой кошки.

Эван Кэрролл
источник
Спасибо Эван, это настолько полный ответ, насколько я мог просить. Я, вероятно, выберу кошачье шкуру @ Кассандри, чтобы обойти это. Я также думал об обёртывании CREATE EXTENSION в хранимую процедуру, но не смог найти пути для выполнения этой работы в той же базе данных без хакерской аутентификации dblink.
beldaz
Какой смысл в том, чтобы не иметь никакой опции, pg_dumpчтобы запретить вывод операторов, касающихся расширений? В настоящее время я должен использовать внешние инструменты для обработки текста, чтобы удалить эти операторы из SQL, сброшенного с помощью pg_dump.
Claudix
@Evan Carroll: возможно ли установить суперпользователя в false через psql cli? У меня есть экземпляр на Amazon AWS RDS и не имеют доступа к pgcrypto.control.
Рибамар
2
@ribamar no, потому что это будет означать, что любой, подключенный к базе данных, может выполнять буквальный произвольный код в качестве администратора базы данных db. это было бы ужасной идеей.
Эван Кэрролл
Никто, суперпользователь. Я понимаю, что таким образом вы отличаете операционную систему super от dbms super user, хотя, если бы я принимал такое решение, я бы пошел на расширение возможностей этого инструмента, и если бы действительно нужно было создать еще одного более мощного пользователя, я бы реализовал его внутри инструмента.
Рибамар