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 только ради карт.
Проверка
- Откройте веб-интерфейс и убедитесь, что страницы открываются, меню и списки работают.
- При необходимости сделайте жёсткое обновление страницы (Ctrl+F5), чтобы сбросить кэш браузера.
- Если после включения CSP интерфейс пустой или в консоли браузера (F12 → Console) есть ошибки про Content Security Policy — чаще всего не выполнен шаг 1 или в nginx указана политика без
$upstream_http_x_script_nonce.
Отключение
- Уберите или закомментируйте строку
$UI['use_strict_csp'] = 1;в конфиге веб-интерфейса. - Удалите (или закомментируйте)
add_header Content-Security-Policy …в nginx и выполнитеnginx -t && systemctl reload nginx.
Связанная настройка: встраивание в iframe
Ограничение на открытие интерфейса внутри чужих сайтов (iframe) задаётся отдельно: Администрирование → Общие → X-Frame-Options. Это не заменяет CSP для скриптов, описанный выше.