Como visualizar a consulta de outra sessão no pg_stat_activity sem ser superusuário?

13

Eu tenho um banco de dados Postgresql 9.2. Dois usuários são criados nesse banco de dados. Quando executo a seguinte consulta como superusuário, posso ver tudo.

select * from pg_stat_activity

No entanto, é possível obter o mesmo resultado sem estar conectado como superusuário?

Qual privilégio / função devo conceder / criar para obter os resultados que um superusuário pode ver?

Stephan
fonte
Neste ponto, não há o direito de conceder, é codificado para o superusuário. Isso tem sido discutido recentemente na lista de discussão e pode mudar na versão 9.5 se alguém encontrar tempo para trabalhar nela.
Craig Ringer

Respostas:

20

Neste ponto, não há o direito de conceder, é codificado para o superusuário. Isso tem sido discutido recentemente na lista de discussão e pode mudar na versão 9.5 se alguém encontrar tempo para trabalhar nela.

Como solução alternativa, você pode criar uma SECURITY DEFINERfunção pertencente ao superusuário e executar a consulta desejada. Isso permitirá que não-usuários vejam o conteúdo pg_stat_activitychamando a função.

Por exemplo, execute como um superusuário:

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;

Observe que o acesso gratuito a pg_stat_activityé restrito por um motivo. É possível bisbilhotar informações confidenciais de consultas de outras pessoas - imagine, por exemplo, se outro usuário estivesse usando pgcrypto. Em vez de conceder direitos, publicvocê deve concedê-los apenas a um usuário ou função específico que deve atuar como um usuário substituto para monitoramento.

Craig Ringer
fonte
Obrigado! Estava apenas tentando descobrir como dar a uma conta de monitor permissão para ler em pg_stat_activity sem conceder SUPERUSER.
Epic_fil 22/01
3

A partir do PostgreSQL 10, você pode conceder a função pg_read_all_statspara alcançar o resultado desejado.

Radu Dumbrăveanu
fonte