GeoIPとELK(Elasticsearch、Logstash、Kibana)を使ったユーザーの位置情報のマッピング方法
紹介
IPジオロケーションとは、IPアドレスの物理的な場所を特定するためのプロセスであり、コンテンツのパーソナライズやトラフィック分析など、さまざまな目的に活用できます。ジオロケーションによるトラフィック分析は、ユーザーの出所を簡単に把握できるため、ユーザー基盤について貴重な洞察を提供します。これにより、アプリケーションサーバーの理想的な地理的ロケーションや現在のオーディエンスについて情報に基づいた意思決定が可能になります。
このチュートリアルでは、Elasticsearch、Logstash、Kibanaを使用して、アプリケーションのユーザーのIPアドレスの視覚的な地図を作成する方法を示します。
これがすべての仕組みの簡単な説明です。LogstashはGeoIPデータベースを使用して、IPアドレスを緯度と経度の座標ペア、つまりIPアドレスの大まかな物理的配置に変換します。座標データはElasticsearchのgeo_pointフィールドに保存され、geohash文字列にも変換されます。次に、KibanaはGeohash文字列を読み取り、それらを地球の地図上のポイントとして描画します。Kibana 4では、これをタイルマップの視覚化と呼びます。
さあ、今は前提条件を見てみましょう。
前提条件
このチュートリアルに従うためには、動作するELKスタックが必要です。さらに、フィールドにフィルタリングできるIPアドレスを含むログ(ウェブサーバーのアクセスログなど)が必要です。これらの2つがまだない場合は、このシリーズの最初の2つのチュートリアルを参照できます。最初のチュートリアルではELKスタックをセットアップし、2番目のチュートリアルではNginxまたはApacheのアクセスログを収集しフィルタリングする方法を示します。
- Ubuntu 14.04 に Elasticsearch、Logstash、および Kibana 4 をインストールする方法
- 集中ログ記録を改善するためのLogstashフィルタの追加
Filebeatインデックスにgeo_pointマッピングを追加する
必要なチュートリアルに従ったと仮定すると、あなたはすでにこれを行っています。しかし、TileMapの視覚化はあなたのGeoIP座標がElasticsearchにgeo_pointタイプとして保存されることを必要とするため、スキップした場合に備えてこのステップを再度含めています。
Elasticsearch がインストールされているサーバーで、Filebeat インデックステンプレートをホームディレクトリにダウンロードします:
- cd ~
- curl -O https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json
次に、このコマンドでテンプレートをElasticsearchにロードします:
- curl -XPUT 'http://localhost:9200/_template/filebeat' -d@filebeat-index-template.json
GeoIPを使用するためにLogstashを設定する
GeoIP座標をLogstashに保存させるには、フィルタリングできる公開IPアドレスを含むログを生成するアプリケーションを特定する必要があります。この情報を持つログを生成する一般的なアプリケーションは、NginxやApacheなどのWebサーバーです。ここではNginxのアクセスログを例として使用します。異なるログを使用している場合は、例に必要な調整を行ってください。
Logstashにフィルターを追加するチュートリアルでは、Nginxフィルターは11-nginx-filter.confという名前のファイルに保存されています。フィルターが別の場所にある場合は、そのファイルを編集してください。
さあ、Nginxフィルターを編集しましょう:
- sudo vi /etc/logstash/conf.d/11-nginx-filter.conf
grok セクションの下に、次のハイライト部分を追加してください:
filter {
if [type] == "nginx-access" {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
geoip {
source => "clientip"
}
}
}
この設定は、clientipフィールドに保存されているIPアドレスを変換するフィルターを構成します(sourceで指定)。sourceをclientipとして指定するのは、NginxユーザーのIPアドレスが保存されているフィールドの名前だからです。別のフィールドにIPアドレス情報を保存している場合は、この値を必ず変更してください。
保存して終了します。
変更を適用するために、Logstashを再起動しましょう:
- sudo service logstash restart
すべてが正しく設定されていれば、Logstashは今、Nginxのアクセスログ(またはログを生成しているアプリケーション)にGeoIP座標を保存しているはずです。この変更は遡及的ではないため、以前に収集したログにはGeoIP情報が追加されていないことに注意してください。KibanaでGeoIP機能が正しく動作しているか確認しましょう。
Kibanaに接続する
GeoIPが有効になっているかどうかを確認する最も簡単な方法は、WebブラウザでKibanaを開くことです。今すぐそれを行ってください。
GeoIPモジュールをLogstashで有効にして以来、アプリケーションが生成したログメッセージを見つけてください。Nginxの例に従って、type: "nginx-access"を使用してKibanaでログの選択を絞ることができます。
次に、メッセージの1つを展開してフィールドのテーブルを確認してください。IPアドレスが実際の地理的な位置にどのようにマッピングされたかについての情報を含む新しいgeoipフィールドがいくつか表示されるはずです。例えば:
注: ログが見えない場合は、アプリケーションにアクセスしていくつか生成し、時間フィルターが最近の時間に設定されていることを確認してください。
KibanaはすべてのIPアドレスのジオロケーションを解決できない場合があることにも注意してください。もし1つのアドレスだけでテストしていて、それがうまく機能していないようなら、トラブルシューティングを行う前に他のアドレスも試してみてください。
もし、すべての作業の後で、GeoIP情報が見えない(または不正確である)場合、Logstashを正しく設定していない可能性があります。
このビューに適切なGeoIP情報が表示されている場合は、マップビジュアライゼーションを作成する準備ができています。
タイルマップビジュアライゼーションを作成する
注意: まだ Kibana のビジュアライゼーションを使用していない場合は、Kibana ダッシュボードとビジュアライゼーションのチュートリアルを確認してください。
KibanaでIPアドレスをマッピングするために、タイルマップのビジュアライゼーションを作成しましょう。
視覚化をメインメニューでクリックしてください。
「新しいビジュアリゼーションを作成する」セクションで、「タイルマップ」を選択します。
検索ソースを選択の下で、任意のオプションを選択できます。マッピングしたいログメッセージを見つける保存された検索がある場合、その検索を選択しても構いません。新しい検索からクリックしたかのように進めます。
インデックスパターンを選択するよう求められたら、ドロップダウンからfilebeat-*を選択してください。これにより、空の地図が表示されるページに移動します:
検索バーにtype: nginx-accessまたはgeoip情報を含むログに一致する他の検索用語を入力します。時間範囲(ページの右上隅)がいくつかのログエントリと一致するのに十分であることを確認してください。地図の代わりに結果が見つかりませんと表示された場合は、検索用語または時間を更新する必要があります。
いくつかの結果が得られたら、左側の列のbucketsヘッダーの下にあるGeo Coordinatesをクリックしてください。緑の「再生」ボタンがアクティブになります。それをクリックすると、あなたの地理的な位置が地図にプロットされます:
ビジュアライゼーションに満足したら、検索バーの隣にあるビジュアライゼーションを保存ボタン(フロッピーディスクアイコン)を使用して必ず保存してください。
結論
KibanaでGeoIP情報がマッピングされたので、これで準備が整ったはずです。それ自体でも、ユーザーの地理的な位置の大まかなアイデアを提供してくれます。他のログと関連付けてダッシュボードに追加すれば、さらに役立つでしょう。
頑張って!


