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;
-- Примечание: search_path должен указывать на схему "zabbix":
ALTER ROLE ALL IN DATABASE zabbix SET search_path = "zabbix";

После настройки базы данных перейдите к созданию ролей пользователей.

Создание ролей пользователей

Создайте следующие роли с соответствующими привилегиями:

  • zbx_srv - роль для запуска Zabbix server и 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 server и proxy:

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

Разделение базы данных с помощью TimescaleDB

Разделение базы данных упрощается с помощью TimescaleDB. Чтобы использовать TimescaleDB, сервер Zabbix требует прав владельца базы данных.

Если схема PostgreSQL zabbix уже создана в базе данных zabbix, вы можете включить TimescaleDB с помощью следующей команды:

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