目的
filebeatでプロキシサーバのログをlogstashへ送り、kibanaで分析/可視化できるようにする。
filebeatを使用したのは、proxy(squid)の設定で直接logstashを指定できるが何故がプロキシサーバ上のログファイルへの出力行数とkibanaで確認できる行数で差異が多かったため。
構成
環境
・squid:プロキシサーバ
・Filebeat:ログをlogstashに送る。
・Logstash:filebeatで受け取ったログをフィルタリングとラベル付け
・Elasticsearch:データのインデックス作成と保存
・kibana:データの可視化と分析
filebeatのインストール
リポジトリ追加
# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
# vi /etc/yum.repos.d/elastic.repo
■■■ 追加 ■■■
[elastic-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
■■■■■■■■■■■■■
インストール
# yum install filebeat
Filebeat設定
フィルター概要
■input
- type : log
- path : squidのアクセスログのpath指定
■output
- logstashのアドレスとポート番号
※ポート番号は logstashの設定ファイル作成時に任意のポート番号に変更可能
/etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
paths:
- /var/log/squid/access.log
output.logstash:
hosts: ["172.16.100.20:5044"]
起動登録
# systemctl enable filebeat
# systemctl start filebeat
squid設定
出力ログフォーマット
squid.confの抜粋
logformat access-lt %{%Y-%m-%d}tg %{%H:%M:%S}tl.%03tu %>a:%>p %ui %un %<A "%rm %ru HTTP/%rv" "%{Referer}>h" "%{User-Agent}>h" "%{Cookie}>h" %>Hs %>st %tr %<st %mt %Ss:%Sh
access_log /var/log/squid/access.log access-lt
logstash設定
フィルタ作成用Syslogについて
以下のプロキシサーバで出力される2種類のlogをもとにフィルタ作成した。
■タイプ1
2018-07-04 22:27:58.913 192.168.255.2:53009 - - www.yahoo.co.jp "CONNECT www.yahoo.co.jp:443 HTTP/1.1" "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" "-" 200 225 91 5514 - TCP_TUNNEL:HIER_DIRECT
■タイプ2
2018-07-04 22:36:28.587 192.168.255.2:54182 - - www.yoheim.net "GET http://www.yoheim.net/blog.php? HTTP/1.1" "https://www.google.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0" "-" 301 407 97 581 text/html TCP_MISS:HIER_DIRECT
フィルター作成/設定
フィルター概要
■input ※filebeatから受け取る設定
- port : 5044
- type : beats
■filter
- grok条件
→上記のログ2種類がmatch条件に適用できる設定
→メッセージのフィールドを分離するフィルタ作成)
- useragent は分離してくれる設定があるので、その設定を適用した。
■output
- elasticsearchのアドレスとポート指定
- indexパターンを指定
Grokのmatch条件を作成するときに参考にしたサイト
logstash-patterns-core/grok-patterns at master · logstash-plugins/logstash-patterns-core · GitHub
→生ログに対してGrokをリアルタイムで判断しの解析するので作成時に役立ちます。
フィルターの内容
/etc/logstash/conf.d/01-squid.conf
#match条件を修正。
また、スマホからの通信で"一部のアプリで実装しているブラウザ" , "keepalive?"みたいな周期的や突発的に出力されている謎通信(これもアプリ?)" でfilter条件に一致しないパターンがあるので、まだ修正が必要。
input {
beats {
port => "5044"
type => "beats"
}
}
filter {
if [type] == "beats" {
grok {
match => [ "message", "%{TIMESTAMP_ISO8601:s_timestamp} %{IPORHOST:src_ip}:%{POSINT:src_port} %{USER:ident} %{USER:auth} %{USERNAME:req_domain} \"%{DATA:method} %{NOTSPACE:request} (?:HTTP/%{NUMBER:httpversion})\" \"%{NOTSPACE:referer}\" \"%{DATA:send_headers}\" \"%{DATA:cookes}\" %{INT:request_code} %{INT:request_size} %{INT:response_time} %{INT:response_size} %{DATA:mime} %{GREEDYDATA:squid_status}" ]
}
date{
match => ["s_timestamp" , "yyyy-MM-dd_HH-mm-ss.SSS"]
timezone => "Asia/Tokyo"
}
useragent {
source => "send_headers"
target => "useragent"
}
}
}
output {
if [type] == "beats" {
elasticsearch {
hosts => ["172.16.100.30:9200"]
index => "squid-%{+YYYY.MM}"
}
}
}
logstash再起動
■再起動
# systemctl restart logstash
■起動時ログ確認
# tail -f /var/log/logstash/logstash-plain.log
→フィルタの文法や構文が間違えているとエラーで起動しないが、データ型指定が間違えていると正常に起動し、kibanaで確認したときにデータがフィルタされない
kibana確認
logstashで指定したindexをkibanaへ取り込む
Discoverでログ取得確認
yahooにアクセスしたときのログ
useragentの情報も各テーブルごとに区切られて作成された。