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

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

[comment]: # ({b57256ce-f15f5533})
#### Visão geral

Esta seção contém práticas recomendadas para proteger um banco de dados PostgreSQL.

::: noteclassic
Para uma configuração básica, consulte as instruções padrão de [criação do banco de dados PostgreSQL](/manual/appendix/install/db_scripts#postgresql), que incluem a criação do usuário 'zabbix' com privilégios completos no banco de dados do Zabbix.
Esse usuário é o proprietário do banco de dados e também possui os privilégios necessários para modificar a estrutura do banco de dados ao [atualizar](/manual/installation/upgrade) o Zabbix.
:::

Para melhorar a segurança, é recomendável configurar um padrão de uso de schema seguro, bem como criar funções e usuários adicionais do banco de dados com privilégios mínimos.
Essas funções e usuários devem ser configurados com base no [princípio do menor privilégio](/manual/best_practices/security/access_control#principle-of-least-privilege),
ou seja, devem ter apenas os privilégios essenciais para executar as funções pretendidas.

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

[comment]: # ({2ba18c01-ea02859b})
#### Configuração do banco de dados

Crie o usuário que será o proprietário do banco de dados e crie o banco de dados do Zabbix;
o proprietário do banco de dados é o usuário especificado na criação do banco de dados:

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

::: noteclassic
Uma instalação limpa ou atualização do banco de dados deve ser realizada pelo proprietário do banco de dados.
Isso ocorre porque o direito de remover um objeto do banco de dados ou alterar sua definição é um privilégio inerente ao proprietário do banco de dados e não pode ser concedido nem revogado.
:::

::: noteimportant
Os comandos a seguir nesta página devem ser executados enquanto a conexão com o PostgreSQL estiver sendo feita especificamente para o banco de dados `zabbix`.
:::

Crie o schema `zabbix` e defina o proprietário do banco de dados (`usr_owner`) como proprietário deste schema:

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

Configure um [padrão de uso](https://www.postgresql.org/docs/current/ddl-schemas.html#DDL-SCHEMAS-PATTERNS) seguro para o schema:

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

Depois de configurar o banco de dados, prossiga para a criação das funções de usuário.

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

[comment]: # ({37a7562a-c2099f4a})
#### Criando funções de usuário

Crie as seguintes funções com os privilégios correspondentes:

-   **zbx_srv** - função para executar o Zabbix server e 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** - função para executar o frontend e a API do Zabbix:

```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** - função para backup de tabelas:

```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
A restauração de tabelas é possível somente pelo proprietário do banco de dados.
:::

Após criar as funções, elas podem ser atribuídas aos usuários.

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

[comment]: # ({9ca73fa1-227faa1f})
#### Atribuindo funções de usuário

Para atribuir as funções de usuário criadas, crie usuários e atribua a eles as funções relevantes.
Substitua `<user>`, `<role>` e `<password>` conforme necessário.

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

Por exemplo, para criar e atribuir a função para executar o Zabbix server e proxy:

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

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

[comment]: # ({c9d52896-faf5cea0})
#### Particionamento de banco de dados com TimescaleDB

O particionamento de banco de dados é facilitado pelo TimescaleDB.
Para utilizar o TimescaleDB, o Zabbix server requer privilégios de proprietário do banco de dados.

Se o schema PostgreSQL `zabbix` já tiver sido criado no banco de dados `zabbix`, você pode habilitar o TimescaleDB com o seguinte comando:

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

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