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.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Внедрение вредоносных библиотек
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"}

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