Использование шифрования 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.