Подробный гайд: Docker + Grafana + переменные окружения

Гайд по настройке безопасности Grafana в Docker через переменные GF_SECURITY_. Разбор параметров, примеры запуска и лучшие практики для production.

2026.05.11                  


Подробный гайд: Docker + Grafana + переменные окруженияПодробный гайд: Docker + Grafana + переменные окружения Grafana позволяет конфигурировать практически все параметры через переменные окружения. Переменные с префиксом GF_SECURITY_* соответствуют секции [security] в файле grafana.ini и отвечают за аутентификацию, шифрование, cookie, защиту от брутфорса и HTTP-заголовки безопасности.


Как работает маппинг переменных

Формат в grafana.ini Переменная окружения
[security] admin_user GF_SECURITY_ADMIN_USER
[security] secret_key GF_SECURITY_SECRET_KEY
[security] cookie_secure GF_SECURITY_COOKIE_SECURE

Правила:

  • Все буквы в верхнем регистре
  • Точки/дефисы заменяются на _
  • Поддерживается суффикс _FILE для безопасной передачи секретов (Docker Secrets, Kubernetes, HashiCorp Vault)

Основные переменные GF_SECURITY_*

Переменная Описание Рекомендуемое значение
GF_SECURITY_ADMIN_USER Логин администратора admin или кастомный
GF_SECURITY_ADMIN_PASSWORD Пароль администратора Сложный, >16 символов
GF_SECURITY_SECRET_KEY Ключ шифрования сессий, токенов, зашифрованных данных 32+ случайных символов
GF_SECURITY_LOGIN_REMEMBER_DAYS Срок жизни cookie "Remember me" 7 или 30
GF_SECURITY_COOKIE_SECURE Флаг Secure для cookie (только HTTPS) true (при наличии HTTPS)
GF_SECURITY_COOKIE_SAMESITE Атрибут SameSite Lax или Strict
GF_SECURITY_ALLOW_EMBEDDING Разрешение встраивания в iframe false (по умолчанию)
GF_SECURITY_STRICT_TRANSPORT_SECURITY Включение HSTS заголовка true
GF_SECURITY_STRICT_TRANSPORT_SECURITY_MAX_AGE Время жизни HSTS (сек) 31536000 (1 год)
GF_SECURITY_CONTENT_SECURITY_POLICY Заголовок CSP Кастомная политика или default-src 'self'
GF_SECURITY_LOGIN_MAX_FAILED_ATTEMPTS Лимит неудачных попыток входа 5
GF_SECURITY_LOGIN_LOCK_TIME Время блокировки после лимита (сек) 300
GF_SECURITY_PASSWORD_MIN_LENGTH Минимальная длина пароля 8 или 12
GF_SECURITY_DISABLE_BRUTE_FORCE_LOGIN_PROTECTION Отключение защиты от брутфорса false (не рекомендуется)

Примечание:

В Grafana 10+ часть параметров может быть вынесена в UI (Configuration → Settings → Security). Переменные окружения всё равно имеют приоритет.


Примеры запуска в Docker

1. Через docker run

docker run -d \
  --name grafana \
  -p 3000:3000 \
  -e GF_SECURITY_ADMIN_USER=grafana_admin \
  -e GF_SECURITY_ADMIN_PASSWORD=Str0ngP@ssw0rd!2026 \
  -e GF_SECURITY_SECRET_KEY=$(openssl rand -base64 32) \
  -e GF_SECURITY_COOKIE_SECURE=true \
  -e GF_SECURITY_COOKIE_SAMESITE=Lax \
  -e GF_SECURITY_STRICT_TRANSPORT_SECURITY=true \
  -v grafana_data:/var/lib/grafana \
  grafana/grafana:latest

2. Через docker-compose.yml (рекомендуется)

version: "3.8"

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_USER: "${GRAFANA_ADMIN_USER:-admin}"
      GF_SECURITY_ADMIN_PASSWORD_FILE: /run/secrets/grafana_admin_password
      GF_SECURITY_SECRET_KEY_FILE: /run/secrets/grafana_secret_key
      GF_SECURITY_COOKIE_SECURE: "true"
      GF_SECURITY_COOKIE_SAMESITE: "Lax"
      GF_SECURITY_STRICT_TRANSPORT_SECURITY: "true"
      GF_SECURITY_LOGIN_MAX_FAILED_ATTEMPTS: "5"
      GF_SECURITY_LOGIN_LOCK_TIME: "300"
    volumes:
      - grafana_data:/var/lib/grafana
    secrets:
      - grafana_admin_password
      - grafana_secret_key

volumes:
  grafana_data:

secrets:
  grafana_admin_password:
    file: ./secrets/admin_password.txt
  grafana_secret_key:
    file: ./secrets/secret_key.txt

Файлы в ./secrets/ должны содержать только значение без переводов строки:

echo -n 'Str0ngP@ssw0rd!2026' > ./secrets/admin_password.txt
echo -n "$(openssl rand -base64 32)" > ./secrets/secret_key.txt

Best Practices для Production

1. Никогда не храните секреты в docker-compose.yml или Dockerfile

Используйте _FILE суффикс + Docker Secrets / .env.gitignore) / внешние хранилища.

2. Обязательно задайте GF_SECURITY_SECRET_KEY
Без него Grafana генерирует временный ключ при каждом старте. Это приведёт к:
  • Сбросу всех активных сессий
  • Невозможности расшифровать зашифрованные datasource-пароли и alert-контакты
  • Смена ключа после инициализации = потеря доступов!
3. Включайте COOKIE_SECURE только при HTTPS

При true + HTTP браузеры будут отказываться сохранять cookie → вход невозможен.

4. Настройте защиту от брутфорса

LOGIN_MAX_FAILED_ATTEMPTS + LOGIN_LOCK_TIME включены по умолчанию, но проверьте их в логах.

5. Используйте CSP и HSTS

Снижают риски XSS, clickjacking и MITM.

6. Регулярно обновляйте образ

grafana/grafana:latest или фиксируйте версию: grafana/grafana:10.4.1


Отладка и проверка

Задача Команда / Действие
Проверить применённые переменные docker exec grafana env | grep GF_SECURITY
Увидеть итоговый конфиг docker exec grafana cat /etc/grafana/grafana.ini
Проверить HTTP-заголовки curl -I https://your-grafana:3000/login
Включить debug-логи GF_LOG_LEVEL=debug
Сбросить пароль админа docker exec -it grafana grafana-cli admin reset-admin-password newpass

Если переменная не применяется, проверьте:

  • Нет ли конфликта с монтированным grafana.ini (env vars имеют приоритет, но могут быть перезаписаны, если GF_PATHS_CONFIG указывает на кастомный файл)
  • Правильный регистр и отсутствие лишних пробелов
  • Версию Grafana (некоторые флаги добавлены в 9.5+/10+)