Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kibanaで秒間1万件のアクセスを可視化した話/nikkei-kibana-loganaly...
Search
bungoume
October 15, 2015
Technology
20
17k
Kibanaで秒間1万件のアクセスを可視化した話/nikkei-kibana-loganalyst2015
bungoume
October 15, 2015
Tweet
Share
More Decks by bungoume
See All by bungoume
djangocongressjp2023_password_hash
bungoume
2
1.2k
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
4
4.8k
CircleCIの活用事例とCI高速化/circleci-community-meetup3-speedup
bungoume
3
1.5k
Password Hashing djangocongress 20180519
bungoume
5
3.9k
OSSで始めるセキュリティログ収集/oss-securitylog-builderscon2017
bungoume
29
11k
日経電子版のアプリ開発を支えるログ活用術/nikkei-log-201609
bungoume
1
1.3k
uwsgi-docker-pycon2015
bungoume
10
59k
Ansibleを結構使ってみた/ansible-nikkei-2015
bungoume
32
15k
Dynamic Inventoryと参照変数
bungoume
2
4.8k
Other Decks in Technology
See All in Technology
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
190
Microsoft Azure全冠になってみた ~アレを使い倒した者が試験を制す!?~/Obtained all Microsoft Azure certifications Those who use "that" to the full will win the exam! ?
yuj1osm
2
110
私なりのAIのご紹介 [2024年版]
qt_luigi
1
120
ハイテク休憩
sat
PRO
2
150
Amazon Kendra GenAI Index 登場でどう変わる? 評価から学ぶ最適なRAG構成
naoki_0531
0
110
統計データで2024年の クラウド・インフラ動向を眺める
ysknsid25
2
840
5分でわかるDuckDB
chanyou0311
10
3.2k
Opcodeを読んでいたら何故かphp-srcを読んでいた話
murashotaro
0
240
2024年にチャレンジしたことを振り返るぞ
mitchan
0
140
kargoの魅力について伝える
magisystem0408
0
210
複雑性の高いオブジェクト編集に向き合う: プラガブルなReactフォーム設計
righttouch
PRO
0
110
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
190
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
347
20k
Practical Orchestrator
shlominoach
186
10k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
Rails Girls Zürich Keynote
gr2m
94
13k
Bash Introduction
62gerente
608
210k
Site-Speed That Sticks
csswizardry
2
190
Six Lessons from altMBA
skipperchong
27
3.5k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Facilitating Awesome Meetings
lara
50
6.1k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
48
2.2k
Statistics for Hackers
jakevdp
796
220k
Optimising Largest Contentful Paint
csswizardry
33
3k
Transcript
Kibanaで秒間1万件のアクセスを可視化した話 2015/10/15 ログ分析勉強会 vol.1 Yuri Umezaki
自己紹介 梅崎 裕利 • 会社 ◦ 日本経済新聞社デジタル編成局 • 主な業務 ◦
Ansibleでサーバ管理 ◦ Django+Elasticsearch(ES)で検索API作成 ◦ Fluentd+ES+Kibanaでログ分析 2
日経電子版の紹介 • 有料のニュースサービス ◦ 40万人を超える有料会員 • 8月にサーバをAWSへ移行 ◦ 合計でおよそ300台 ◦
移行に合わせてログの可視化を実施 • サービス開発部隊は40人程度 3
目次 • そもそもログとは ◦ ログの分類 ◦ どう扱うと良いか・事例 • アクセスログの可視化 ◦
Kibanaについて ◦ 何を可視化すると良いか・事例 • Fluentd-Elasticsearch-Kibana ◦ アクセスログ可視化の構成・設定 ◦ 性能について • まとめ 4
ログについて 5
そもそもログとは • 時系列データ ◦ いつ誰がどこで何をどうやってどうした ◦ 数値データや文字データ • 今回は以下のように分類 ◦
エラー ▪ 緊急性の高い情報 ◦ メトリクス ▪ 数値化できるもの ◦ 保管用ログ ▪ 即座に活用する必要がなく、数値化もしにくいもの ◦ (カスタムログ) ▪ クライアントサイドで取得するもの、アプリケーションのアクションログ 6
エラーログ • 発生したら対応・確認が必要なログ(アラート) ◦ アプリ ▪ バッチのエラー、Webサービスのエラー ◦ Syslog ▪
Kernelやドライバのエラー、依存サービスのエラー、etc… • 配慮すべきこと ◦ 即時に通知(電話やSlack, メールなど) ◦ 大量に出る可能性があるので集約する(Sentryを活用) ◦ 十分な情報を出す ◦ 通知不要なログは出さない ▪ アプリ側で出さないようにする。難しい場合はフィルタを作る ▪ オオカミ少年にならないように 7
Sentry • ログを集約してわかりやすく表示 8
メトリクス • 数値化できる情報 ◦ システム ▪ CPU load, Memory, I/O,
Network traffic, etc… ▪ Datadog, Mackerel, NewRelic Servers, Zabbixなど ◦ アプリケーション ▪ リクエスト数, 平均応答時間, 5xxレスポンス数, etc... ▪ NewRelic APM • 利用方法 ◦ 統計的に見て異常値があれば通知する ▪ トリガーを用意して通知(例:CPU load 2以上が5分続いたら通知) ◦ トラブル時の原因切り分けに利用 ▪ 例: エラーの原因はディスクFullだった、など 9
Zabbix 10
NewRelic APM • URLごとの平均レスポンス時間や関数内の処理時間が分かる 11
保管用ログ • 即時対応不要だが、収集する必要があるログ ◦ 監査ログ ▪ 紛失・改ざんできない箇所に保管 (別アカウントのS3など) ◦ info,
noticeレベルのログ ▪ 後で利用できるようにしておく ▪ Elasticsearch, Splunk, Logentries, LOGGLY, BigQuery, S3 ▪ 重要なログ(error以上など)は分離できるようしておく • 利用方法 ◦ 問題発生時に作業内容の確認 ◦ 理想は、普段と違うログエントリを自動で見つけてアラートを出す(≒IDS) ▪ => Splunkの活用 12
Amazon S3 13
カスタムログ • サービスで活用できるログ ◦ アクセス解析、アクションログ(ユーザの行動ログ) ▪ クライアントサイドで収集するもの ▪ 重要度の高い特定のイベントなど ▪
Mixpanel, Google Analitics, Adobe marketing cloud, … 14
今回はアクセスログ 15
アクセスログは? ユーザのHTTPリクエストに紐づくログ 一種のメトリクス • 従来 ◦ 行数やエラー数などを事前に集計し、結果のみをメトリクスとしてDBに保存 ◦ または保管用ログとして残しているだけで、活用はしていない •
理想 ◦ データベースに全部突っ込んでおいて、あとで必要なメトリクスを集計する ▪ Elasticsearchを使えばできる 16
後集計のメリット • 目的に合わせて都度、条件を指定して集計できる ◦ 複数の条件を指定してメトリクスを確認 ▪ 抽象的な情報を見てより詳細に確認できる ◦ 目的の数値を変更 ▪
例: レスポンス時間の平均値、最大値、99%タイル • 直接ログの中身が確認できる 17
後集計のデメリット • 計算リソース(≒お金)と大量のデータを扱えるDBが必要 ◦ 量が多いので外部サービスに投げると高コスト • 表示(集計)に時間がかかる • 何でも出来る ◦
時間泥棒 18
Kibanaでアクセスログの可視化 19
Kibanaとは 20 • データ可視化・検索・解析ツール ◦ OSS ◦ ブラウザベース ◦ DBとしてElasticsearchを利用
◦ アクセスログや保管用ログの解析に良く使われる
日経のアクセスログ • 秒間1万件超 • 1日約3億件 ◦ およそ1日120GB ◦ 常時1週間分を保持 •
Elasticsearchはr3.xlargeを6台で運用 ◦ 合計メモリ180GB(ElasticsearchのHeapは72GB) ◦ 月20万円前後 ◦ スポットインスタンスを使えば月約3万円 ◦ 24時間分のログは1分程度で表示できる 21
普段何を見ているか • 合計リクエスト数 • レスポンスサイズの合計 ◦ ≒帯域使用量 • 応答に3秒以上掛かっているリクエスト(Path毎) •
おかしなレスポンスstatusの数 • 攻撃と思われるリクエスト数 22
普段確認している画面 • 一括で確認できるダッシュボードを作成 23
合計リクエスト数の推移 • サーバ毎の分散状況、キャッシュのヒット割合なども確認 24
応答に3秒以上掛かっているpath一覧 25
おかしなstatusの数 26
簡易な攻撃検知 • マイナーなmethod (GET HEAD PROPFIND以外) • 怪しいパターン(例) ◦ ディレクトリトラバーサル狙い?
▪ ../ passwd shadow system32 .ini .log ◦ プログラム脆弱性を狙ったリクエスト ▪ admin uploader wp-admin ▪ .jsp .asp .aspx .asp .php .cgi .pl ▪ action redirectAction redirect ▪ %3Cscript <script ▪ %00 %0A %0D ◦ SQLインジェクションを狙ったリクエスト ▪ create select delete insert ▪ waitfor information_schema sleep benchmark 27
SecListsなどを活用 https://github.com/danielmiessler/SecLists 28
検索した結果 • IP別に表示 29
どこまでやるか • Request bodyやcookie, headerでもパターンマッチ ◦ IDSとしての精度は高まる • だけど、本来取る必要はない項目 ◦
POSTのbodyなどがログに残るのはリスクになりうる ◦ ログのサイズが大きくなる ◦ 攻撃を検知したところで特にできることはない ▪ 別レイヤーで対応する問題 30
その他の活用方法 • トラブル時の影響調査 • クローラを見つける • DoSを見つける ◦ リクエスト数が多い上位10のIPを表示 •
トラフィック使用量の多いファイルを見つける ◦ キャッシュの最適化に • 外から直接参照されているファイルを探す • 404のファイルを探す 31
アクセスログ可視化の準備 32
アクセスログをKibanaで表示するまでの流れ 33 構成はFluentd+Elasticsearch+Kibana • Apache, Nginxなどの設定 ◦ ログをパースしやすいように変更 • Fluentdの設定
◦ Fluentdでアクセスログをパース ◦ FluentdでアクセスログのUAを解析・Geo_IPを付与 ◦ FluentdでElasticsearchに投げる • Elasticsearchの設定 ◦ ログ用スキーマを入れておく • Kibanaの設定 ◦ 表示するスクリーンを作成する
構成図 • ログ集約サーバは分けなくても良い ◦ Webサーバへの負荷軽減 34 ログ集約サーバ ロードバランサ Webサーバ Webサーバ
S3(長期保存) Elassticsearch Elassticsearch Kibana
ログフォーマット • LTSVを利用する • 情報を増やす(出せる情報は出す) 35
Nginxのログフォーマット例 36
Apacheのログフォーマット例 (分かりやすいよう改行しています) 37
Fluentdでログをパース 38
Fluentdでいくつかフィルタを挟む • x_forwarded_forの最後のIPを抽出して別カラムに • user_agentをパースしてOSやブラウザ、バージョンを明確に • geo_ipを使ってアクセス元が大まかにわかるように • nginxやapacheのtaken_timeをms単位に統一 •
取れていない項目を削除 近々公開します 39
FluentdでElasticsearchに入れる 40
Elasticsearchはスキーマを用意する 41
Kibanaを用意 42
Visualizationを作成して表示する 43
大量のデータを捌く上でのポイント 44
Elasticsearchの設定 • HEAP Sizeを大きくする(重要) ◦ /etc/sysconfig/elasticsearch ▪ ES_HEAP_SIZE=6g (実メモリの40~50%に設定) •
更新間隔を長くする ◦ { "settings": { "index": { "refresh_interval" : "5s" }}} ◦ あまり効果はないかも • 定期的にCache clearする ◦ HEAPがいっぱいになると検索できなくなる 45
Fluentdの設定 • Record_transformerでrubyコードをなるべく使わない ◦ 1行の設定でCPU使用率が5倍になることも(15%->75%) 46
性能(感覚値) • Elasticserach ◦ 追加: r3.xlarge 6台で秒6万件は入れられる ◦ 検索: r3.xlarge
6台で10億件のアグリゲーションがギリギリ可能 • Fluentd ◦ 1cpuで5000~2万件程度(設定次第) ▪ S3に保存する際のgzip処理、geo_ipなどのフィルタ処理で重くなる 47
まとめ 48
まとめ • 後集計でアクセスログを可視化するのは有用 • Fluentd+Elasticsearch+kibanaは便利でおすすめ ◦ アクセスログ可視化だけでなくログ可視化にも使える ◦ 秒2000件ぐらいであれば1台でも大丈夫 ◦
AWSにElasticsearchが用意されたので準備も簡単 ◦ OSSなので趣味でも使える 49