Аудитные логи
DD предоставляет функцию асинхронных аудитных логов для записи событий, связанных с безопасностью, с поддержкой подписей целостности и отслеживания серийных номеров записей.
AuditLogger
Асинхронный регистратор событий аудита безопасности.
Создание
func NewAuditLogger(cfg AuditConfig) (*AuditLogger, error)Создаёт асинхронный регистратор аудита с переданной AuditConfig. Можно использовать DefaultAuditConfig() для получения конфигурации с разумными значениями по умолчанию.
Случаи возврата ошибки: неудача проверки конфигурации (например, отрицательный BufferSize).
// С конфигурацией по умолчанию
auditLogger, _ := dd.NewAuditLogger(dd.DefaultAuditConfig())
// С пользовательской конфигурацией
cfg := dd.DefaultAuditConfig()
cfg.JSONFormat = true
cfg.MinimumSeverity = dd.AuditSeverityWarning
auditLogger, _ := dd.NewAuditLogger(cfg)Методы
| Метод | Сигнатура | Описание |
|---|---|---|
Log | (event AuditEvent) | Записать аудитное событие (асинхронно) |
LogSensitiveDataRedaction | (pattern, field, message string) | Событие маскирования конфиденциальных данных |
LogRateLimitExceeded | (message string, metadata map[string]any) | Событие ограничения скорости |
LogSecurityViolation | (violationType, message string, metadata map[string]any) | Событие нарушения безопасности |
LogReDoSAttempt | (pattern, message string) | Событие атаки ReDoS |
LogIntegrityViolation | (message string, metadata map[string]any) | Событие нарушения целостности |
LogPathTraversalAttempt | (path, message string) | Событие обхода пути |
Stats | () AuditStats | Статистика аудита |
Close | () error | Закрытие и сброс оставшихся событий |
Пример использования
audit, _ := dd.NewAuditLogger(dd.DefaultAuditConfig())
defer audit.Close()
// Запись маскирования конфиденциальных данных
audit.LogSensitiveDataRedaction("password", "login_form", "Обнаружено открытое поле пароля")
// Запись ограничения скорости
audit.LogRateLimitExceeded("Превышен лимит API-запросов", map[string]any{
"client_ip": "192.168.1.100",
"limit": 100,
"current": 150,
})
// Запись нарушения безопасности
audit.LogSecurityViolation("sql_injection", "Попытка SQL-инъекции", map[string]any{
"input": "' OR 1=1 --",
})AuditConfig
Конфигурация аудитных логов.
type AuditConfig struct {
Enabled bool // Включить аудит (по умолчанию true)
Output *os.File // Файл вывода (по умолчанию os.Stderr); при nil вывод не производится, события только учитываются в статистике
BufferSize int // Размер буфера асинхронных событий (по умолчанию 1000; отрицательное значение приведёт к неудаче проверки)
IncludeTimestamp bool // Включать временную метку (по умолчанию true)
JSONFormat bool // Вывод в формате JSON (по умолчанию true)
MinimumSeverity AuditSeverity // Минимальный уровень серьёзности записи (по умолчанию AuditSeverityInfo)
IntegritySigner *IntegritySigner // Подписывающее устройство целостности (опционально; при настройке каждая аудитная запись подписывается)
}Конфигурация по умолчанию
func DefaultAuditConfig() AuditConfigВозвращает конфигурацию аудита по умолчанию, аудитные логи включены по умолчанию.
Методы
| Метод | Сигнатура | Описание |
|---|---|---|
Validate | () error | Проверить корректность конфигурации (при отрицательном BufferSize возвращает ошибку) |
Clone | () AuditConfig | Копировать конфигурацию (IntegritySigner — разделяемая ссылка, глубокого копирования нет) |
AuditEvent
Структура аудитного события.
type AuditEvent struct {
Type AuditEventType `json:"type"`
Timestamp time.Time `json:"timestamp"`
Message string `json:"message"`
Pattern string `json:"pattern,omitempty"`
Field string `json:"field,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
Severity AuditSeverity `json:"severity"`
}AuditStats
Структура статистики аудита.
type AuditStats struct {
TotalEvents int64 // Общее количество событий
Dropped int64 // Количество отброшенных событий (накапливается при переполнении буфера)
ByType map[AuditEventType]int64 // Статистика по типам
BufferSize int // Размер буфера
BufferUsage int // Текущее использование буфера
}AuditVerificationResult
Результат проверки аудита.
type AuditVerificationResult struct {
Valid bool // Прошла ли проверка
Event *AuditEvent // Распарсенное событие
RawEvent string // Исходная строка события
Error error // Ошибка проверки
}Типы аудитных событий
| Константа | String() | Описание |
|---|---|---|
AuditEventSensitiveDataRedacted | "SENSITIVE_DATA_REDACTED" | Конфиденциальные данные замаскированы |
AuditEventRateLimitExceeded | "RATE_LIMIT_EXCEEDED" | Превышение ограничения скорости |
AuditEventReDoSAttempt | "REDOS_ATTEMPT" | Попытка атаки ReDoS |
AuditEventSecurityViolation | "SECURITY_VIOLATION" | Нарушение безопасности |
AuditEventIntegrityViolation | "INTEGRITY_VIOLATION" | Нарушение целостности |
AuditEventInputSanitized | "INPUT_SANITIZED" | Входные данные очищены |
AuditEventPathTraversalAttempt | "PATH_TRAVERSAL_ATTEMPT" | Попытка обхода пути |
AuditEventLog4ShellAttempt | "LOG4SHELL_ATTEMPT" | Попытка атаки Log4Shell |
AuditEventNullByteInjection | "NULL_BYTE_INJECTION" | Инъекция null-байта |
AuditEventOverlongEncoding | "OVERLONG_ENCODING" | Атака сверхдлинной кодировкой |
AuditEventHomographAttack | "HOMOGRAPH_ATTACK" | Атака гомоглифами |
Уровни серьёзности аудита
| Константа | String() | Описание |
|---|---|---|
AuditSeverityInfo | "INFO" | Информация |
AuditSeverityWarning | "WARNING" | Предупреждение |
AuditSeverityError | "ERROR" | Ошибка |
AuditSeverityCritical | "CRITICAL" | Критический |
MarshalJSON
func (s AuditSeverity) MarshalJSON() ([]byte, error)AuditSeverity реализует интерфейс json.Marshaler, при JSON-сериализации выводит строку, а не число:
event := dd.AuditEvent{
Type: dd.AuditEventSecurityViolation,
Severity: dd.AuditSeverityCritical,
}
data, _ := json.Marshal(event)
// Severity сериализуется как "CRITICAL", а не 3Проверка аудитных записей
func VerifyAuditEvent(entry string, signer *IntegritySigner) *AuditVerificationResultПроверка целостности записи аудитного лога.
cfg, _ := dd.DefaultIntegrityConfigSafe()
signer, _ := dd.NewIntegritySigner(cfg)
result := dd.VerifyAuditEvent(logEntry, signer)
if result != nil && result.Valid {
fmt.Println("Аудитная запись прошла проверку")
}Следующие шаги
- Подписи целостности -- подробное описание IntegritySigner
- Фильтрация безопасности -- фильтрация конфиденциальных данных
- Система хуков -- хук OnError