Обзор безопасности
Переменные окружения часто хранят конфиденциальную информацию, поэтому безопасная обработка имеет решающее значение. В этом документе представлен обзор архитектуры безопасности и основных возможностей библиотеки 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 | Инъекция вредоносных библиотек |
| Shell | SHELL, 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"}Связанная документация
- SecureValue API - Полный API для безопасной обработки значений
- Константы и ошибки - Полный список запрещённых ключей, шаблоны чувствительных ключей
- Контрольный список для продакшена - Проверка безопасности перед запуском