[comment]: # ({5eeeb74e-fb2bb765})
# 2 保护 PostgreSQL/TimescaleDB

[comment]: # ({/5eeeb74e-fb2bb765})

[comment]: # ({b57256ce-f15f5533})
#### 概述

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

::: noteclassic
对于基本设置，请参阅默认的 [PostgreSQL 数据库创建](/manual/appendix/install/db_scripts#postgresql) 说明，其中包括创建对 Zabbix 数据库具有完全权限的 'zabbix' 用户。
该用户是数据库所有者，在 [升级](/manual/installation/upgrade) Zabbix 时，也拥有修改数据库结构所需的权限。
:::

为提高安全性，建议配置安全的 schema 使用模式，并创建具有最小权限的其他数据库角色和用户。
这些角色和用户应根据 [最小权限原则](/manual/best_practices/security/access_control#principle-of-least-privilege) 进行配置，
也就是说，它们应仅拥有执行预期功能所必需的权限。

[comment]: # ({/b57256ce-f15f5533})

[comment]: # ({2ba18c01-ea02859b})
#### 数据库设置

创建将作为数据库所有者的用户，并创建 Zabbix 数据库；
数据库所有者是数据库创建时指定的用户：

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

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

::: noteimportant
本页上的以下命令必须在通过 PostgreSQL 连接到 `zabbix` 数据库时执行。
:::

创建 `zabbix` schema，并将数据库所有者（`usr_owner`）设置为该 schema 的所有者：

```sql
CREATE SCHEMA zabbix AUTHORIZATION usr_owner;
```

配置安全的 schema [使用模式](https://www.postgresql.org/docs/current/ddl-schemas.html#DDL-SCHEMAS-PATTERNS)：

```sql
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE zabbix FROM PUBLIC;
-- 注意：search_path 应指向 "zabbix" schema：
ALTER ROLE ALL IN DATABASE zabbix SET search_path = "zabbix";
```

完成数据库设置后，继续创建用户角色。

[comment]: # ({/2ba18c01-ea02859b})

[comment]: # ({37a7562a-c2099f4a})
#### 创建用户角色

创建以下角色及其对应权限：

-   **zbx_srv** - 用于运行 Zabbix 服务器和 proxy 的角色：

```sql
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 的角色：

```sql
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** - 用于表备份的角色：

```sql
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;
```

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

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

[comment]: # ({/37a7562a-c2099f4a})

[comment]: # ({9ca73fa1-227faa1f})
#### 分配用户角色

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

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

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

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

[comment]: # ({/9ca73fa1-227faa1f})

[comment]: # ({c9d52896-faf5cea0})
#### 使用 TimescaleDB 进行数据库分区

数据库分区由 TimescaleDB 提供支持。  
要使用 TimescaleDB，Zabbix 服务器需要数据库所有者权限。

如果 PostgreSQL `zabbix` 模式已经在 `zabbix` 数据库中创建，则可以使用以下命令启用 TimescaleDB：

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

[comment]: # ({/c9d52896-faf5cea0})
