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