Назад | Перейти на главную страницу

Как анализировать лог-файлы vsftpd с помощью goaccess

Я пытаюсь использовать инструмент анализа журнала goaccess для анализа журналов FTP-сервера vsftpd. Я знаю, что будучи анализатором журналов веб-сервера, goaccess - не лучший инструмент для этого. При этом он достаточно гибкий с форматом журнала, и мы уже используем его для анализа журнала веб-сервера, поэтому я решил попробовать.

По умолчанию у vsftpd очень болтливый журнал:

Mon Mar 23 06:00:00 2020 [pid 11111] CONNECT: Client "1.1.1.1"
Mon Mar 23 06:00:00 2020 [pid 11111] [ftp] OK LOGIN: Client "1.1.1.1", anon password "blablabla"
Mon Mar 23 06:00:00 2020 [pid 11111] [ftp] FAIL DOWNLOAD: Client "1.1.1.1", "/file1", 0.00Kbyte/sec
Mon Mar 23 06:00:00 2020 [pid 11111] [ftp] OK DOWNLOAD: Client "1.1.1.1", "/file2", 17500 bytes, 203.15Kbyte/sec

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

# /etc/vsftpd.conf
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log

Теперь у меня есть следующие строки журнала.

Sat Mar 28 06:00:00 2020 1 1.1.1.1 17500 /file1 b _ o a anonymous ftp 0 * c
Sat Mar 28 06:00:00 2020 1 1.1.1.1 0 /file2 b _ o a anonymous@host ftp 0 * i

Поскольку это сервер загрузки, получающий только анонимные и пассивные FTP-запросы, я могу предположить, что anonymous и anonymous@host все, что клиент предоставляет для анонимного FTP.

Как я могу проанализировать этот журнал с помощью goaccess?

Как упоминалось в документации vsftpd, формат xferlog используется различным серверным программным обеспечением. документы proftpd есть описание формата.

Вкратце поля в каждой строке называются:

current-time transfer-time remote-host file-size filename transfer-type ↩ 
  special-action-flag direction   access-mode username service-name ↩ 
  authentication-method authenticated-user-id completion-status

Итак, ваш пример,

Sat Mar 28 06:00:00 2020 1 1.1.1.1 17500 /file1 b _ o a anonymous ftp 0 * c

соответствует этим полям:

current-time: Sat Mar 28 06:00:00 2020 
transfer-time: 1
remote-host: 1.1.1.1
file-size: 17500
filename: /file1
transfer-type: b (binary)
special-action-flag: _ (no compression)
direction: o (outgoing, this will be always 'o' for a download only server)
access-mode: a (anonymous)
username:  whatever the client provides for anonymous FTP
service-name: ftp
authentication-method: 0 (none)
authenticated-user-id: * (none)
completion-status: c (completed) or i (incomplete)

Теперь мы можем попробовать сопоставить различные поля журнала с тем, что принимает goaccess, внимательно изучив единицы и игнорируя все, что не применимо с % ^ спецификатор формата:

  • Отметка времени проблематична, поскольку время чередуется между днем ​​и годом. К счастью, игнорирование года работает нормально в goaccess. У вас могут быть проблемы в новогодние праздники или около них. Мы будем использовать date-format %a %b %d и time-format %H:%M:%S.
  • transfer-time регистрируется в секундах, в то время как goaccess поддерживает только микро- или миллисекундное разрешение, поэтому нам придется игнорировать его.
  • remote-host является одним из обязательных вариантов доступа к Goaccess и является %час
  • file-size карты чисто на % b в байтах.
  • filename это необработанный путь URL (% U), как полный http-запрос не будет полезно
  • username случайный мусор, но мы сопоставим его % e для полноты
  • completion-status было бы неплохо использовать это как статус, но goaccess ожидает коды статуса HTTP, поэтому игнорируется
  • transfer-type, special-action-flag, direction, access-mode, service-name, authentication-method, authenticated-user-id не будет использоваться

Комбинированный конфиг для разбора xferlog в goaccess будет:

log-format %d %t %^ %^ %h %b %U %^ %^ %^ %^ %e %^ %^ %^ %^
date-format %a %b %d
time-format %H:%M:%S

Сохраните эти строки в файле (~/.goaccessrc) и передайте его в goaccess с помощью:

goaccess -p ~/.goaccessrc