Как просмотреть запрос другой сессии в pg_stat_activity, не будучи суперпользователем?

13

У меня есть база данных Postgresql 9.2. В этой базе данных создано два пользователя. Когда я выполняю следующий запрос как суперпользователь, я вижу все.

select * from pg_stat_activity

Однако можно ли получить тот же результат, не будучи подключенным как суперпользователь?

Какую привилегию / роль я должен предоставить / создать, чтобы получить результаты, которые может видеть суперпользователь?

Stephan
источник
На данный момент нет права предоставлять, это жестко запрограммировано для суперпользователя. Это обсуждалось в списке рассылки в последнее время и может измениться в 9.5, если кто-то найдет время поработать над ним.
Крейг Рингер

Ответы:

20

На данный момент нет права предоставлять, это жестко запрограммировано для суперпользователя. Это обсуждалось в списке рассылки в последнее время и может измениться в 9.5, если кто-то найдет время поработать над ним.

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

Например, запустить от имени суперпользователя:

CREATE FUNCTION get_sa() RETURNS SETOF pg_stat_activity AS
$$ SELECT * FROM pg_catalog.pg_stat_activity; $$
LANGUAGE sql
VOLATILE
SECURITY DEFINER;

CREATE VIEW pg_stat_activity_allusers AS SELECT * FROM get_sa();

GRANT SELECT ON pg_stat_activity_allusers TO public;

Обратите внимание, что бесплатный доступ к pg_stat_activityограничен по причине. Можно получить конфиденциальную информацию из запросов других людей - представьте, например, что другой пользователь использовал pgcrypto. Вместо того, чтобы предоставлять publicвам права , следует предоставлять их только определенному пользователю или роли, которая должна выполнять роль суррогатного пользователя для мониторинга.

Крейг Рингер
источник
Благодарность! Просто пытался выяснить, как дать разрешение учетной записи монитора для чтения из pg_stat_activity без предоставления SUPERUSER.
epic_fil
3

Начиная с PostgreSQL 10 вы можете назначить роль pg_read_all_statsдля достижения желаемого результата.

Раду Думбрэвеану
источник