Обзор безопасности
Переменные окружения часто содержат конфиденциальную информацию, и безопасная обработка имеет решающее значение. В этом документе представлен обзор архитектуры безопасности и основных функций библиотеки 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.String()Основные возможности:
- Блокировка памяти - предотвращение свопинга на диск (Linux/macOS/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 обработки безопасных значений
- Константы и ошибки - полный список запрещённых ключей, шаблоны конфиденциальных ключей
- Контрольный список для продакшена - проверки безопасности перед запуском