Я пытаюсь использовать инструмент анализа журнала 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, внимательно изучив единицы и игнорируя все, что не применимо с % ^ спецификатор формата:
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