ログ解析
ログの基本知識
ログはシステム、デバイス、またはアプリケーション内で記録されたイベントまたはトランザクションのこと。
具体的には、これらのイベントは、アプリケーション エラー、システム障害、監査されたユーザーのアクション、リソースの使用、ネットワーク接続などに関連する可能性がある。
各ログエントリには、タイムスタンプ (発生日時)、ソース (ログを生成したシステム)、特定のログ イベントに関する追加情報など、イベントの状況を説明するための関連詳細が含まれている。
ログの種類
ログ分析には、さまざまなログの種類、形式、標準を理解することが重要となる。 またログには以下のような種類がある。
- アプリケーションログ
- ステータス、エラー、警告など、特定のアプリケーションに関するメッセージを含む
- 監査ログ
- 規制遵守にとって重要な運用手順に関連するアクティビティ
- セキュリティログ
- 権限の変更、ファイアウォール アクティビティなどのセキュリティイベントを含む
- サーバーログ
- システムログ、イベントログ、エラーログ、アクセスログなど、サーバーが生成するさまざまなログを含む
- システムログ
- カーネルアクティビティ、システムエラー、ブートシーケンス、およびハードウェアステータス
- ネットワークログ
- ネットワークトラフィック、接続、その他のネットワーク関連イベント
- データベースログ
- クエリや更新など、データベース システム内のアクティビティ
- Webサーバログ
- Webサーバーによって処理されたリクエスト (URL、応答コードなどを含む)
ログの形式
ログの形式はログファイル内のデータの構造と編成を定義するもの。 データのエンコード方法、各エントリの区切り方、および各行にどのフィールドが含まれるかを指定する。 これらの形式は大きく異なり、半構造化、構造化、非構造化の3つの主要なカテゴリに分類される。
半構造化ログ
半構造化ログは構造化データと非構造化データが含まれる場合があり、自由形式のテキストに対応する予測可能なコンポーネントが含まれる。 このタイプのログには以下のようなものがある。
- Syslogメッセージ形式 ... システムログとネットワークログ用に広く採用されているログプロトコル
- Windowsイベントログ( EVTX ) 形式 ... Windows システム用の独自の Microsoft ログ
構造化されたログ
構造化されたログは厳密で標準化された形式に従っているため解析と分析に役立つ。 このタイプのログには以下のようなものがある。
- フィールド区切り形式(csv, tsv)
- JSON
- W3C Extended Log Format(ELF)
- XML
非構造化ログ
非構造化ログは自由/任意形式のテキストで構成されている。 コンテキストが豊富ですが、体系的な解析がしずらい可能性がある。 このタイプのログには以下のようなものがある。
- NCSA Common Log Format (CLF) ... クライアント要求用の標準化されたWebサーバログ形式(Apacheのログ形式)
- NCSA Combined Log Format (Combined) ... CLF の拡張であり、リファラーやユーザーエージェントなどのフィールドが追加されている(Nginxのログ形式)
ログの収集/管理/一元化
ログの収集
ログの取集はログ分析を行う際に需要となる要素で、サーバやネットワーク、ソフトウェア、データベースなど様々な要素からのログ集約が含まれる。
ログの保存と整合性時のためにはシステムの時間精度を維持することが重要で、NTPを利用することはこのタイムラインの整合性を確保するための重要な手段となる。
ログ収集を行う際のデータ入手する際のプロセス例は以下の通り。
- ソースの特定 ... 収集するログソースのリストアップを行う
- ログ収集ソフトウェアの選択 ... ログの収集ツールやソフトウェアの選定
- 収集するパラメータの決定 ... どのイベントを記録するか決定を行い、NTP時刻同期の有効も確認する
- テストによるログ収集 ... テストを実行して適切に周遊されている確認する
ログの管理
ログの保存管理に関するソリューションの決定も行う。
- ストレージの選定 ... ログを保持するストレージの選定を行う
- 編成 ... ログをソース、タイプなどで分類しアクセスしやすいようにする
- バックアップ ... ログを定期的にバックアップしデータの損失を防ぐ
- 確認 ... 定期的にログが保存されているか確認を行う
ログの一元化
ログの一元化を統合ツールなどで行うと、リアルタイム検出、自動通知、インシデント管理等が行える。 ログの一元化を行うとアクセス分析が大幅に効率化される。
- 一元化システムの選択 ... Elastic StackやSplunkなどログを統合するツールを決定する
- ソースの統合 ... ログソースを選択したシステムに接続する
- モニタリングのセットアップ ... 統合ツールのセットアップを行う
- インシデント管理の統合 ... 統合ツールがインシデント管理などと統合できるようにする
ログの保存/削除
ログはローカルシステムやクラウドストレージなどいろいろな場所に保存できる。
ログの保存期間
ログの保存は以下のポリシーに従って保存されることが多い
- ホットストレージ ... 過去3か月~過去6か月のログを保存するもの。アクセスしやすいようにするべき。
- ウォームストレージ ... 過去6か月~2年のログを保存するもの。ホットストレージよりすぐにアクセスできる必要はない
- コールドストレージ ... 過去2年~5年のログを保存するもの。アーカイブや圧縮化されたログとなり容易にアクセスできなくてもよい。
ログの削除
ログの削除は価値のある可能性のあるログが削除されないように慎重に行う必要があり、重要なものは削除前にバックアップする必要がある。
ログ収集/管理の設定
Rsyslogによるログ収集
Linuxのログ収集システムであるrsyslogを使用してログ収集を行う際の設定例を記載する。
なお、例では/var/log/websrv-02/rsysog_sshd.log
に保存するように構成する。
- Terminalを開く
sudo systemctl status rsyslog
によりrsyslogのインストールと動作確認をする- viエディタで
vi /etc/rsyslog.d/98-websrv-02-sshd.conf
を開きファイルに以下構成を追加する$FileCreateMode 0644
:programname, isequal, "sshd" /var/log/websrv-02/rsyslog_sshd.log
- 設定ファイルを保存して閉じる
sudo systemctl restart rsyslog
によりrsyslogを再起動するssh localhost
を行い設定が機能することを確認する
Logrotateを使用したログ管理
Linuxのログ管理システムであるlogrotateの設定を行う際の設定例を記載する。
なお例では/var/log/websrv-02/rsysog_sshd.log
のログファイルのローテーションの設定を行うように構成する。
sudo vi /etc/logrotate.d/98-websrv-02_sshd.conf
などで構成ファイルを作成する- 以下のようにログ設定を行う
/var/log/websrv-02/rsyslog_sshd.log {
daily
rotate 30
compress
lastaction
DATE=$(date +"%Y-%m-%d")
echo "$(date)" >> "/var/log/websrv-02/hashes_"$DATE"_rsyslog_sshd.txt"
for i in $(seq 1 30); do
FILE="/var/log/websrv-02/rsyslog_sshd.log.$i.gz"
if [ -f "$FILE" ]; then
HASH=$(/usr/bin/sha256sum "$FILE" | awk '{ print $1 }')
echo "rsyslog_sshd.log.$i.gz "$HASH"" >> "/var/log/websrv-02/hashes_"$DATE"_rsyslog_sshd.txt"
fi
done
systemctl restart rsyslog
endscript
}
- ファイルを保存する
sudo logrotate -f /etc/logrotate.d/98-websrv-02_sshd.conf
でログローテーションを開始する
ログ分析のテクニック
ログ分析はSIEMツール(SplunkやElastic Search)などを使用すると複雑なログ分析タスクなどを行うことができる。
なお即時ログ分析が必要な場合はLinuxの場合、cat
、grep
、sed
、sort
、uniq
などのツールで分析する場合もある。
またWindowsの場合はEZ-Tools
と呼ばれるコマンドレットで分析できる。
また、awk
やsha256um
、GET-FileHash
などのコマンドでも分析が行える。
ログの分析手法
ログ分析を行い、パターンや異常性などを特定するためのテクニック手法には以下のようなものがある。
- パターン認識
- 異常検出
- 相関関係の分析
- タイムライン分析
- 機械学習/AIを用いた分析
- 視覚化による分析
- 統計解析
ログ解析の基本
一般的なログファイルの場所
Linuxの場合ログファイルは以下のような場所に通常は配置される。
- Webサーバー:
- Nginx:
- アクセスログ:
/var/log/nginx/access.log
- エラーログ:
/var/log/nginx/error.log
- アクセスログ:
- Apache:
- アクセスログ:
/var/log/apache2/access.log
- エラーログ:
/var/log/apache2/error.log
- アクセスログ:
- Nginx:
- データベース:
- MySQL:
- エラーログ:
/var/log/mysql/error.log
- エラーログ:
- PostgreSQL:
- エラーとアクティビティのログ:
/var/log/postgresql/postgresql-{version}-main.log
- エラーとアクティビティのログ:
- MySQL:
- Webアプリケーション:
- PHP :
- エラーログ:
/var/log/php/error.log
- エラーログ:
- PHP :
- OS:
- Linux:
- 一般的なシステム ログ:
/var/log/syslog
- 認証ログ:
/var/log/auth.log
- 一般的なシステム ログ:
- Linux:
- ファイアウォールとIDS/IPS:
- iptables:
- ファイアウォールのログ:
/var/log/iptables.log
- ファイアウォールのログ:
- Snort:
- Snort ログ:
/var/log/snort/
- Snort ログ:
- iptables:
上記は一般的なログファイルのパスだが、実際のパスはシステム構成、ソフトウェア バージョン、カスタム設定によって異なる場合がある。
ログの兆候パターン
セキュリティのコンテキストでは、潜在的なセキュリティの脅威を特定するには、ログデータの一般的なパターンと傾向を認識することが重要となる。
これらの「パターン」とは、脅威アクターまたはサイバーセキュリティインシデントによってログに残された識別可能なアーティファクトを指す。 幸いなことに、学習すれば検出能力が向上し、インシデントに効率的に対応できる一般的なパターンがいくつか存在する。
ユーザの行動異常
システムを使うユーザが行う行動から逸脱したアクションやアクティビティを異常行動として扱う。 以下のような内容が異常行動として扱える。
- ログイン試行に複数回失敗
- 短期間に異常に多くのログイン失敗が発生した場合は、ブルートフォース攻撃を示している可能性がある
- 異常なログイン時間
- ユーザーの通常のアクセス時間またはパターン以外のログインイベントは、不正アクセスまたはアカウントの侵害を示す可能性がある
- アクセス元の異常
- ユーザーが通常アクセスしない国の IP アドレスからのログインイベントは、潜在的なアカウント侵害または不審なアクティビティを示している可能性がある
- パスワードの頻繁な変更
- ユーザーのパスワードが短期間に頻繁に変更されたことを示すログイベントは、不正アクセスを隠蔽したり、アカウントを乗っ取ったりする試みを示唆している可能性がある
- 異常なユーザエージェント文字列
- HTTPトラフィックのログのコンテキストでは、一般的なブラウザとは異なる一般的なユーザーエージェント文字列を持つユーザーからのリクエストは、自動化された攻撃または悪意のあるアクティビティを示している可能性がある
一般的な攻撃サイン
ログデータ内の一般的な攻撃シグネチャを特定することは、脅威を検出して迅速に対応するための効果的な方法といえる。 これは攻撃シグネチャには、脅威アクターが残した特定のパターンや特徴が含まれているためである。 検知しやすいシグネチャーの例には以下のようなものがある。
- SQLインジェクション
- 例:
10.10.61.21 - - [2023-08-02 15:27:42] "GET /products.php?q=books' UNION SELECT null, null, username, password, null FROM users-- HTTP/1.1" 200 3122
- 例:
- XSS
- 例:
10.10.19.31 - - [2023-08-04 16:12:11] "GET /products.php?search=<script>alert(1);</script> HTTP/1.1" 200 5153
- 例:
- パストラバーサル
- 例:
10.10.113.45 - - [2023-08-05 18:17:25] "GET /../../../../../etc/passwd HTTP/1.1" 200 505
- 例:
ログの分析手法
ログの分析手法には自動分析と手動分析がある。
自動分析
自動分析はツールを使って行う。具体的にはXPLG や SolarWinds Logglyなどの商用ツールなども含まれる。
- 長所
- 分析の手間が削減できる
- 人工知能による分析はパターン分析に効果的となる
- 短所
- 自動分析ツールは多くの場合は商用である
- コストがかかる
手動分析
手動分析は自動化ツールを使用せずにデータと成果物を手動で検査するプロセスといえる。
- 長所
- 単純なコマンドで解析ができる
- 徹底的に調査できる
- 短所
- ログの再フォーマットなどは手動で行う必要がある
- イベントやアラートを見逃す可能性がある
コマンドラインによるログ分析
catコマンド
ファイルの内容を表示するコマンド。
lessコマンド
ファイルの内容を一気に表示せず少しずつ表示するコマンド。
↑
や`↓
キーでスクロールできる。
tailコマンド
ファイルの内容を後ろから表示するコマンド。 デフォルトでは最後の10行が表示される。
-f
オプションでリアルタイムの更新も反映、-n 数字
で表示行数の変更ができる。
wcコマンド
ファイル内の行数、単語数、文字数に関する情報を見ることのできるコマンド。
cutコマンド
指定された区切り文字に基づいてファイルから特定の列 (フィールド) を抽出できるコマンド。 構造化データまたはタブ区切りデータを含むログ ファイルを操作する場合に便利なコマンドといえる。
sortコマンド
特定の基準に基づいてファイル内のデータを昇順または降順にするコマンド。 ログデータのパターン、傾向、外れ値を特定するために重要な操作となる。
uniqコマンド
並べ替えられた入力から隣接する重複行を識別して削除するコマンド。 特にログエントリに繰り返しまたは冗長な情報が含まれる可能性がある場合に、データリスト (収集されたIPアドレスなど) を簡素化するのに便利なツールといえる。
# 重複したIPアドレスを削除して表示する例
cut -d ' ' -f 1 apache.log | sort -n -r | uniq
# -cオプションで出現回数も追加して表示できる
cut -d ' ' -f 1 apache.log | sort -n -r | uniq -c
sedコマンド
ログ分析によく使用されるコマンドで、データを効率的に操作、抽出、変換できる。 なお表示形式を変えて表現できるだけでファイル内容の変更は直接行わない。
awkコマンド
awkコマンドは特定のフィールド値に基づく条件付きアクションして表示できるコマンド。
なお$N
は空白で区切られたフィールド項目を示す。
grepコマンド
ファイルまたはテキストストリーム内の特定のパターンまたは正規表現を検索できるコマンド。
# 通常の検索
grep "検索文字" apache.log
# 含む行のカウント
grep -c "検索文字" apache.log
# どの行が一致したか表示したい場合(N:で表示)
grep -n "検索文字" apache.log
# 検索文字を含まない行を表示
grep -v "検索文字" apache.log
正規表現によるログ分析
grepコマンドと正規表現
grepコマンドの場合-E
オプションを付けることで正規表現を利用できる。
ログ解析用の正規表現
Apacheログの場合の各項目を抽出するための正規表現を以下に記載する。
- IPアドレス
\b([0-9]{1,3}\.){3}[0-9]{1,3}\b
- タイムスタンプ
\[(\d\d)\/(...)\/(\d{4}):(\d\d):(\d\d):(\d\d) ([+-]\d{4})\]
- HTTPメソッド
(POST|GET|PUT|DELETE|PATCH)
- URL
"([^"]+)[0,1]"
- ユーザエージェント
`"([^"]+)"
[間違い]`
また正規表現の作成はRegExrで容易に確認できる。
LogstashとGrok
GrokはLogstashのプラグインで非構造化ログ データを構造化された検索可能なデータに解析できるようにできる。 人間が読み取るために作成されたログ形式によく使用される。