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()  // Вызывать только когда нужно открытое значение

Основные возможности:

  • Блокировка памяти - Предотвращение swap на диск (Linux/macOS/Windows/FreeBSD)
  • Автоматическое обнуление - Безопасная очистка памяти при вызове Close()
  • Маскированный вывод - Masked() для вывода в логи
  • Потокобезопасность - Поддержка параллельного чтения

Полный API

Подробнее см. SecureValue API.

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

Валидация ключей

Правила имён ключей по умолчанию: ^[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

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"}

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