PostgreSQL 上只读单表访问的最小授权

Wil*_*zyr 13 postgresql permissions

以下是似乎可用于创建新用户(登录)并授予对 PostgreSQL 上指定表的只读访问权限的命令列表。

让我们假设这些命令是在具有足够权限的登录时执行的(即postgres在默认安装中登录)。

CREATE ROLE user_name NOSUPERUSER NOCREATEDB 
NOCREATEROLE NOINHERIT LOGIN PASSWORD 'pwd' VALID UNTIL 'infinity';
Run Code Online (Sandbox Code Playgroud)

现在我想在 database上授予select表,所以在这里(通过 PgAdmin 或类似的方式将数据库选为当前数据库):tab_abcdb_xyzdb_xyz

grant select on tab_abc to user_name;
Run Code Online (Sandbox Code Playgroud)

问题是:这是否足够,还是应该有更多的资助(数据库connectusage也许)?

这些命令似乎对我有用,但我的默认安装具有默认安全设置。如果服务器管理员配置了更强的安全性,我应该添加哪些额外的授权?

似乎我不需要授予connectusage- 在授予时是隐含的select吗?总是这样吗?

Dan*_*ité 17

问题是:这是否足够或者应该有更多的授权(数据库连接,可能使用)?

安全性可能主要在以下几点上从默认值得到加强:

  • pg_hba.conf文件。它在考虑任何数据库权限之前过滤连接。默认情况下,本地连接相对开放,但可能仅限于明确的数据库、用户名和网络来源列表。

  • public的权限,任何人都拥有的伪角色。仅当将连接权限授予 时,用户才能隐式连接PUBLIC。请参阅创建的用户无需任何授权即可访问 PostgreSQL 中的所有数据库。一个数据库可能具有从公共撤销的所有权限。有关您正在使用的主要 PostgreSQL 版本,请参阅文档中的REVOKE

  • public模式的存在。为方便起见,默认情况下它是与数据库一起创建的,但这不是强制性的。publicDBA 可以public在新用户根本没有隐式权限时删除架构,而不是从架构中删除公共权限。

在删除这些默认值的情况下,要读取一个表,应授予新用户:

GRANT CONNECT ON DATABASE dbname TO username;
Run Code Online (Sandbox Code Playgroud)

在数据库级别:

GRANT USAGE ON SCHEMA schemaname TO username;
GRANT SELECT ON schemaname.tablename TO username;
Run Code Online (Sandbox Code Playgroud)