Skip to content

Content Security Policy (CSP) для веб-интерфейса

Зачем это нужно

Content Security Policy (CSP) — заголовок безопасности браузера. Он ограничивает, какие скрипты и ресурсы страницам Glaber разрешено выполнять и загружать.

Для веб-интерфейса это в первую очередь защита от внедрения вредоносного JavaScript (XSS): даже если злоумышленнику удастся подставить свой код в ответ сервера, браузер не выполнит его без разрешения политики.

В Glaber строгий CSP по умолчанию выключен. Его имеет смысл включить на рабочих установках, где интерфейс доступен из сети или через интернет.

Опция появилась в 3.5.204. Для повседневной работы (включая мастер первой установки) функциональность считается стабильной начиная с 3.6.182 — рекомендуется использовать эту или более новую версию.

[!NOTE] CSP для скриптов настраивается в двух местах: в конфигурации веб-интерфейса Glaber и в nginx (или другом reverse proxy). Нужны оба шага. Если включить только nginx — интерфейс может «сломаться» (пустые страницы, не работают кнопки). Если включить только Glaber — защита фактически не применяется.

Как включить

1. Конфигурация веб-интерфейса

Откройте файл конфигурации фронтенда и добавьте или раскомментируйте параметр ниже.

При установке из пакета Glaber или штатного скрипта файл по умолчанию:

/usr/share/glaber/conf/glaber.conf.php

На части установок тот же файл (или симлинк на него) может быть в /etc/glaber/web/glaber.conf.php.

Имя zabbix.conf.php поддерживается только для совместимости со старыми установками; для новых и обновлённых систем используйте glaber.conf.php.

global $UI;

$UI['use_strict_csp'] = 1;

Сохраните файл. Перезапуск сервисов обычно не требуется.

2. Заголовок CSP в nginx

В location, который обрабатывает PHP-запросы фронтенда, добавьте add_header с политикой ниже (остальные параметры fastcgi_* оставьте как в вашем рабочем конфиге или примере из пакета):

location ~ [^/]\.php(/|$) {
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    # … ваш обычный fastcgi-блок …

    add_header Content-Security-Policy "default-src 'self'; script-src 'strict-dynamic' 'nonce-$upstream_http_x_script_nonce'; img-src 'self' data: https://*.tile.openstreetmap.org https://*.tile.opentopomap.org https://stamen-tiles-a.a.ssl.fastly.net https://stamen-tiles-b.a.ssl.fastly.net https://stamen-tiles-c.a.ssl.fastly.net https://basemap.nationalmap.gov; object-src 'none'";
}

Проверьте конфигурацию и перезагрузите nginx:

nginx -t && systemctl reload nginx

Переменная $upstream_http_x_script_nonce подставляет в политику одноразовый код, который выдаёт Glaber на каждый ответ. Менять её на фиксированную строку нельзя — иначе скрипты интерфейса перестанут выполняться.

Список адресов в img-src нужен для виджетов географических карт. Если вы используете другого поставщика тайлов — добавьте его хосты в этот список.

Виджет SVG Map

Строгий CSP (как в примере выше) не разрешает встроенные стили. Карты SVG из Inkscape/Figma обычно содержат <style> и ломаются в консоли с style-src-elem.

Для виджета SVG map используйте кнопку Convert to CSP-safe SVG в настройках виджета — см. Работа с SVG картами. Не добавляйте style-src 'unsafe-inline' в production только ради карт.

Проверка

  1. Откройте веб-интерфейс и убедитесь, что страницы открываются, меню и списки работают.
  2. При необходимости сделайте жёсткое обновление страницы (Ctrl+F5), чтобы сбросить кэш браузера.
  3. Если после включения CSP интерфейс пустой или в консоли браузера (F12 → Console) есть ошибки про Content Security Policy — чаще всего не выполнен шаг 1 или в nginx указана политика без $upstream_http_x_script_nonce.

Отключение

  1. Уберите или закомментируйте строку $UI['use_strict_csp'] = 1; в конфиге веб-интерфейса.
  2. Удалите (или закомментируйте) add_header Content-Security-Policy … в nginx и выполните nginx -t && systemctl reload nginx.

Связанная настройка: встраивание в iframe

Ограничение на открытие интерфейса внутри чужих сайтов (iframe) задаётся отдельно: Администрирование → Общие → X-Frame-Options. Это не заменяет CSP для скриптов, описанный выше.