我正在尝试使用 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 请求的下载服务器,我可以假设anonymous
和anonymous@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 %d
和time-format %H:%M:%S
。 transfer-time
以秒为单位记录,而 goaccess 仅支持微秒或毫秒分辨率,所以我们必须忽略它。remote-host
是必需的 goaccess 选项之一,并且%hfile-size
干净地映射到%b字节。filename
是原始 URL 路径(%U),因为完整的 http 请求%r没有用username
%e是随机垃圾,但为了完整性,我们将匹配completion-status
用这个作为状态会很好,但是 goaccess 需要 HTTP 状态代码,所以忽略了transfer-type
,,,,,,,special-action-flag
不会direction
被access-mode
使用service-name
authentication-method
authenticated-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