Comment afficher la requête d'une autre session dans pg_stat_activity sans être super utilisateur?

13

J'ai une base de données Postgresql 9.2. Deux utilisateurs sont créés sur cette base de données. Lorsque j'effectue la requête suivante en tant que superutilisateur, je peux tout voir.

select * from pg_stat_activity

Cependant, est-il possible d'obtenir le même résultat sans être connecté en tant que superutilisateur?

Quel privilège / rôle dois-je accorder / créer pour obtenir les résultats qu'un superutilisateur peut voir?

Stephan
la source
À ce stade, il n'y a aucun droit d'accorder, il est codé en dur pour le superutilisateur. Cela a été discuté récemment sur la liste de diffusion et peut changer en 9.5 si quelqu'un trouve le temps de travailler dessus.
Craig Ringer

Réponses:

20

À ce stade, il n'y a aucun droit d'accorder, il est codé en dur pour le superutilisateur. Cela a été discuté récemment sur la liste de diffusion et peut changer en 9.5 si quelqu'un trouve le temps de travailler dessus.

Pour contourner ce problème, vous pouvez créer une SECURITY DEFINERfonction appartenant au superutilisateur et exécuter la requête souhaitée. Cela permettra aux non-superutilisateurs de voir le contenu de pg_stat_activityen appelant la fonction.

Par exemple, exécutez en tant que superutilisateur:

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;

Notez que l'accès gratuit à pg_stat_activityest limité pour une raison. Il est possible d'espionner des informations sensibles à partir des requêtes d'autres personnes - imaginez par exemple si un autre utilisateur utilisait pgcrypto. Plutôt que de publicvous accorder des droits, accordez-les uniquement à un utilisateur ou à un rôle spécifique qui doit agir en tant qu'utilisateur de substitution pour la surveillance.

Craig Ringer
la source
Merci! J'essayais juste de comprendre comment donner à un compte moniteur la permission de lire depuis pg_stat_activity sans accorder SUPERUSER.
epic_fil
3

À partir de PostgreSQL 10, vous pouvez accorder le rôle pg_read_all_statsafin d'obtenir le résultat souhaité.

Radu Dumbrăveanu
la source