web-dev-qa-db-ja.com

スーパーユーザーでなくてもpg_stat_activityで別のセッションのクエリを表示するにはどうすればよいですか?

Postgresql 9.2データベースがあります。このデータベースに2人のユーザーが作成されます。次のクエリをスーパーユーザーとして実行すると、すべてが表示されます。

select * from pg_stat_activity

しかし、スーパーユーザーとして接続しなくても同じ結果を達成することは可能ですか?

スーパーユーザーが表示できる結果を得るためには、どの特権/役割を付与/作成する必要がありますか?

13
Stephan

この時点では、付与する権利はなく、スーパーユーザーにハードコードされています。これは最近メーリングリストで議論されており、誰かがそれに取り組む時間を見つけた場合、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に権限を付与するのではなく、監視の代理ユーザーとして機能する特定のユーザーまたはロールにのみ権限を付与する必要があります。

21
Craig Ringer

PostgreSQL 10以降では、目的の結果を達成するために、ロールpg_read_all_statsを付与できます。

3