[comment]: # ({5eeeb74e-fb2bb765})
# 2 PostgreSQL/TimescaleDBのセキュリティ保護

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

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

このセクションでは、PostgreSQLデータベースを安全に保護するためのベストプラクティスを説明します。

::: noteclassic
基本的なセットアップについては、デフォルトの[PostgreSQLデータベース作成](/manual/appendix/install/db_scripts#postgresql)手順を参照してください。この手順には、Zabbixデータベースに対するすべての権限を持つ「zabbix」ユーザーの作成が含まれています。
このユーザーはデータベース所有者であり、Zabbixの[アップグレード](/manual/installation/upgrade)時にデータベース構造を変更するために必要な権限も持っています。
:::

セキュリティを向上させるために、安全なスキーマ使用パターンを設定するとともに、最小限の権限を持つ追加のデータベースロールおよびユーザーを作成することを推奨します。
これらのロールおよびユーザーは、[最小権限の原則](/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` スキーマを作成し、データベース所有者 (`usr_owner`) をこのスキーマの所有者として設定します。

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

安全なスキーマの[使用パターン](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;
-- Note: search_path should point to the "zabbix" schema:
ALTER ROLE ALL IN DATABASE zabbix SET search_path = "zabbix";
```

データベースのセットアップ後、ユーザーロールの作成に進んでください。

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

[comment]: # ({37a7562a-c2099f4a})
#### ユーザーロールの作成

対応する権限を持つ以下のロールを作成します。

-   **zbx_srv** - Zabbixサーバーおよびプロキシを実行するためのロール:

```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 Webインターフェースおよび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サーバーおよびプロキシを実行するためのロールを作成して割り当てるには、次のようにします。

```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})
