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 и прокси:
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 требуются привилегии владельца базы данных.

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

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