如何使用 goaccess 分析 vsftpd 日志文件

如何使用 goaccess 分析 vsftpd 日志文件

我正在尝试使用 goaccess 日志分析工具来分析 vsftpd FTP 服务器的日志。我知道作为 Web 服务器日志分析器,goaccess 并不是最好的工具。话虽如此,它的日志格式足够灵活,我们已经用它来分析 Web 服务器的日志,所以我决定尝试一下。

默认情况下,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 请求的下载服务器,我可以假设anonymousanonymous@host是客户端为匿名 FTP 提供的任何内容。

我如何使用 goaccess 分析这个日志?

答案1

正如 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 %dtime-format %H:%M:%S
  • transfer-time以秒为单位记录,而 goaccess 仅支持微秒或毫秒分辨率,所以我们必须忽略它。
  • remote-host是必需的 goaccess 选项之一,并且%h
  • file-size干净地映射到%b字节。
  • filename是原始 URL 路径(%U),因为完整的 http 请求%r没有用
  • username%e是随机垃圾,但为了完整性,我们将匹配
  • completion-status用这个作为状态会很好,但是 goaccess 需要 HTTP 状态代码,所以忽略了
  • transfer-type,,,,,,,special-action-flag不会directionaccess-mode使用service-nameauthentication-methodauthenticated-user-id

goaccess 中解析 xferlog 的组合配置如下:

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

将这些行保存在文件(~/.goaccessrc)中,然后将其传递给 goaccess:

goaccess -p ~/.goaccessrc

相关内容