2 保护 PostgreSQL/TimescaleDB

概述

本节包含用于保护 PostgreSQL 数据库安全的最佳实践。

对于基本设置,请参见默认的 PostgreSQL 数据库创建 说明,其中包括创建对 Zabbix 数据库具有完全权限的“zabbix”用户。 该用户是数据库所有者,同时也具有在升级 Zabbix 时修改数据库结构所需的权限。

为提高安全性,建议配置安全的 schema 使用模式,并创建具有最小权限的附加数据库角色和用户。 这些角色和用户应根据最小权限原则进行配置, 也就是说,它们应仅具有执行预期功能所必需的权限。

数据库设置

创建将作为数据库所有者的用户,并创建 Zabbix 数据库; 数据库所有者是在创建数据库时指定的用户:

createuser -U postgres -h localhost --pwprompt usr_owner
createdb -U postgres -h localhost -O usr_owner -E Unicode -T template0 zabbix

数据库的全新安装或升级必须由数据库所有者执行。 这是因为删除数据库对象或修改其定义的权限是数据库所有者固有的特权,无法被授予或撤销。

本页中的以下命令必须在专门连接到 zabbix 数据库时执行。

创建 zabbix schema,并将数据库所有者(usr_owner)设置为该 schema 的所有者:

CREATE SCHEMA zabbix AUTHORIZATION usr_owner;

配置安全的 schema 使用模式

REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE zabbix FROM PUBLIC;
-- Note: search_path should point to the "zabbix" schema:
ALTER ROLE ALL IN DATABASE zabbix SET search_path = "zabbix";

设置好数据库后,继续创建用户角色。

创建用户角色

创建以下角色并授予相应权限:

  • zbx_srv - 用于运行 Zabbix 服务器和 proxy 的角色:
CREATE ROLE zbx_srv;
GRANT CONNECT ON DATABASE zabbix TO zbx_srv;
GRANT USAGE ON SCHEMA zabbix TO zbx_srv;
ALTER DEFAULT PRIVILEGES FOR ROLE usr_owner IN SCHEMA zabbix GRANT DELETE, INSERT, SELECT, UPDATE ON TABLES TO zbx_srv;
ALTER DEFAULT PRIVILEGES FOR ROLE usr_owner IN SCHEMA zabbix GRANT SELECT, UPDATE, USAGE ON sequences TO zbx_srv;
  • zbx_web - 用于运行 Zabbix 前端和 API 的角色:
CREATE ROLE zbx_web;
GRANT CONNECT ON DATABASE zabbix TO zbx_web;
GRANT USAGE ON SCHEMA zabbix TO zbx_web;
ALTER DEFAULT PRIVILEGES FOR ROLE usr_owner IN SCHEMA zabbix GRANT DELETE, INSERT, SELECT, UPDATE ON TABLES TO zbx_web;
ALTER DEFAULT PRIVILEGES FOR ROLE usr_owner IN SCHEMA zabbix GRANT SELECT, UPDATE, USAGE ON sequences TO zbx_web;
  • zbx_bckp - 用于表备份的角色:
CREATE ROLE zbx_bckp;
GRANT CONNECT ON DATABASE zabbix TO zbx_bckp;
GRANT USAGE ON SCHEMA zabbix TO zbx_bckp;
ALTER DEFAULT PRIVILEGES FOR ROLE usr_owner IN SCHEMA zabbix GRANT SELECT ON TABLES TO zbx_bckp;
ALTER DEFAULT PRIVILEGES FOR ROLE usr_owner IN SCHEMA zabbix GRANT SELECT, UPDATE, USAGE ON sequences TO zbx_bckp;

只有数据库所有者才能恢复表。

创建角色后,可以将其分配给用户。

分配用户角色

要分配已创建的用户角色,请创建用户并为其分配相应的角色。 根据需要替换 <user><role><password>

CREATE USER <user> WITH ENCRYPTED password '<password>';
GRANT <role> TO <user>;

例如,要创建并分配用于运行 Zabbix 服务器和 proxy 的角色:

CREATE USER usr_srv WITH ENCRYPTED password 'password';
GRANT zbx_srv TO usr_srv;

使用 TimescaleDB 进行数据库分区

TimescaleDB 可用于实现数据库分区。 要使用 TimescaleDB,Zabbix 服务器需要数据库所有者权限。

如果 PostgreSQL 的 zabbix schema 已经在 zabbix 数据库中创建,则可以使用以下命令启用 TimescaleDB:

echo "CREATE EXTENSION IF NOT EXISTS timescaledb WITH SCHEMA zabbix CASCADE;" | sudo -u postgres psql zabbix