Skip to content

Обзор безопасности

Переменные окружения часто хранят чувствительную информацию, поэтому безопасная обработка критически важна. В этом документе представлен обзор архитектуры безопасности и ключевых особенностей библиотеки env.

Архитектура безопасности

text
┌──────────────────────────────────────────────────────────────┐
│                          Слой приложения                      │
├──────────────────────────────────────────────────────────────┤
│   SecureValue   │  Маскирование  │  Очистка   │ Блокировка памяти │
├──────────────────────────────────────────────────────────────┤
│                         Слой Loader                           │
├──────────────────────────────────────────────────────────────┤
│   Валидация ключей  │ Валидация значений │ Запрещённые ключи │ Ограничения размера │
├──────────────────────────────────────────────────────────────┤
│                          Слой разбора                         │
├──────────────────────────────────────────────────────────────┤
│   Определение формата  │  Проверка подстановки  │  Валидация пути │
└──────────────────────────────────────────────────────────────┘

Ключевые функции безопасности

ФункцияОписаниеДокументация
SecureValueЗащита чувствительных значений в памяти, автоочисткаSecureValue API
Запрещённые ключиПредотвращение изменения системно-важных переменныхКонстанты и ошибки
Обнаружение чувствительных ключейАвтоидентификация чувствительных ключей конфигурации, инструменты маскирования логовМаскирование данных
Валидация значенийОбнаружение управляющих символов, нулевых байтов и т. д.Config API
Журнал аудитаПолное отслеживание операцийФабрика компонентов

Обзор SecureValue

Для чувствительных данных используйте GetSecure вместо GetString:

go
// Не рекомендуется
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 и маскирует их
go
// Безопасный вывод конфигурации в лог, избегая утечки открытого текста
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Внедрение вредоносных библиотек
ShellSHELL, IFS, BASH_ENVПерехват Shell
Рантаймы языковPYTHONPATH, NODE_PATHПерехват модулей

Полный список

См. DefaultForbiddenKeys для полного списка запрещённых ключей.

Валидация значений

Включите валидацию значений для обнаружения потенциальных опасностей:

go
cfg := env.ProductionConfig()
cfg.ValidateValues = true  // Обнаружение управляющих символов, нулевых байтов и т. д.

Основы безопасности файлов

Права доступа к файлам

bash
# Только владелец может читать и писать
chmod 600 .env

# Или строже (только для чтения)
chmod 400 .env

Git ignore

bash
.env
.env.local
.env.*.local
*.pem
*.key

Уровни безопасности конфигурации

ПресетНазначениеОсобенности
DevelopmentConfig()Среда разработкиМягкие ограничения, поддержка синтаксиса YAML
TestingConfig()Среда тестированияПереопределение существующих переменных, изоляция тестов
ProductionConfig()Продакшн-средаСтрогая валидация + журнал аудита, без переопределения существующих переменных
go
// Рекомендуемая конфигурация для продакшена
cfg := env.ProductionConfig()
cfg.RequiredKeys = []string{"DB_HOST", "API_KEY"}
cfg.AllowedKeys = []string{"APP_NAME", "PORT", "DB_HOST", "API_KEY"}

Связанная документация