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.4k
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
4
6.5k
CircleCIの活用事例とCI高速化/circleci-community-meetup3-speedup
bungoume
3
1.5k
Password Hashing djangocongress 20180519
bungoume
5
4.1k
OSSで始めるセキュリティログ収集/oss-securitylog-builderscon2017
bungoume
29
11k
日経電子版のアプリ開発を支えるログ活用術/nikkei-log-201609
bungoume
1
1.4k
uwsgi-docker-pycon2015
bungoume
10
60k
Ansibleを結構使ってみた/ansible-nikkei-2015
bungoume
32
15k
Dynamic Inventoryと参照変数
bungoume
2
5k
Other Decks in Technology
See All in Technology
「駆動」って言葉、なんかカッコイイ_Mitz
comucal
PRO
0
140
人工知能のための哲学塾 ニューロフィロソフィ篇 第零夜 「ニューロフィロソフィとは何か?」
miyayou
0
420
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.3k
Databricks Free Edition講座 データエンジニアリング編
taka_aki
0
2.5k
「リリースファースト」の実感を届けるには 〜停滞するチームに変化を起こすアプローチ〜 #RSGT2026
kintotechdev
0
850
AI に「学ばせ、調べさせ、作らせる」。Auth0 開発を加速させる7つの実践的アプローチ
scova0731
0
220
AI時代のアジャイルチームを目指して ー スクラムというコンフォートゾーンからの脱却 ー / Toward Agile Teams in the Age of AI
takaking22
11
6.2k
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
21k
チームで安全にClaude Codeを利用するためのプラクティス / team-claude-code-practices
tomoki10
7
3.2k
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.9k
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1k
次世代AIコーディング:OpenAI Codex の最新動向 進行スライド/nikkei-tech-talk-40
nikkei_engineer_recruiting
0
140
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.1k
Producing Creativity
orderedlist
PRO
348
40k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
4 Signs Your Business is Dying
shpigford
187
22k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
280
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Darren the Foodie - Storyboard
khoart
PRO
2
2.1k
Context Engineering - Making Every Token Count
addyosmani
9
590
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.2k
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