Обзор безопасности
Переменные окружения часто хранят чувствительную информацию, поэтому безопасная обработка критически важна. В этом документе представлен обзор архитектуры безопасности и ключевых особенностей библиотеки env.
Архитектура безопасности
┌──────────────────────────────────────────────────────────────┐
│ Слой приложения │
├──────────────────────────────────────────────────────────────┤
│ SecureValue │ Маскирование │ Очистка │ Блокировка памяти │
├──────────────────────────────────────────────────────────────┤
│ Слой Loader │
├──────────────────────────────────────────────────────────────┤
│ Валидация ключей │ Валидация значений │ Запрещённые ключи │ Ограничения размера │
├──────────────────────────────────────────────────────────────┤
│ Слой разбора │
├──────────────────────────────────────────────────────────────┤
│ Определение формата │ Проверка подстановки │ Валидация пути │
└──────────────────────────────────────────────────────────────┘Ключевые функции безопасности
| Функция | Описание | Документация |
|---|---|---|
| SecureValue | Защита чувствительных значений в памяти, автоочистка | SecureValue API |
| Запрещённые ключи | Предотвращение изменения системно-важных переменных | Константы и ошибки |
| Обнаружение чувствительных ключей | Автоидентификация чувствительных ключей конфигурации, инструменты маскирования логов | Маскирование данных |
| Валидация значений | Обнаружение управляющих символов, нулевых байтов и т. д. | Config API |
| Журнал аудита | Полное отслеживание операций | Фабрика компонентов |
Обзор SecureValue
Для чувствительных данных используйте GetSecure вместо GetString:
// Не рекомендуется
password := env.GetString("DB_PASSWORD")
// Рекомендуется
secret := env.GetSecure("DB_PASSWORD")
defer secret.Close()
password := secret.Reveal() // Вызывайте только при необходимости открытого текстаКлючевые функции:
- Блокировка памяти — предотвращает выгрузку на диск (Linux/macOS/Windows/FreeBSD)
- Автоочистка — безопасное стирание памяти при
Close() - Маскированное отображение —
Masked()для вывода в логи - Потокобезопасность — поддерживает конкурентное чтение
Полный API
Подробнее см. SecureValue API.
Безопасность логов
SecureValue защищает значения в памяти, но логи, сообщения об ошибках и отладочный вывод также легко могут раскрыть секреты. env предоставляет набор независимых функций маскирования, не требующих Loader:
IsSensitiveKeyавтоматически обнаруживает чувствительные имена ключей (пароли, ключи, токены)MaskValue/MaskKeyмаскируют значения и имена ключей перед выводомSanitizeForLogсканирует строки логов на наличие шаблоновkey=valueи маскирует их
// Безопасный вывод конфигурации в лог, избегая утечки открытого текста
log.Printf("Загрузка конфигурации: %s", env.MaskValue("DB_PASSWORD", password))
// Вывод: Загрузка конфигурации: [MASKED:12 chars]
log.Printf("Параметры подключения: %s", env.SanitizeForLog("user=admin password=s3cret"))
// Вывод: Параметры подключения: user=admin [MASKED]Полное руководство
Подробнее об использовании инструментов маскирования см. Маскирование данных.
Валидация ключей/значений
Валидация ключей
Правило имён ключей по умолчанию: ^[A-Za-z][A-Za-z0-9_]*$
- Начинается с буквы
- Содержит только буквы, цифры, подчёркивания
- Длина не превышает
MaxKeyLength
Запрещённые ключи
Встроенные запрещённые ключи предотвращают изменение системно-важных переменных:
| Категория | Примеры | Риск |
|---|---|---|
| Системный путь | PATH, LD_LIBRARY_PATH | Перехват команд/библиотек |
| Динамическая линковка | LD_PRELOAD, DYLD_INSERT_LIBRARIES | Внедрение вредоносных библиотек |
| Shell | SHELL, IFS, BASH_ENV | Перехват Shell |
| Рантаймы языков | PYTHONPATH, NODE_PATH | Перехват модулей |
Полный список
См. DefaultForbiddenKeys для полного списка запрещённых ключей.
Валидация значений
Включите валидацию значений для обнаружения потенциальных опасностей:
cfg := env.ProductionConfig()
cfg.ValidateValues = true // Обнаружение управляющих символов, нулевых байтов и т. д.Основы безопасности файлов
Права доступа к файлам
# Только владелец может читать и писать
chmod 600 .env
# Или строже (только для чтения)
chmod 400 .envGit ignore
.env
.env.local
.env.*.local
*.pem
*.keyУровни безопасности конфигурации
| Пресет | Назначение | Особенности |
|---|---|---|
DevelopmentConfig() | Среда разработки | Мягкие ограничения, поддержка синтаксиса YAML |
TestingConfig() | Среда тестирования | Переопределение существующих переменных, изоляция тестов |
ProductionConfig() | Продакшн-среда | Строгая валидация + журнал аудита, без переопределения существующих переменных |
// Рекомендуемая конфигурация для продакшена
cfg := env.ProductionConfig()
cfg.RequiredKeys = []string{"DB_HOST", "API_KEY"}
cfg.AllowedKeys = []string{"APP_NAME", "PORT", "DB_HOST", "API_KEY"}Связанная документация
- SecureValue API - полный API обработки безопасных значений
- Блокировка памяти - полное руководство по защите памяти через mlock
- Константы и ошибки - полный список запрещённых ключей, шаблоны чувствительных ключей
- Контрольный список для продакшена - проверка безопасности перед запуском