在访问日志中查找空白用户代理和欺骗性UA

时间:2012-11-10 22:18:59

标签: apache awk access-log

我正在尝试在我的apache访问日志中找到任何空白用户代理和欺骗用户代理的痕迹。

以下是我的访问日志中的典型行:(使用IP和域编辑)

x.x.x.x - - [10/Nov/2012:16:48:38 -0500] "GET /YLHicons/reverbnation50.png HTTP/1.1" 304 - "http://www.example.com/newaddtwitter.php" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/534.7 ZemanaAID/FFFF0077"

对于空白用户代理,我正在尝试这样做:

awk -F\" '($6 ~ /^-?$/)' /www/logs/www.example.com-access.log | awk '{print $1}' | sort | uniq

要查找有关UA的信息,我正在运行:(给我每个独特UA的点击量)

awk -F\" '{print $6}' /www/logs/www.example.com-access.log | sort | uniq -c | sort -fr

我可以做些什么来使这些命令更强大,更经过深思熟虑,同时向我提供最好的信息,以打击机器人和其他互联网败类?

1 个答案:

答案 0 :(得分:1)

我不会将\"用作字段分隔符。 CLF构造得很好,如果你在空格上分开,字段12就是你的用户代理的开始。如果$12 == '""',则用户代理为空。

请记住,awk可以接受标准输入。因此,您可以使用以下命令对Apache日志进行“实时”监控:

$ tail -F /path/to/access.log | /path/to/awkscript

请记住,当以这种方式调用时,awk脚本永远不会到达END。但是,您可以在Apache添加到日志中时处理行。

这样的事可能会有所帮助。如你所愿,加入它。

#!/usr/bin/awk -f

BEGIN {
  mailcmd="Mail -s \"Security report\" webmaster@example.com";
}

# Detect empty user-agent
$12 == "" {
  report="Empty user agent from " $1 "\n";
}

# Detect image hijacking
$7 ~ /\.(png|jpg)$/ && $11 !~ /^http:\/\/www.example.com\// {
  report=report "Possible hijacked image from " $1 " (" $11 " -> " $7 ")\n";
}

# Detect too many requests per second from one host
thissecond != $4 {
  delete count;
  thissecond=$4;
}
{
  count[$1]++;
  for (ip in count) {
    if (count[ip] > 100) {
      report=report "Too many requests from " $1 "\n";
      delete(count[ip]);  # Avoid too many reports
    }
  }
}

# Send report, if there is one
length(report) {
  print report | mailcmd;    # Pipe output through a command.
  close(mailcmd);            # Closing the pipe sends the mail.
  report="";                 # Blank the report, ready for next.
}

请注意,在特定秒内计算请求只是略有帮助;如果您有来自中国的大量流量,或防火墙后面的大学/企业网络,那么许多请求可能看起来来自单个IP地址。并且Mail命令不是处理通知的好方法;我把它包括在这里仅用于演示目的。 YMMV,盐味。