Skip to content

Фильтрация безопасности

DD имеет встроенную функцию фильтрации конфиденциальных данных, которая автоматически обнаруживает и маскирует пароли, ключи, токены и другую чувствительную информацию в логах.

SensitiveDataFilter

Фильтр конфиденциальных данных на основе regex, поддерживает динамические шаблоны и кэширование.

Создание

ФункцияСигнатураОписание
NewSensitiveDataFilter() *SensitiveDataFilterПолный набор шаблонов
NewEmptySensitiveDataFilter() *SensitiveDataFilterПустой фильтр
NewCustomSensitiveDataFilter(patterns ...string) (*SensitiveDataFilter, error)Пользовательские шаблоны

Методы

МетодСигнатураОписание
AddPattern(pattern string) errorДобавить regex-шаблон
AddPatterns(patterns ...string) errorМассовое добавление шаблонов
ClearPatterns()Очистить все шаблоны
PatternCount() intКоличество шаблонов
Enable()Включить фильтрацию
Disable()Отключить фильтрацию
IsEnabled() boolВключена ли фильтрация
Filter(input string) stringОтфильтровать строку
FilterFieldValue(key string, value any) anyОтфильтровать значение одного поля
FilterValueRecursive(key string, value any) anyРекурсивная фильтрация вложенных структур
GetFilterStats() FilterStatsПолучить статистику фильтрации
ActiveGoroutineCount() int32Количество активных фильтрующих горутин
WaitForGoroutines(timeout time.Duration) boolОжидание завершения фильтрующих горутин
Close() boolЗакрыть фильтр и освободить кэш

Пользовательские шаблоны

go
filter, _ := dd.NewCustomSensitiveDataFilter(
    `(?i)password\s*[:=]\s*\S+`,     // Пароль
    `(?i)api[_-]?key\s*[:=]\s*\S+`,  // API Key
    `\b\d{16,19}\b`,                  // Номер кредитной карты
)

SecurityConfig

Структура конфигурации безопасности, управляющая поведением фильтрации и уровнем безопасности.

go
type SecurityConfig struct {
    MaxMessageSize  int                       // Макс. размер сообщения (байт, 0 = без ограничения, по умолчанию 5МБ в предустановках)
    MaxWriters      int                       // Макс. количество Writer (по умолчанию 100 в предустановках)
    SensitiveFilter *SensitiveDataFilter      // Фильтр конфиденциальных данных
    RateLimitConfig *internal.RateLimitConfig // Конфигурация ограничения частоты (внутренний тип, nil отключает ограничение; пресеты это поле не заполняют)
}

О RateLimitConfig

RateLimitConfig управляет ограничением частоты логирования для предотвращения флуда логов (DoS) и поддержания стабильности системы под нагрузкой. Это поле — внутренний тип (*internal.RateLimitConfig), его нельзя создать напрямую. Все предустановленные конфигурации (DefaultSecurityConfig, DefaultSecureConfig, SecurityConfigForLevel и др.) не заполняют это поле, то есть по умолчанию ограничение частоты не включается; Logger инициализирует ограничитель только при явной установке. Чтобы отключить ограничение частоты, установите его в nil.

FilterStats

Структура статистики фильтрации для мониторинга и наблюдаемости.

go
type FilterStats struct {
    ActiveGoroutines  int32         // Текущее количество активных фильтрующих горутин
    PatternCount      int32         // Количество зарегистрированных шаблонов конфиденциальных данных
    SemaphoreCapacity int           // Макс. количество параллельных операций фильтрации
    MaxInputLength    int           // Порог усечения длины входных данных
    Enabled           bool          // Включена ли фильтрация
    TotalFiltered     int64         // Общее количество операций фильтрации
    TotalRedactions   int64         // Общее количество маскирований
    TotalTimeouts     int64         // Общее количество таймаутов
    AverageLatency    time.Duration // Средняя задержка фильтрации
    CacheHits         int64         // Количество попаданий в кэш
    CacheMiss         int64         // Количество промахов кэша
}

SecurityLevel

Перечисление уровней безопасности, используется с SecurityConfigForLevel для быстрого получения предустановленной конфигурации.

go
type SecurityLevel int

Реализует метод String(), возвращающий читаемое имя уровня.

КонстантаОписание
SecurityLevelDevelopmentСреда разработки (без фильтрации конфиденциальных данных, без ограничения частоты)
SecurityLevelBasicБазовая фильтрация (пароли, токены, API-ключи, номера кредитных карт, SSN, телефоны, SWIFT/CVV и др., около 40 категорий часто встречающихся конфиденциальных данных)
SecurityLevelStandardСтандартная фильтрация (рекомендуется для производственных сред)
SecurityLevelStrictСтрогая фильтрация (среды с PII/финансовыми данными)
SecurityLevelParanoidЭкстремальная фильтрация (высокорисковые среды)

Предустановленные конфигурации

ФункцияОписаниеСценарий
DefaultSecurityConfig()Базовая фильтрация конфиденциальных данныхПроизводственная среда (рекомендуется)
DefaultSecureConfig()Полная фильтрация конфиденциальных данныхВысокие требования к безопасности
HealthcareConfig()Соответствие HIPAAМедицина
FinancialConfig()Соответствие PCI-DSSФинансы
GovernmentConfig()Правительственный стандартГосударственный сектор

Конфигурация по уровню

go
func SecurityConfigForLevel(level SecurityLevel) *SecurityConfig
УровеньКонстантаОписание
DevelopmentSecurityLevelDevelopmentСреда разработки, наиболее мягкий
BasicSecurityLevelBasicБазовая фильтрация
StandardSecurityLevelStandardСтандартная фильтрация
StrictSecurityLevelStrictСтрогая фильтрация
ParanoidSecurityLevelParanoidЭкстремальная фильтрация

Clone

go
func (c *SecurityConfig) Clone() *SecurityConfig

Создаёт глубокую копию конфигурации безопасности.

Способы использования

Через Config

go
// DefaultConfig уже включает DefaultSecurityConfig(), обычно явно задавать не нужно
cfg := dd.DefaultConfig()
logger, _ := dd.New(cfg)

// Если нужно заменить на конфигурацию более высокого уровня безопасности, переопределите явно
// cfg.Security = dd.DefaultSecureConfig()

Изменение во время выполнения

go
// Обновление конфигурации безопасности
logger.SetSecurityConfig(dd.DefaultSecureConfig())

// Чтение текущей конфигурации
sec := logger.GetSecurityConfig()

Фильтрация вложенных структур

go
filter := dd.NewSensitiveDataFilter()

// Фильтрация строки
filtered := filter.Filter("password=s3cr3t")
// → "password=[REDACTED]"

// Вложенные структуры (автоматическая рекурсия, поддерживает обнаружение циклических ссылок)
data := map[string]any{
    "user": map[string]any{
        "name":     "admin",
        "password": "s3cr3t",
        "token":    "eyJhbGciOi...",
    },
}
filteredData := filter.FilterValueRecursive("data", data)

Мониторинг статистики фильтрации

go
filter := dd.NewSensitiveDataFilter()
// ... использование фильтрации ...
stats := filter.GetFilterStats()
fmt.Printf("Всего фильтраций: %d, маскирований: %d, средняя задержка: %v\n",
    stats.TotalFiltered, stats.TotalRedactions, stats.AverageLatency)

Следующие шаги