Чтение xferlog или расшифровка ftp-логов

Часто при работе с какой-либо программой мы не пользуемся некоторыми её возможностями.

Но иногда настаёт момент, когда эти возможности внезапно нужно использовать, а как, неизвестно.

На днях появилась задача расшифровать xferlog. Это такой лог, который ведет демон proftpd (FTP-сервер такой). С этим демоном автор работает довольно давно, но всегда довольствовался информацией из proftpd.log, который отображает кто, когда и куда авторизовался.

Когда же понадобилась детальная информация по тому, кто, куда, что залил/удалил/скачал, на помощь пришёл xferlog. Однако, открыв его, автору пришлось почесать лоб и отправиться гуглить на тему расшифровки лога.

Ибо в записи вида:
Sat May 05 10:41:25 2012 0 192.168.2.21 3370 /somedir/somefile.php b _ d r ftplogin ftp 0 * c
были ясны только дата происшествия, адрес виновника, размер файла, имя файла и логин FTP-аккаунта, остальные данные били лишь обычным набором значков.

Измученный кривыми запросами, Гугл наконец-таки выдал некоторую полезную информацию.

Итак, по порядку записи данные xferlog следует читать так:
1. Текущее время в формате DDD MMM dd hh:mm:ss YYYY
в нашем случае : Sat May 05 10:41:25 2012

2. Длительность трансфера в секундах
в нашем случае: 0

3. Адрес инициации трансфера
у нас: 192.168.2.21

4. Размер файла в байтах
наш случай: 3370

5. Полное имя файла
в нашем логе такое: /somedir/somefile.php

6. Тип трансфера в двух вариантах
— a (для передачи файлов в ASCII-типе)
— b (для передачи файлов в бинарном типе)
в нашем случае: b

7. Флаг спец. действия (один или несколько)
— C (файл был сжат)
— U (файл был рассжат)
— T (файл был затарен)
— _ (никаких действий не произведено)
наш лог показывал: _

8. Направление трансфера
— o (исходящий трансфер)
— i (входящий трансфер)
— d (удаление файла)
у нас залогировано: d

9. Вид доступа к серверу
— a (анонимный)
— r (аутентификация по логину и паролю)
наш лог сообщал: r

10. Имя пользователя
у нас: ftplogin

11. Имя сервиса, принявшего файл (обычно FTP)
поскольку других сервисов у нас и нет, в лог попало: ftp

12. Использованный метод аутентификации
— 0 (обычный)
— 1 (RFC931)
у нас: 0

13. Идентификатор авторизовавшегося пользователя. В случае, если такой ID недоступен, отдаётся * (звездочка), как и было в нашем случае.

14. Статус корректного завершения трансфера
— c (трансфер завершен)
— i (трансфер прерван).
у нас: c

Таким образом, нашу запись можно расшифровать так:
Sat May 05 10:41:25 2012 0 192.168.2.21 3370 /somedir/somefile.php b _ d r ftplogin ftp 0 * c
В субботу, 5 мая 2012 года, в 10:41 утра, за 0 секунд, на сервере с адреса 192.168.2.21, был успешно удалён файл, размером 3370 байт, с именем /somedir/somefile.php, при помощи сервиса FTP, обычной авторизации пользователя ftplogin, бинарного типа трансфера, без использования сжатия.

При написании заметки были использованы материалы сайтов:
linux.die.net
rollingr.net