BUG #16279: Permissions doc incorrect for pg_buffercache

From: PG Bug reporting form <noreply(at)postgresql(dot)org>
To: pgsql-bugs(at)lists(dot)postgresql(dot)org
Cc: philip(at)americanefficient(dot)com
Subject: BUG #16279: Permissions doc incorrect for pg_buffercache
Date: 2020-02-26 16:46:18
Message-ID: 16279-fcaac33c68aab0ab@postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

The following bug has been logged on the website:

Bug reference: 16279
Logged by: Philip Semanchuk
Email address: philip(at)americanefficient(dot)com
PostgreSQL version: 11.6
Operating system: macOS, also AWS Aurora
Description:

The doc for pg_buffercache says, "By default use is restricted to superusers
and members of the pg_read_all_stats role. Access may be granted to others
using GRANT." (https://www.postgresql.org/docs/11/pgbuffercache.html)

In my experience, users need to be members of pg_monitor, not
pg_read_all_stats. Here's a demo on Postgres 11.6 installed on my Mac.
(Behavior on AWS Aurora Postgres is the same.) 'a_user' is a user with no
special privileges. This first block of SQL shows that a_user can't read
pg_buffercache, as expected.

a_user $ SELECT
r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole,
r.rolcanlogin, r.rolvaliduntil,
ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid) as memberof
FROM pg_catalog.pg_roles r
WHERE rolname = current_user
;
rolname | rolsuper | rolinherit | rolcreaterole | rolcanlogin |
rolvaliduntil | memberof
---------+----------+------------+---------------+-------------+---------------+----------
a_user | f | t | f | t |
| {}
(1 row)

a_user $
a_user $ select * from pg_buffercache limit 1;
ERROR: permission denied for view pg_buffercache

In a different session where I'm logged in as superuser, I GRANTed a_user
membership to pg_read_all_stats, but a_user still can't read from
pg_buffercache.

a_user $ SELECT
r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole,
r.rolcanlogin, r.rolvaliduntil,
ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid) as memberof
FROM pg_catalog.pg_roles r
WHERE rolname = current_user
;
rolname | rolsuper | rolinherit | rolcreaterole | rolcanlogin |
rolvaliduntil | memberof
---------+----------+------------+---------------+-------------+---------------+---------------------
a_user | f | t | f | t |
| {pg_read_all_stats}
(1 row)

a_user $ select * from pg_buffercache limit 1;
ERROR: permission denied for view pg_buffercache

In my superuser session, I REVOKEd a_user's membership in pg_read_all_stats
and GRANTed membership in pg_monitor, and that enabled access to
pg_buffercache.

a_user $ SELECT
r.rolname, r.rolsuper, r.rolinherit, r.rolcreaterole,
r.rolcanlogin, r.rolvaliduntil,
ARRAY(SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid) as memberof
FROM pg_catalog.pg_roles r
WHERE rolname = current_user
;
rolname | rolsuper | rolinherit | rolcreaterole | rolcanlogin |
rolvaliduntil | memberof
---------+----------+------------+---------------+-------------+---------------+--------------
a_user | f | t | f | t |
| {pg_monitor}
(1 row)

a_user $
a_user $ select * from pg_buffercache limit 1;
bufferid | relfilenode | reltablespace | reldatabase | relforknumber |
relblocknumber | isdirty | usagecount | pinning_backends
----------+-------------+---------------+-------------+---------------+----------------+---------+------------+------------------
1 | 1262 | 1664 | 0 | 0 |
0 | f | 5 | 0
(1 row)

a_user $

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Sergei Kornilov 2020-02-26 17:11:26 Re: BUG #16279: Permissions doc incorrect for pg_buffercache
Previous Message Juan José Santamaría Flecha 2020-02-26 10:58:50 Re: BUG #16108: Colorization to the output of command-line has unproperly behaviors at Windows platform