125
Norikra + Fluentd + Elasticsearch + Kibana リリリリリリリリリリリリリリリ リリリリリリリリリリリ 2015.3 リリリリリリリリリリ リリ リリ

Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Embed Size (px)

Citation preview

Page 1: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Norikra + Fluentd

+ Elasticsearch + Kibana

リアルタイムストリーミング処理ログ集計による異常検知

2015.3

次世代システム研究室松井 大介

Page 2: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

短期の開発で不正検知の仕組みを

導入しようとしたとき、Norikraでなんとかしてみたよ

っていう話です。

Page 3: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

アジェンダ

• 不正検知システム• リアルタイムストリーミング Norikra• Fluentd + Elasticsearch + kibana + Norikra の連携方法

Page 4: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

不正アクセス検知

Page 5: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

急増する Web サイトへの攻撃

https://www.flickr.com/photos/peosoldier/16783585692/

Page 6: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

引用元 http://d.hatena.ne.jp/Kango/20141229/1419867498

年間40件以上

Page 7: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

引用元 http://d.hatena.ne.jp/Kango/20141229/1419867498

金銭被害

Page 8: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

身近にある攻撃

https://www.flickr.com/photos/peosoldier/16842615552/

Page 9: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

某社の事例パスワードリスト攻撃の件数

(別資料でデモ)

Page 10: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

狙われるサービス

・ポイントの現金化が可能。 Amazon ギフト券や Edy 、 Suica ポイントなど、足のつきにくいものが狙われる。

・攻撃時はアカウントの選別だけ行い、後日別の ISP からポイント交換に来る。

・一部情報が流出すると、関連する類似サービスに対して攻撃される!

Page 11: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

いいたいこと

・インターネットサービスは日常的に攻撃を受けている。

(身近なサービスが結構攻撃を受けている)

・サービス規模や知名度に関わらず金銭が絡むものは危険度が非常に高い。

・「攻撃されるかも」ではなく「いつか必ず攻撃される」という認識が必要。

Page 12: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

開発期間実質 1ヶ月で先ほどの例にあったサービスと連携することに ...!

Page 13: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

いいたいこと

• 不正検知するために何らかの仕組みが いますぐに必要• プロジェクトの規模(予算・人員)的に 簡易的に導入できる仕組みが必要

Page 14: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

不正検知システム

https://www.flickr.com/photos/peosoldier/16482691982/

Page 15: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

[ 本気度 低 ] 単純なログ検知

[ 本気度 中 ] 詳細なログ検知

[ 本気度 高 ] リスクベース認証

Page 16: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

[ 本気度 低 ]単純なログ検知

Page 17: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

おなじみ監視ツール( Zabbix, Nagios など)で、単純に ERROR などの文字列を監視する。

一定回数以上エラーが出ていた場合にアラートなどの処理を走らせる。

Page 18: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

監視ツール

長所 [ 低コスト ] ほぼ 100 %のシステムでは監視を導入するの

で、設定すれば準備できる。

短所 [ 防御力低 ] IP やユーザ ID などの動的な条件を組み込むこ

とが難しい。

Page 19: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

[ 本気度 中 ]詳細なログ検知

Page 20: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

謹製 不正ログイン検知システム(別資料でデモ)

Page 21: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

自社の作り込みシステム

長所 [ 必要条件を満たす ] 可視化+詳細な監視の実現 短所 [ コスト ] 作り込みのコストが高い。 ・アプリの内部の改修 ・バッチの処理モジュールの開発

Page 22: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

[ 本気度 高 ]リスクベース認証

Page 23: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

リスクベース認証リスクベース認証とは、ユーザーの環境情報や行動パターンを分析して、リスクを判定したうえで認証を課す方式だ。つまり、 IP アドレスや経由 ISP など、いつもと同じユーザー情報でアクセスがあった場合は固定パスワードで認証。いつもと違うユーザー情報でアクセスがあった場合は、パスワードを盗まれたりしたリスクが高いとして、あらかじめ登録しておいた追加の質問に回答させる(追加認証する)。

http://special.nikkeibp.co.jp/ts/article/aa0h/111209/

Page 24: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

たとえば CAPTCHA

http://ascii.jp/elem/000/000/483/483759/

Page 25: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

いつもと違うアクセスがあった場合に検知!?

Page 26: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

データマイニング

https://www.flickr.com/photos/idfonline/16568645675/

Page 27: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

「データあるところに異常あり」

データ分析の手法いろいろ・外れ値検知・変化点検知・異常状態検知

Page 28: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

外れ値検知

http://research.preferred.jp/2013/01/outlier/

Page 29: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

変化点検知

http://www.slideshare.net/yokkuns/ss-8425312

Page 30: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

異常発生検知

http://www.slideshare.net/yokkuns/ss-9031918

Page 31: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

実現手法いろいろ

Page 32: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

ちょっとどれも本気すぎる。。

Page 33: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

データマイニング

長所 さまざまな異常を検知できる。 準リアルタイムで検知!

短所 今回はオーバースペック?! (システム規模に合ってない) (研究中の分野を含み簡易的に実現できない)

Page 34: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

現状わずか 6台しかない

管理者

ユーザ

店舗一覧

DBサーバ

Web APサーバ

nginx+ php

監視サーバ

Page 35: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

開発の期間が短い

Page 36: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

選定のポイント

• 導入コスト サーバ少なくても動く なるべく実装しない• 運用コスト 仕様変更しやすい• 引継ぎコスト 誰でもわかる

Page 37: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

ターゲット

本気度 長所 短所 狙い

単純なログ監視 ・導入楽 ・カスタマイズ性弱・検知網羅性弱

詳細なログ監視・細かい設定可能

・自動禁止可能・可視化可能

・アプリ開発コスト高

・通常のアクセスを見抜けない

リスクベース認証

・複雑なケースに対応可能

・データマイニング導入開発コスト高

このあたりを低コストで

Page 38: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

いいたいこと

• 本気度別にざっくり低中高がある。• 本気を出せば、きりがない。• 規模感に応じてベターな方法を探す。

Page 39: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

_人人人人人人人人_> 突然の Norikra < ̄ Y^Y^Y^Y^Y^Y^ ̄

 

Page 40: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

アジェンダ

• 不正検知システム• リアルタイムストリーミング Norikra• Flunentd + Elasticsearch + kibana + Norikra

Page 41: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

乗鞍岳

Page 42: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知
Page 43: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Norikra とは

• 田籠氏が開発(元 LINE 、現 TD )• 2014年 5月に v1.0.0• リアルタイムストリーミングエンジン• jRuby ( JVM )• バックエンド Esper ( Java ライブラリ)• Google 、 CyberAngent 、ドワンゴ各社が採用• Hadoop 規模以下のケースでログ集計、 Hadoop

の前段でのログ集計事例など事例多数

Page 44: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

特徴

• Fluentd からログを受け取って ストリーミング集計して再転送• SQL ライクな集計処理記述• スキーマレスなデータ読み込み• JOIN 、 Subquery 、ユーザ定義関数• 再起動不要で集計処理追加可能• ストレージなし

Page 45: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

利用用途

• リアルタイムエラーログ集計• バッチ集計前リアルタイム加工• 過去データ集計

Page 46: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

ターゲット

本気度 長所 短所 狙い

単純なログ監視 ・導入楽 ・カスタマイズ性弱・検知網羅性弱

詳細なログ監視・細かい設定可能

・自動禁止可能・可視化可能

・アプリ開発コスト高

・通常のアクセスを見抜けない

Norikra がつかえそ

うリスクベース認

証・複雑なケースに

対応可能・データマイニング導入開発コスト高

Page 47: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

システム構成とデータフロー

Page 48: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

基本構成

Nginx

fluentd

Norikra

Elasticsearch+ kibana

LOG サーバ

fluentd

MariaDB

不正アクセス アクセス禁止

Page 49: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

NginxConf

Nginxaccess_log

BAN 処理out_exec_filter

Elasticseach

out_elasticsearch

ログ→集計→ IP 特定→ BAN

※http://dev.classmethod.jp/cloud/aws/block_dos_attack_by_norikra/ を参考にさせていただきました。

Page 50: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

{"remote_addr":"10.132.3.16","count":101}{"remote_addr":"10.132.3.21","count“:220}

select remote_addr , COUNT(*) as countfrom access.win:time_batch(1 min)group by remote_addrhaving count(*) > 1000

{ "time":"2015-03-29T22:17:37+09:00" , "remote_addr":"10.132.3.21" , "request_method":"GET" , "request_length":"176" , "request_uri":"/" , "https":"" ,

"uri":"/index.html" , "query_string":"-" , "status":"200" , "bytes_sent":"255" , "body_bytes_sent":"7" , "referer":"-" , "useragent":"curl/7.19.7 (x86_64-redhat-linux-gnu)

libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" , "forwardedfor":"-" , "request_time":"0.000" , "upstream_response_time":"-" , "request_body":"-" }

Nginx

Norikra

Fluentd

Fluentd

動的なイベント登録+スキーマ解釈

Fluentd 経由でイベント発火

Page 51: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Nginx : アクセスの受付、ログ出力

Fluentd : ログ転送、 IPBAN 処理発火

Norikra : 集計

Elasticsearch+kibana : 可視化

Page 52: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

説明が長くなりそうなのでここでデモ

Page 53: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

検知のために設定すること

Page 54: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

GUI でクエリ登録だけ

Page 55: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

今回のターゲット

攻撃元 IP をリアルタイムストリーミング

で特定する。

Page 56: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

http://aaa.bbb.ccc.15/index.html に攻撃⇒ Norikraで検知して IPをBAN設定を自動反映

攻撃サーバ 5台 Nginxサーバ

LOGサーバ(Norikra)

Page 57: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

デモ

• 通常アクセスを Kibana で可視化( IP別)

• Norikra クエリを GUI で設定

• 攻撃アクセスの IP と HTTP ステータスをKibana で可視化

Page 58: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

これから詳細を紐解いていきます

Page 59: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

目指す世界

• サービス規模に適したプロダクト• 極力開発せずに実現する集計( SQL )• 簡単なインストール• シンプルなインターフェース

Page 60: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

サービス規模に適したプロダクト

Page 61: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

不正検知におけるログ集計

[ リアルタイム集計 ]不正アクセスの IP を準リアルタイムで集計して特定。

[ バッチ集計 ]不正 IP をあとで解除。

Page 62: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

バッチとストリームの共存(ラムダアーキテクチャ)

バッチ ストリーム単位 1 時間~数日 秒~数時間処理量 G 単位 K ~ M 単位処理時間 数十秒~時間 ミリ秒長所 大量処理 高速処理短所 重い メモリに乗る範囲プロダクト RDB

Hadoop BigQuery RedshiftElasticsearch

KafkaStormSpark StreamingKinesisElasticsearchNorikra

Page 63: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

サービス規模に応じたリアルタイムストリーミング

負荷レベル サーバ VM数

プロダクト1Gbps 以上100 万 req/s 以上

10 台以上 KafkaStormSpark Streaming

上記のレベルに達しない場合

1 台~ Norikra小規模ならNorikra

Elasticsearchでラムダができる

Page 64: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

高トラフィック時のパフォーマンス検証

このぐらいまで無問題秒間 1 万アクセス1 分 60 万アクセス

1 日 5 億~ 10 億アクセス

Page 65: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

[競合製品 ]Fluent-plugin-datacounter

同じく田籠氏のストリーミング処理 プラグイン

Fluentd は Ruby ( CRuby )のため、複数プロセスの動作不可能

複数プロセス間でデータ集計のタイミングがずれる。(回避策はあるものの対応コストがかかる)

Norikra のほうが優勢

Page 66: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Elasticsearch だけでも準リアルタイムできるのでは?

Page 67: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Elasticsearch の生クエリはかなりわかりずらい。。

{ "size": 500, "sort": { "@timestamp": "desc" }, "query": { "filtered": { "query": { "query_string": { "analyze_wildcard": true, "query": "*" } }, "filter": { "bool": { "must": [ { "range": { "@timestamp": { "gte": 1427696454189, "lte": 1427697354189 } } } ], "must_not": [] } } } }, "highlight": { "pre_tags": [ "@kibana-highlighted-field@" ], "post_tags": [ "@/kibana-highlighted-field@" ], "fields": { "*": {} } }, "aggs": { "2": { "date_histogram": { "field": "@timestamp", "interval": "30s", "pre_zone": "+09:00", "pre_zone_adjust_large_interval": true, "min_doc_count": 0, "extended_bounds": { "min": 1427696454189, "max": 1427697354189 } } } }, "fields": [ "*", "_source" ], "script_fields": {}, "fielddata_fields": [ "@timestamp" ]}

Page 68: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Norikra は普通の SQL を使ってます!

select remote_addr , COUNT(*) as countfrom access_admin.win:time_batch(1 min)group by remote_addrhaving count(*) > 1000

Page 69: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

SQL はわかりやすい

https://www.flickr.com/photos/soldiersmediacenter/14113034008/

Page 70: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Nginx : アクセスの受付、ログ出力

Fluentd : ログ転送、 IPBAN 処理発火

Norikra : 集計

Elasticsearch+kibana : 可視化

SQLで実現できる

Page 71: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

SQL ライクな集計を支えるEsper

a highly scalable, memory-efficient, in-memory computing, SQL-standard, minimal latency, real-time streaming-capable Big Data processing engine for historical data, or medium to high-velocity data and high-variety data.

Page 72: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

「 3 つシステムログを JOIN して 5 分以内に

同時ログインしたユーザ ID を抽出」

Page 73: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

「来るべきイベントが届いてない、 または遅れて届いた」

特殊な検知も対応できそう

Page 74: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

SQL プロダクトの流行

Stream BatchSQL Norikra

Spark SQLHiveImplara

Non SQL KafkaStromSpark Streaming

MapReduce

SQL は影響力大きい

Page 75: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

ターゲット

本気度 長所 短所 狙い

単純なログ監視 ・導入楽 ・カスタマイズ性弱・検知網羅性弱

詳細なログ監視・細かい設定可能

・自動禁止可能・可視化可能

・アプリ開発コスト高

・通常のアクセスを見抜けない

ほぼほぼ実現

リスクベース認証

・複雑なケースに対応可能

・データマイニング導入開発コスト高

Page 76: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

インストール簡単

Page 77: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

$ sudo yum install -y git gcc-c++$ git clone

https://github.com/sstephenson/rbenv.git ~/.rbenv

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile$ exec $SHELL -l $ rbenv --version rbenv 0.4.0-95-gf71e227

rbenv

Page 78: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build$ rbenv install -l|grep jruby  jruby-1.5.6    (snip)  jruby-1.7.9  jruby-9000-dev  jruby-9000+graal-dev $ rbenv install  jruby-1.7.9$ rbenv shell jruby-1.7.9$ ruby -v jruby 1.7.9 (1.9.3p392) 2013-12-06 87b108a on OpenJDK 64-Bit

Server VM 1.7.0_51-mockbuild_2014_03_13_04_35-b00 [linux-amd64]

jruby

Page 79: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

$ gem install norikra --no-ri --no-rdoc$ rbenv rehash$ which norikra ~/.rbenv/shims/norikra$ gem list --local | grep norikra norikra (0.1.5 java) norikra-client-jruby (0.1.5 java)$ norikra start

norikra

Page 80: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Ansible も Docker もあるよ!

Page 81: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

シンプルなインターフェース

Page 82: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

norikra-client (コマンドライン)

$ norikra-client target open test_target

$ echo '{"name":"atom", "age":55}' | norikra-client event send

test_target

$ norikra-client target fetch test_query

Page 83: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Client Library

Page 84: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知
Page 85: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

パフォーマンス

メモリ 4G3,000/sec のリクエスト負荷を1 時間以上継続して問題なし

※メモリが少なすぎると FullGC を連発してストリーミングどころではなくなるので注意!

Page 86: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

JVM チューニング

• 実は内部がデフォルトで GCオプションを自動で色々と指定してくれる。

• ヒープのオプションはデフォルトでは指定していない、自分で指定すること。 norikra start -Xmx2g

Page 87: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Norikra ダウン時の冗長構成

Fluentd Standby オプションで切り替え可能(現状メモリの共有はできない)

Page 88: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

できないこと

• ストレージではないので、メモリに乗る分しかデータを集計できない。

(ログサイズに依存)

• 分散処理は自分で工夫すればできるかも( 1箇所に集中したデータを分散して行う仕組みはない)

Page 89: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

いいたいこと

• リアルタイム集計が小規模でも導入可能。• ほぼ設定だけでよいお手軽さ。(アプリの実装不要)• 再起動不要で動的反映。• SQL ライクな記述はわかりやすく 保守性が高い。(書いてみるとわかる。 Elasticsearch の クエリを素で書くのは結構大変。)

Page 90: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Norikra ユースケース

Page 91: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Web系企業で大人気

• LINE• サイバーエージェント• メルカリ• Pixiv• カヤック• Gunosy• Google

Page 92: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

LINE[ 用途 ] エラーログの集計で利用

LINE Bisiness Connect

Page 93: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

SELECT // 集計日時 current_timestamp() AS collected_timestamp,   channelId AS channel_id,  reason,  detail, // エラー発生件数  count(*) AS error_count, // 単位時間内で検出された最初のエラー発生日時  min(timestamp) AS first_timestamp, // 単位時間内で検出された最後のエラー発生日時  max(timestamp) AS last_timestampFROM // ウィンドウを 1 分ごとに定義 event_endpoint_error_log.win:time_batch(60 sec)GROUP BY  channelId, reason, detailHAVING // エラー件数が 1 件以上あった場合に限定  count(*) > 0

Page 94: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

[ 用途 ] Elarasticsearch 投入時の事前集計

200 req/s * 10 台 = 2000 req/s

サイバーエージェント

Page 95: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Pixiv[ 用途 ] ログ保存時の事前集計

Page 96: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

メルカリ

http://www.slideshare.net/kazeburo/norikra-mackerel

[ 用途 ] Mackerel 投入時の事前集計

Page 97: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

カヤック[ 用途 ] Zabbix 監視用のログ集計

Page 98: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Gunosy

https://speakerdeck.com/shunsukeaihara/norikra-in-gunosy-network-ads-at-norikra-meetup-number-2

Page 99: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

BigQuery + fluentd + Norikra でラムダアーキテクチャ

http://blog.yoslab.com/entry/2014/07/09/202304https://speakerdeck.com/kazunori279/building-a-lambda-architecture-in-10-minutes-with-bigquery-cep-and-docker

[ 用途 ] バッチ処理時の事前集計

Page 100: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

ユースケースまとめ

1.ログ集計やバッチ集計の補助機能

2.データ量の削減、機能開発の軽減

Page 101: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Norikra まとめ

• リアルタイム集計を設定ファイル+ SQL• 小規模から大規模まで導入可能• 実績多数

Page 102: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

アジェンダ

• 不正検知システム• リアルタイムストリーミング Norikra• Fluentd + Elasticsearch + kibana + Norikra の連携方法

Page 103: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

検知結果を可視化したい

https://profarms.wordpress.com/2012/09/02/out-of-radar/

Page 104: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Elasitcsearch• Lucene ベースの検索エンジン(高速)• スキーマレスで柔軟なデータ取り込み(型定義ファイル不要)• Kuromoji と合わせて日本語検索可能• DB テーブルを連携するプラグイン• Fluentd プラグインでデータを取り込める• Facet 、 Aggregation による集計処理• クラスタを組める

Page 105: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

kibana• 時間軸ベースのログの検索 & 視覚化ツー

ル• Elasticsearch と連携してフロントエン

ドとして動作する。• Elasticsearch のクエリを書かなくても グラフ描画できる。• UI がかっこいい。• ログの準リアルタイム可視化ツールとし

て事例が増えている。

Page 106: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知
Page 107: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

綺麗ですね(小並感)

Page 108: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Kibana 4 から白くなりました

Page 109: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

インストールは簡単です。1台からはじめられます。( Ansible もあります)

Page 110: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Fluentd と Norikra の接続

Page 111: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

管理者

ユーザ

Nginx+ php

fluentd

Norikra

ElasticSearch

+ kibana

LOG サーバ

fluentd

Page 112: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Fluent プラグイン

$ gem install norikra-client

コードを書かなくてもお互いログのやり取りができるようになる!

Page 113: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

NginxConf

Nginxaccess_log

処理out_exec_filter

Elasticseach

out_elasticsearch

WEB サーバ Fluentd

※http://dev.classmethod.jp/cloud/aws/block_dos_attack_by_norikra/ を参考にさせていただきました。

Page 114: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

<source> type tail format json tag nginx.access.admin path /var/log/nginx/web.its-lab.net/access.log pos_file /var/log/td-agent/web.its-

lab.net_access.log.pos</source>

Web サーバ側の Fluentd

Page 115: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

<match nginx.access.*> type copy

<store> type elasticsearch host 10.132.3.31 port 9200 type_name access_log logstash_format true logstash_prefix gmo_access logstash_dateformat %Y%m </store>

<store> type norikra norikra 10.132.3.31:26571 buffer_queue_limit 1 retry_limit 0 remove_tag_prefix nginx target_map_tag true </store>

</match>

Web サーバ側の Fluentd

赤枠以外はコピペでOK !

Page 116: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

管理者

ユーザ

Nginx+ php

fluentd

Norikra

ElasticSearch

+ kibana

LOG サーバ

fluentd

Page 117: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

Fluent プラグイン

$ gem install elasticsearch

コードを書かなくてもお互いログのやり取りができるようになる!

Page 118: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

NginxConf

Nginxaccess_log

処理out_exec_filter

Elasticseach

out_elasticsearch

LOG サーバ Flunen t d

※http://dev.classmethod.jp/cloud/aws/block_dos_attack_by_norikra/ を参考にさせていただきました。

Page 119: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

<source> type norikra norikra localhost:26571 <fetch> method sweep target access tag query_name tag_prefix norikra.query interval 30s </fetch></source>

Log サーバ側の Fluentd

自動で集計を読み込む

Page 120: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

<match norikra.query**> type copy <store> type exec_filter command /bin/bash /etc/td-agent/blocker.sh time_key time in_format json out_format json </store> <store> type elasticsearch host localhost port 9200 type_name access_log logstash_format true logstash_prefix norikra-count logstash_dateformat %Y%m</store>

Log サーバ側の Fluentd

Fluentd から構成管理ツールを叩く実はただのシェルスクリプト!

Page 121: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

NginxConf

Nginxaccess_log

※http://dev.classmethod.jp/cloud/aws/block_dos_attack_by_norikra/ を参考にさせていただきました。

処理out_exec_filter

Elasticseach

out_elasticsearch

全部つながったはず!

Page 122: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

いいたいこと

• Fluentd+Elastcisearch+kibana+Norikra インストール+設定ファイルだけで

連携できる。

Page 123: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

残タスク

• 限界を超える処理が発生した場合、 どうやって分散・リプレースするか。• SQL でどこまで複雑なことができるのか。 (まだ攻撃を受けてないのでリクエストがわからない)

• Elasticsearch+Kibana の もっと凝った使い方

Page 124: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

全体まとめ

• 不正アクセスに対して対応する手法は 簡易的に導入できるものある。• Norikra はラムダアーキテクチャの 利用事例が豊富。• Elasticsearch + kibana は導入が簡単で 可視化に有効。

Page 125: Norikra + Fluentd+ Elasticsearch + Kibana リアルタイムストリーミング処理ログ集計による異常検知

ご静聴ありがとうございました。