2. PostgreSQL/TimescaleDB
概述
本节包含以安全方式设置 PostgreSQL 数据库的最佳实践。
为了便于设置,建议遵循默认的 PostgreSQL创建数据库 说明,其中包括创建对 Zabbix 数据库具有完全权限的“zabbix”用户,此用户是数据库所有者,在 升级 Zabbix 时还具有修改数据库结构所需的权限。 为了提高安全性,建议配置安全的架构使用模式,并创建具有最小权限的数据库其他角色和用户。 这些角色和用户应根据 最小权限原则进行配置,即他们只应具有执行预期功能所必需的权限。
数据库设置
创建将成为数据库所有者的用户,并创建 Zabbix 数据库;数据库所有者是在创建数据库时指定的用户:
createuser -U postgres -h localhost --pwprompt usr_owner
createdb -U postgres -h localhost -O usr_owner -E Unicode -T template0 zabbix
数据库的全新安装或升级必须由数据库所有者执行。这是因为删除数据库对象或更改其定义的权利是数据库所有者固有的特权,无法授予或撤销。
当与PostgreSQL的连接专门连接到zabbix数据库时,必须执行此页面上的以下命令。
创建zabbix
架构并将数据库所有者 ( usr_owner
) 设置为该架构的所有者:
CREATE SCHEMA zabbix AUTHORIZATION usr_owner;
配置安全架构 使用模式:
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 服务器和代理的角色:
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 服务器和代理的角色:
CREATE USER usr_srv WITH ENCRYPTED password 'password';
GRANT zbx_srv TO usr_srv;
使用 TimescaleDB 进行数据库分区
数据库分区由 TimescaleDB 实现。要使用 TimescaleDB,Zabbix 服务器需要数据库所有者权限。
zabbix
如果数据库中已创建PostgreSQL模式zabbix
,则可以使用以下命令启用 TimescaleDB:
echo "CREATE EXTENSION IF NOT EXISTS timescaledb WITH SCHEMA zabbix CASCADE;" | sudo -u postgres psql zabbix