掌握Postgres权限设置与最佳实践

发表时间: 2023-03-22 08:47

首先置顶一个中小项目中最常见的指令:

新增一个数据库,并为这个数据库新建一个具有全部权限的用户(不是最佳实践,但对小企业常用)。

  1. 以postgres用户登录psql控制台 su - postgres psql
  1. 创建带有加密密码的新用户create user myappuser with encrypted password 'your_password';
  1. 创建新数据库 create database myapp;
  1. 授予用户对数据库的所有权限 grant all privileges on database myapp to myappuser;
  1. 注意在postgresql15 中除了数据库拥有者外,其他使用者对于 public 模式没有 CREATE 权限, 需要使用ALTER DATABASE myapp OWNER TO myappuser; 修改数据库拥有者
  1. 打开postgresql.conf文件(通常位于[安装目录]/data目录) – 设置listen_addresses参数为’*',以便监听所有地址
listen_addresses = '*’
  1. 打开pg_hba.conf文件(通常位于同一目录) – 添加一行,允许新用户从远程地址连接到新数据库(根据需要修改地址和方法)
host myapp myappuser 0.0.0.0/0 md5
  1. 重启PostgreSQL服务 service postgresql restart

简介

PostgreSQL支持许多不同的权限设置。以下是一些常见的权限设置:

  1. CONNECT:允许用户连接到数据库实例。
  1. CREATE:允许用户创建新的数据库、模式和表。
  1. SELECT:允许用户查询表中的数据。
  1. INSERT:允许用户将新数据插入表中。
  1. UPDATE:允许用户更新表中的数据。
  1. DELETE:允许用户从表中删除数据。
  1. REFERENCES:允许用户创建外键约束。
  1. EXECUTE:允许用户执行存储过程和函数。
  1. USAGE:允许用户使用序列、类型和其他对象。
  1. TEMPORARY:允许用户创建临时表。
  2. 除了上述权限外,PostgreSQL还允许通过角色授权来管理权限。角色可以被分配到其他角色或用户,并可以继承其父角色的权限。PostgreSQL还允许对表和列进行细粒度权限控制,以控制用户对表和列的访问权限。

"ALL PRIVILEGES"是一种权限授予选项,包括上述的所有权力

如何实现过角色授权来管理权限?

PostgreSQL 是一个支持基于角色授权的关系型数据库管理系统。在 PostgreSQL 中,用户和组都被视为角色。下面是一些实现过角色授权的方法:

  1. 创建角色:可以使用 CREATE ROLE 语句创建新的角色,如:CREATE ROLE manager LOGIN PASSWORD 'password';
  2. 这将创建一个名为 manager 的角色,并指定了该角色的登录密码。
  1. 授予权限:可以使用 GRANT 语句授予角色特定的权限,如:GRANT SELECT, INSERT, UPDATE, DELETE ON table_name TO manager;
  2. 这将授予 manager 角色在 table\_name 表上执行 SELECT、INSERT、UPDATE 和 DELETE 操作的权限。
  1. 撤销权限:可以使用 REVOKE 语句从角色中撤销权限,如:REVOKE SELECT, INSERT, UPDATE, DELETE ON table_name FROM manager;
  2. 这将从 manager 角色中撤销在 table\_name 表上执行 SELECT、INSERT、UPDATE 和 DELETE 操作的权限。
  1. 继承角色:可以使用 INHERIT 选项让一个角色继承另一个角色的权限,如:CREATE ROLE sales NOINHERIT LOGIN PASSWORD 'password'; CREATE ROLE sales_manager INHERIT LOGIN PASSWORD 'password'; GRANT sales TO sales_manager;
  2. 在这个例子中,sales_manager 角色继承了 sales 角色的权限。
  1. 使用角色进行身份验证:可以使用 SET ROLE 语句设置当前会话的角色,如:SET ROLE manager;
  2. 这将设置当前会话的角色为 manager。

通过以上方式,可以使用 PostgreSQL 中的角色授权机制来管理用户和组的权限。

如何对表和列进行细粒度权限控制?

PostgreSQL 支持对表和列进行细粒度权限控制,具体的实现方式如下:

  1. 对表进行权限控制:可以使用 GRANT 和 REVOKE 语句对表进行权限控制,如:GRANT SELECT, INSERT, UPDATE, DELETE ON table_name TO user_or_role; REVOKE SELECT, INSERT, UPDATE, DELETE ON table_name FROM user_or_role;
  2. 这将授予或撤销用户或角色对表执行 SELECT、INSERT、UPDATE 和 DELETE 操作的权限。
  1. 对列进行权限控制:可以使用 GRANT 和 REVOKE 语句对列进行权限控制,如:GRANT SELECT (column_name), UPDATE (column_name) ON table_name TO user_or_role; REVOKE SELECT (column_name), UPDATE (column_name) ON table_name FROM user_or_role;
  2. 这将授予或撤销用户或角色对表中指定列执行 SELECT 和 UPDATE 操作的权限。
  3. 如果需要控制多个列的权限,可以将多个列名用逗号分隔,例如:
  4. GRANT SELECT (column1, column2), UPDATE (column1, column2) ON table_name TO user_or_role;
  1. 使用视图进行权限控制:可以使用 CREATE VIEW 语句创建视图,并使用 GRANT 和 REVOKE 语句对视图进行权限控制,如:CREATE VIEW view_name AS SELECT column1, column2 FROM table_name; GRANT SELECT ON view_name TO user_or_role; REVOKE SELECT ON view_name FROM user_or_role;
  2. 这将创建一个名为 view\_name 的视图,并授予或撤销用户或角色对该视图执行 SELECT 操作的权限。

需要注意的是,对表和列进行权限控制的前提是,已经存在一个具有相应权限的角色。因此,在使用细粒度权限控制时,需要先创建角色并为其授予相应的权限。

最佳实践

  1. 仅授权需要的最低权限:为了确保安全,应该尽可能仅授予用户需要的最低权限。例如,如果用户只需要查询表中的数据,那么应该授予他们SELECT权限而不是更高级别的权限。
  1. 使用角色进行权限管理:在PostgreSQL中,角色是一种授权和权限管理的有效方式。应该使用角色来组织和管理用户,以及为不同的角色分配适当的权限。
  1. 使用细粒度权限控制:PostgreSQL允许对表和列进行细粒度权限控制。使用这种方法,可以限制用户对特定列或行的访问权限,从而更好地控制数据的安全性。
  1. 定期审核用户权限:应该定期审查用户的权限,以确保他们仅具有所需的权限,并及时删除不再需要访问权限的用户。
  1. 使用SSL/TLS加密连接:使用SSL/TLS加密连接可以确保在网络传输中的数据安全,建议启用SSL/TLS加密连接以提高数据的安全性。
  1. 定期备份数据:定期备份数据是保障数据安全的重要措施,建议定期进行备份,并在需要时及时恢复备份数据。

以下是实现该最佳实践的步骤:

假设有一个电商网站,该网站使用PostgreSQL数据库存储客户订单和付款信息。为了确保数据的安全性

一、创建角色:首先,应该创建两个角色:一个是客户服务角色,只能查询订单信息;另一个是管理员角色,拥有更高级别的权限,可以修改订单和付款信息。创建角色的SQL命令如下:

CREATE ROLE customer_service LOGIN PASSWORD 'customer_service_password';CREATE ROLE administrator LOGIN PASSWORD 'administrator_password';

二、授权角色:接下来,应该授权这两个角色。客户服务角色应该只有查询表的权限,而管理员角色应该拥有修改和删除表的权限。授权的SQL命令如下:

-- 授权客户服务角色GRANT SELECT ON orders TO customer_service;GRANT SELECT ON payments TO customer_service;-- 授权管理员角色GRANT ALL PRIVILEGES ON orders TO administrator;GRANT ALL PRIVILEGES ON payments TO administrator;

三、创建用户:为了实现细粒度的权限控制,可以为每个员工创建单独的用户。假设有两名员工,分别是客户服务代表和管理员。为了创建这些用户,需要使用以下SQL命令:

CREATE USER customer_service_rep WITH PASSWORD 'customer_service_rep_password' IN ROLE customer_service;CREATE USER admin WITH PASSWORD 'admin_password' IN ROLE administrator;

四、审核权限:应该定期审查用户的权限,以确保他们仅具有所需的权限,并及时删除不再需要访问权限的用户。可以使用以下SQL命令列出`administrator`的权限:

SELECT * from information_schema.table_privileges WHERE grantee = 'administrator';

五、启用SSL/TLS加密连接:使用SSL/TLS加密连接可以确保在网络传输中的数据安全。可以使用以下SQL命令启用SSL/TLS加密连接:

ALTER SYSTEM SET ssl = 'on';

启用SSL/TLS加密连接还需要创建证书,限于篇幅,这里就不展开说了。

六、定期备份数据:定期备份数据,以保障数据安全。可以使用pg_dump命令备份数据:

pg_dump -U postgres -h localhost mydatabase > mydatabase_backup.sql