Postgres на Linux, нужен беспарольный способ предоставления доступа к таблице - PullRequest
0 голосов
/ 10 мая 2018

Привет: у меня есть интересная проблема, которая нуждается в умном решении: -)

PG 9.6.5 по RHEL6_64

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

Допустим, у меня есть таблица под названием "согласования" ...

create table approvals (approval_id text);

И еще один стол, который называется «грантеры» ...

create table granters (linux_uid text);

Мне нужен сценарий perl / DBI, который должен позволять всем пользователям выбирать, но только те linux_uids в таблице «granters» могут вставлять / обновлять / удалять в таблицу «согласований». Но когда кто-то из таблицы «granters» запускает Perl-скрипт, я не хочу, чтобы ему приходилось вводить пароль. Сценарий perl может проверить, что авторизованный пользователь запускает его с помощью getlogin, и это достаточно хорошо.

Я могу создавать роли для грантеров и предоставлять им выбор / вставку / обновление / удаление в таблице «утверждений», но для входа в систему им нужно будет ввести пароль (одно из ограничений в БД заключается в том, что pawwsords требуются). Поэтому я не вижу, как этот традиционный метод будет работать.

Я мог бы создать перед вставкой, обновлением и удалением триггеры, которые могут проверять идентификатор человека, выполняющего скрипт perl, по списку идентификаторов в таблице «granters», а затем разрешать / отклонять попытку на этой основе. Но я не могу передать linux uid в хранимую процедуру, связанную с триггером (ами). Что-то вроде perlplu может позволить мне прослушать linux uid, но опять же, я не являюсь суперпользователем, поэтому (я считаю) я не могу создать что-то подобное.

Есть идеи?

Заранее спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

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

Во-первых, на вашем месте я бы переосмыслил это требование.Это выглядит сложным и громоздким;должно быть лучшее решение.

Вы можете использовать trust или ident аутентификацию для аутентификации без пароля, но вы не можете сделать это зависимым от содержимого таблицы в базе данных.Он управляется файлом pg_hba.conf.

Итак, вам нужно создать триггер на таблице, который работает с привилегиями суперпользователя через SECURITY DEFINER и редактировать (и перезагружать!) pg_hba.conf всякий раз, когда таблица модифицируется.Это сложно, подвержено ошибкам и опасно.

...