Подробный гайд: 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+)