備忘録/にわかエンジニアが好きなように書く

個人的にとりあえず仕組みを知りたいから勉強になる?ってことで、 (利便性無視で)触りたように好きに構築してみる 個人用の備忘録となるので内容の保証はないのでその点はご了承ください。 ※変な内容や間違いを書いているなどありましたらコメントやご指摘いただけると幸いです。

Squidのログを "filebeat > logstash > elasticsearch > kibana" で可視化する

目的

filebeatでプロキシサーバのログをlogstashへ送り、kibanaで分析/可視化できるようにする。

filebeatを使用したのは、proxy(squid)の設定で直接logstashを指定できるが何故がプロキシサーバ上のログファイルへの出力行数とkibanaで確認できる行数で差異が多かったため。

構成

f:id:pocket01:20180704214335p:plain

環境

 ・squid:プロキシサーバ
 ・Filebeat:ログをlogstashに送る。
 ・Logstash:filebeatで受け取ったログをフィルタリングとラベル付け
 ・Elasticsearch:データのインデックス作成と保存
 ・kibana:データの可視化と分析

 

filebeatのインストール

www.elastic.co

リポジトリ追加

# 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 Debugger 

→生ログに対して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にアクセスしたときのログ

f:id:pocket01:20180704231734p:plain

 useragentの情報も各テーブルごとに区切られて作成された。