Skip to content

Контрольный список для продакшена

Перед развёртыванием проверьте каждый из следующих элементов безопасности, чтобы гарантировать безопасность и надёжность системы логирования.

Базовая конфигурация

  • [ ] Уровень логирования -- Установите LevelInfo или выше для производственной среды
  • [ ] Формат вывода -- Используйте FormatJSON для удобного сбора и анализа логов
  • [ ] Ротация файлов -- Настройте разумные ограничения размера и политику хранения
  • [ ] Сброс буфера -- Убедитесь, что Flush() или Close() вызывается перед выходом из программы
go
logger, _ := dd.New(dd.Config{
    Level:  dd.LevelInfo,
    Format: dd.FormatJSON,
})
defer logger.Close()

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

  • [ ] Включить фильтрацию конфиденциальных данных -- Используйте DefaultSecurityConfig() или выше
  • [ ] Пользовательские шаблоны -- Добавьте специфичные для бизнеса шаблоны чувствительных полей
  • [ ] Мониторинг статистики фильтрации -- Регулярно проверяйте статистику фильтрации, выявляйте аномалии
go
logger.SetSecurityConfig(dd.DefaultSecurityConfig())

Безопасность файлов

  • [ ] Права доступа к логам -- права файла 0600, права каталога 0700 (значения библиотеки по умолчанию; для входа в каталог нужен бит исполнения)
  • [ ] Валидация путей -- Убедитесь, что путь логов не может контролироваться пользовательским вводом
  • [ ] Символические ссылки -- Запретите символические ссылки в производственной среде
  • [ ] Дисковое пространство -- Настройте стратегию ротации для предотвращения переполнения диска

Аудит и целостность

  • [ ] Аудитные логи -- Включите аудитные логи для записи событий безопасности
  • [ ] Подписи целостности -- Включите HMAC-подписи для гарантии неподдельности логов
  • [ ] Отдельное хранение аудитных логов -- Аудитные логи должны храниться отдельно от бизнес-логов
go
audit, _ := dd.NewAuditLogger(dd.DefaultAuditConfig())
defer audit.Close()

cfg, _ := dd.DefaultIntegrityConfigSafe()
signer, _ := dd.NewIntegritySigner(cfg)

Производительность

  • [ ] Стратегия сэмплирования -- Рассмотрите возможность включения сэмплирования логов для сценариев с высокой пропускной способностью
  • [ ] Буферизованная запись -- Используйте BufferedWriter для уменьшения количества операций I/O
  • [ ] Учитывайте синхронную запись -- путь записи по умолчанию синхронный; в высоконагруженных сценариях используйте BufferedWriter для уменьшения системных вызовов
  • [ ] Мониторинг памяти -- Отслеживайте использование памяти, связанное с логированием

Жизненный цикл

  • [ ] Изящное завершение -- Используйте Shutdown(ctx) вместо Close() (примечание: Shutdown внутренне не дожидается завершения фильтрующих goroutine, тогда как Close вызывает WaitForFilterGoroutines; перед переключением явно вызовите logger.WaitForFilterGoroutines(...), чтобы избежать гонки при доступе закрываемого writer'а из фильтрующей goroutine)
  • [ ] Настройка таймаута -- Установите разумный таймаут завершения (рекомендуется 5-10 секунд)
  • [ ] Глобальный логгер -- Заменяйте через SetDefault(), а не создавайте повторно
go
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
logger.Shutdown(ctx)

Проверка соответствия

  • [ ] HIPAA -- Медицинская отрасль использует HealthcareConfig()
  • [ ] PCI-DSS -- Финансовая отрасль использует FinancialConfig()
  • [ ] GDPR -- Убедитесь, что не записывается личная идентификационная информация (PII)
  • [ ] Хранение данных -- Настройте срок хранения логов в соответствии с нормативными требованиями

Мониторинг и оповещения

  • [ ] Ошибки записи -- Настройте SetWriteErrorHandler для мониторинга ошибок записи
  • [ ] Фильтрующие горутины -- Мониторинг количества ActiveFilterGoroutines()
  • [ ] Статистика аудита -- Регулярно проверяйте статистику аудитных событий
  • [ ] Оповещения по кодам ошибок -- Настройте оповещения по кодам безопасности PATH_TRAVERSAL, REDOS_PATTERN и др.
go
logger.SetWriteErrorHandler(func(w io.Writer, err error) {
    metrics.WriteErrors.Inc()
    alert("Ошибка записи лога: " + err.Error())
})

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