コンテンツにスキップ

ログ解析

ログの基本知識

ログはシステム、デバイス、またはアプリケーション内で記録されたイベントまたはトランザクションのこと

具体的には、これらのイベントは、アプリケーション エラー、システム障害、監査されたユーザーのアクション、リソースの使用、ネットワーク接続などに関連する可能性がある。

各ログエントリには、タイムスタンプ (発生日時)、ソース (ログを生成したシステム)、特定のログ イベントに関する追加情報など、イベントの状況を説明するための関連詳細が含まれている。

ログの種類

ログ分析には、さまざまなログの種類、形式、標準を理解することが重要となる。 またログには以下のような種類がある。

  • アプリケーションログ
    • ステータス、エラー、警告など、特定のアプリケーションに関するメッセージを含む
  • 監査ログ
    • 規制遵守にとって重要な運用手順に関連するアクティビティ
  • セキュリティログ
    • 権限の変更、ファイアウォール アクティビティなどのセキュリティイベントを含む
  • サーバーログ
    • システムログ、イベントログ、エラーログ、アクセスログなど、サーバーが生成するさまざまなログを含む
  • システムログ
    • カーネルアクティビティ、システムエラー、ブートシーケンス、およびハードウェアステータス
  • ネットワークログ
    • ネットワークトラフィック、接続、その他のネットワーク関連イベント
  • データベースログ
    • クエリや更新など、データベース システム内のアクティビティ
  • 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を利用することはこのタイムラインの整合性を確保するための重要な手段となる。

ログ収集を行う際のデータ入手する際のプロセス例は以下の通り。

  1. ソースの特定 ... 収集するログソースのリストアップを行う
  2. ログ収集ソフトウェアの選択 ... ログの収集ツールやソフトウェアの選定
  3. 収集するパラメータの決定 ... どのイベントを記録するか決定を行い、NTP時刻同期の有効も確認する
  4. テストによるログ収集 ... テストを実行して適切に周遊されている確認する

ログの管理

ログの保存管理に関するソリューションの決定も行う。

  • ストレージの選定 ... ログを保持するストレージの選定を行う
  • 編成 ... ログをソース、タイプなどで分類しアクセスしやすいようにする
  • バックアップ ... ログを定期的にバックアップしデータの損失を防ぐ
  • 確認 ... 定期的にログが保存されているか確認を行う

ログの一元化

ログの一元化を統合ツールなどで行うと、リアルタイム検出、自動通知、インシデント管理等が行える。 ログの一元化を行うとアクセス分析が大幅に効率化される

  • 一元化システムの選択 ... Elastic StackSplunkなどログを統合するツールを決定する
  • ソースの統合 ... ログソースを選択したシステムに接続する
  • モニタリングのセットアップ ... 統合ツールのセットアップを行う
  • インシデント管理の統合 ... 統合ツールがインシデント管理などと統合できるようにする

ログの保存/削除

ログはローカルシステムやクラウドストレージなどいろいろな場所に保存できる。

ログの保存期間

ログの保存は以下のポリシーに従って保存されることが多い

  • ホットストレージ ... 過去3か月~過去6か月のログを保存するもの。アクセスしやすいようにするべき。
  • ウォームストレージ ... 過去6か月~2年のログを保存するもの。ホットストレージよりすぐにアクセスできる必要はない
  • コールドストレージ ... 過去2年~5年のログを保存するもの。アーカイブや圧縮化されたログとなり容易にアクセスできなくてもよい。

ログの削除

ログの削除は価値のある可能性のあるログが削除されないように慎重に行う必要があり、重要なものは削除前にバックアップする必要がある。

ログ収集/管理の設定

Rsyslogによるログ収集

Linuxのログ収集システムであるrsyslogを使用してログ収集を行う際の設定例を記載する。 なお、例では/var/log/websrv-02/rsysog_sshd.logに保存するように構成する。

  1. Terminalを開く
  2. sudo systemctl status rsyslogによりrsyslogのインストールと動作確認をする
  3. viエディタでvi /etc/rsyslog.d/98-websrv-02-sshd.confを開きファイルに以下構成を追加する
    • $FileCreateMode 0644
    • :programname, isequal, "sshd" /var/log/websrv-02/rsyslog_sshd.log
  4. 設定ファイルを保存して閉じる
  5. sudo systemctl restart rsyslogによりrsyslogを再起動する
  6. ssh localhostを行い設定が機能することを確認する

Logrotateを使用したログ管理

Linuxのログ管理システムであるlogrotateの設定を行う際の設定例を記載する。 なお例では/var/log/websrv-02/rsysog_sshd.logのログファイルのローテーションの設定を行うように構成する。

  1. sudo vi /etc/logrotate.d/98-websrv-02_sshd.confなどで構成ファイルを作成する
  2. 以下のようにログ設定を行う
/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
}
  1. ファイルを保存する
  2. sudo logrotate -f /etc/logrotate.d/98-websrv-02_sshd.confでログローテーションを開始する

ログ分析のテクニック

ログ分析はSIEMツール(SplunkやElastic Search)などを使用すると複雑なログ分析タスクなどを行うことができる。

なお即時ログ分析が必要な場合はLinuxの場合、catgrepsedsortuniqなどのツールで分析する場合もある。 またWindowsの場合はEZ-Toolsと呼ばれるコマンドレットで分析できる。 また、awksha256umGET-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
  • データベース:
    • MySQL:
      • エラーログ:/var/log/mysql/error.log
    • PostgreSQL:
      • エラーとアクティビティのログ:/var/log/postgresql/postgresql-{version}-main.log
  • Webアプリケーション:
    • PHP :
      • エラーログ:/var/log/php/error.log
  • OS:
    • Linux:
      • 一般的なシステム ログ:/var/log/syslog
      • 認証ログ:/var/log/auth.log
  • ファイアウォールとIDS/IPS:
    • iptables:
      • ファイアウォールのログ:/var/log/iptables.log
    • Snort:
      • Snort ログ:/var/log/snort/

上記は一般的なログファイルのパスだが、実際のパスはシステム構成、ソフトウェア バージョン、カスタム設定によって異なる場合がある。

ログの兆候パターン

セキュリティのコンテキストでは、潜在的なセキュリティの脅威を特定するには、ログデータの一般的なパターンと傾向を認識することが重要となる。

これらの「パターン」とは、脅威アクターまたはサイバーセキュリティインシデントによってログに残された識別可能なアーティファクトを指す。 幸いなことに、学習すれば検出能力が向上し、インシデントに効率的に対応できる一般的なパターンがいくつか存在する。

ユーザの行動異常

システムを使うユーザが行う行動から逸脱したアクションやアクティビティを異常行動として扱う。 以下のような内容が異常行動として扱える。

  • ログイン試行に複数回失敗
    • 短期間に異常に多くのログイン失敗が発生した場合は、ブルートフォース攻撃を示している可能性がある
  • 異常なログイン時間
    • ユーザーの通常のアクセス時間またはパターン以外のログインイベントは、不正アクセスまたはアカウントの侵害を示す可能性がある
  • アクセス元の異常
    • ユーザーが通常アクセスしない国の 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コマンド

ファイルの内容を表示するコマンド。

cat apache.log

lessコマンド

ファイルの内容を一気に表示せず少しずつ表示するコマンド。 `↓キーでスクロールできる。

less apache.log

tailコマンド

ファイルの内容を後ろから表示するコマンド。 デフォルトでは最後の10行が表示される。

-fオプションでリアルタイムの更新も反映、-n 数字で表示行数の変更ができる。

tail -f -n 10 apache.log

wcコマンド

ファイル内の行数、単語数、文字数に関する情報を見ることのできるコマンド。

wc apache.log

cutコマンド

指定された区切り文字に基づいてファイルから特定の列 (フィールド) を抽出できるコマンド。 構造化データまたはタブ区切りデータを含むログ ファイルを操作する場合に便利なコマンドといえる。

# IPアドレスをApache.logから抽出する例
# -f 7:URL, -f 9でステータスコード確認できる
cut -d ' ' -f 1 apache.log

sortコマンド

特定の基準に基づいてファイル内のデータを昇順または降順にするコマンド。 ログデータのパターン、傾向、外れ値を特定するために重要な操作となる。

# IPアドレスを並び替える例
cut -d ' ' -f 1 apache.log | sort -n [-r]

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コマンド

ログ分析によく使用されるコマンドで、データを効率的に操作、抽出、変換できる。 なお表示形式を変えて表現できるだけでファイル内容の変更は直接行わない

# 日付形式を31/Aug/2024からAug 31, 2024に置き換え表示する例
sed 's/31\/Aug\/2024/Augs 31, 2024/g' apache.log

awkコマンド

awkコマンドは特定のフィールド値に基づく条件付きアクションして表示できるコマンド。 なお$Nは空白で区切られたフィールド項目を示す。

# HTTPレスポンスコードが400以上の行を表示
awk '$9 >= 400' apache.log

grepコマンド

ファイルまたはテキストストリーム内の特定のパターンまたは正規表現を検索できるコマンド。

# 通常の検索
grep "検索文字" apache.log
# 含む行のカウント
grep -c "検索文字" apache.log
# どの行が一致したか表示したい場合(N:で表示)
grep -n "検索文字" apache.log
# 検索文字を含まない行を表示
grep -v "検索文字" apache.log

正規表現によるログ分析

grepコマンドと正規表現

grepコマンドの場合-Eオプションを付けることで正規表現を利用できる。

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のプラグインで非構造化ログ データを構造化された検索可能なデータに解析できるようにできる。 人間が読み取るために作成されたログ形式によく使用される。