ブログに対するアクセス元を確認できるようにしたい
ということで、鋭意logstashの設定を行ってきたんですが、得られた結果がIPアドレスであり、geoipでアクセス元の国は押さえやすいんですが、どこのネットワークから来たのかの判別が難しかったりするため、DNSの逆引き処理を加えることにしました。
ありがたいことに、logstashにはDNS逆引きをする処理を組み込むことができます。
logstashの設定に埋め込む構文
太字箇所が関わるところで、今回ブログサイトはCloudFlareとUTMを中継してやってくるため、元々のクライアント情報はx_forwarded_forで拾わざるを得ず、その値はx_forwarded_for_realipと言う変数で受け取るようにしてました。
まず一旦これをx_forwarded_for_fqdnに複写します。
続いて、この変数を用いて逆引き名前解決を行い、得られたFQDNをx_forwarded_for_fqdnへ置換してしまいます。これにより、IPアドレスをキャッシュDNSサーバと照会して、FQDNを取り出すことができます。
filter { grok{ match => [ : ] add_field => { "ipversion" => "4" "syslog_received_at" => "%{@timestamp}" "x_forwarded_for_fqdn" => "%{x_forwarded_for_realip}" } } : dns { nameserver => [ "<キャッシュDNSサーバのIPアドレス>" ] hit_cache_size => 4096 hit_cache_ttl => 900 failed_cache_size => 512 failed_cache_ttl => 900 reverse => ["x_forwarded_for_fqdn"] action => replace } }
これによって、x_forwarded_for_fqdnを参照すればホスト名ベースでアクセス元がわかると。
実際に見てみる
それではkibanaで集計をとってみる。
無事、いくつかの凡例がIPアドレスではなく、FQDNになっていますと。
逆引きできなかったIPアドレスはIPアドレスのままになっていました。その場合、logstashのログにはこんなメッセージも出力されていたり。
[2018-04-03T00:32:40,655][ERROR][logstash.filters.dns ] DNS: timeout on resolving address. {:field=>"srcfqdn", :value=>"*****"}
実際には、逆引きできたのもあるはあるんですが、うまく複数のIPアドレスを分解できてないケースもあったりするため、引き続き内容の見直しを続ける必要がありそうです。
Comments are closed