Использование шифрования Postgres PGCrypto требует, чтобы суперпользователь выполнял запросы просмотра

Использование: Postgres 9, CentOS 7, каталог Postgres Data не находится по умолчанию, но использует RSync для проверки правильности разрешений. И да, соответствующие файлы.config были изменены.

Когда я пытаюсь запросить представление, содержащее зашифрованный элемент, как суперпользователя NON (Testuser), я получаю эту ошибку:

ОШИБКА: должен быть суперпользователем для чтения файлов. КОНТЕКСТ: функция PL/pgSQL decrypt_data(bytea) строка 13 при назначении

Если я выполню тот же запрос, используя суперпользователя POSTGRES, запрос завершится нормально.

Это похоже на ошибку разрешения чтения файловой системы при попытке чтения файлов ключей. Все, что я вижу, используя шифрование, похоже, не упоминает, как работать без суперпользователя.

Я уже выполнил следующие гранты для Testuser:

GRANT ALL PRIVILEGES ON DATABASE xxx_db to Testuser;
GRANT SELECT ON ALL TABLES IN SCHEMA xxxxx TO Testuser;
GRANT ALL ON ALL TABLES IN SCHEMA xxxxx TO Testuser;

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

Разрешения на клавиши сейчас 775, даже без удачи пробовал 777.

Есть идеи?

2 ответа

Решение

Я нашел проблему. Мне нужно предоставить пользователю права доступа к функциям.

ГРАНТ ВЫПОЛНЯЕТСЯ НА ВСЕ ФУНКЦИИ В СХЕМЕ xxxxx TO yyyyyyyyy;

pgcrypto это расширение PostgreSQL, описанное здесь: https://www.postgresql.org/docs/current/static/pgcrypto.html

но это не обеспечивает decrypt_data(bytea) функция.

Эта функция, кажется, пользовательский код, который открывает файл на стороне сервера, с pg_read_file() или аналогичный метод.

Эти методы предназначены только для суперпользователей, чтобы обычные пользователи не могли читать в файловой системе сервера, независимо от того, какие права Unix для конкретного файла они хотят прочитать.

Вы можете проверить это в источнике decrypt_data(bytea), который можно получить с помощью:

select pg_get_functiondef('decrypt_data(bytea)'::regprocedure);

или же \df+ decrypt_data(bytea) из psql.

Другие вопросы по тегам