Graylog でログを分析する

NmapBeginner
オンラインで実践に進む

はじめに

この実験では、強力なオープンソースログ管理プラットフォームである Graylog を使用して、ログデータを収集および分析する方法を学びます。集中ログ管理はサイバーセキュリティの重要な要素であり、単一のインターフェースからシステムイベントを監視し、異常を検出し、セキュリティインシデントを調査することを可能にします。

まず、Docker Compose を使用して、MongoDB と OpenSearch(Elasticsearch の最新の代替品)を含む Graylog スタック全体をデプロイします。次に、Graylog を設定してログデータを受信し、サンプルログを送信し、検索クエリを実行して情報をフィルタリングし、最後に主要なメトリックを監視するための視覚的なダッシュボードを構築します。この実験の終わりまでに、Graylog でのログ分析の基本的なワークフローに関する実践的な経験を得ることができます。

Docker Compose で Graylog をデプロイする

最初のステップでは、Graylog ロギングプラットフォームをデプロイします。ここでは、マルチコンテナ Docker アプリケーションの定義と実行に使用されるツールである Docker Compose v2 を使用します。このアプローチにより、Graylog、OpenSearch、MongoDB の必要なすべてのコンポーネントを単一の設定ファイルで管理することで、セットアッププロセスが簡素化されます。

まず、環境を準備し、サービスを起動しましょう。

  1. セットアップスクリプトは、すでに Docker Compose v2 をインストールしています。バージョンを確認することで、インストールを検証できます。

    docker compose version
    

    次のような Docker Compose のバージョンを示す出力が表示されるはずです。

    Docker Compose version v2.29.7
    
  2. Graylog 設定専用のディレクトリに移動します。これにより、プロジェクトが整理されます。

    cd /home/labex/project/graylog
    
  3. 次に、nano テキストエディタを使用して docker-compose.yml 設定ファイルを作成します。このファイルは、Docker Compose にどのコンテナを実行するか、およびそれらをどのように設定するかを指示します。

    nano docker-compose.yml
    
  4. 以下の YAML 設定を nano エディタにコピー&ペーストします。この設定は 3 つのサービスを定義します。

    • mongodb: Graylog の設定データを保存します。
    • opensearch: 高速な検索のためにログメッセージをインデックス化し、保存します。OpenSearch 2.12 以降では、初期管理者パスワードが必要です。
    • graylog: メインアプリケーションであり、Web インターフェースとログ処理エンジンを提供します。
    services:
      mongodb:
        image: mongo:6.0
        container_name: graylog_mongodb
        volumes:
          - mongo_data:/data/db
        networks:
          - graylog_network
        healthcheck:
          test: ["CMD", "mongosh", "--eval", "db.runCommand('ping').ok"]
          interval: 30s
          timeout: 10s
          retries: 3
      opensearch:
        image: opensearchproject/opensearch:2.13.0
        container_name: graylog_opensearch
        environment:
          - discovery.type=single-node
          - plugins.security.disabled=true
          - bootstrap.memory_lock=true
          - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
          - "OPENSEARCH_INITIAL_ADMIN_PASSWORD=StrongPassword123!"
        ulimits:
          memlock:
            soft: -1
            hard: -1
        volumes:
          - opensearch_data:/usr/share/opensearch/data
        networks:
          - graylog_network
        healthcheck:
          test:
            [
              "CMD-SHELL",
              "curl -f http://localhost:9200/_cluster/health || exit 1"
            ]
          interval: 30s
          timeout: 10s
          retries: 3
      graylog:
        image: graylog/graylog:6.1
        container_name: graylog_server
        volumes:
          - graylog_data:/usr/share/graylog/data
        environment:
          - GRAYLOG_PASSWORD_SECRET=somepasswordpepper
          - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
          - GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9000/
          - GRAYLOG_ELASTICSEARCH_HOSTS=http://opensearch:9200
          - GRAYLOG_MONGODB_URI=mongodb://mongodb:27017/graylog
        depends_on:
          mongodb:
            condition: service_healthy
          opensearch:
            condition: service_healthy
        ports:
          - "9000:9000"
          - "1514:1514"
          - "1514:1514/udp"
          - "12201:12201"
          - "12201:12201/udp"
        networks:
          - graylog_network
    volumes:
      mongo_data:
      opensearch_data:
      graylog_data:
    networks:
      graylog_network:
        driver: bridge
    

    ファイルを保存するには Ctrl+O、次に Enter を押し、nano を終了するには Ctrl+X を押します。

  5. 次に、-d(デタッチ)フラグを使用して、すべてのサービスをバックグラウンドで起動します。

    docker compose up -d
    
  6. すべてのサービスが初期化されるまで、1 分から 2 分かかる場合があります。コンテナのステータスを確認して、正しく実行されていることを確認できます。

    docker compose ps
    

    StateUp となっている 3 つのサービス(graylog_servergraylog_opensearchgraylog_mongodb)すべてが表示されるはずです。

    NAME                 IMAGE                                 COMMAND                  SERVICE      CREATED              STATUS                        PORTS
    graylog_mongodb      mongo:6.0                             "docker-entrypoint.s…"   mongodb      About a minute ago   Up About a minute (healthy)   27017/tcp
    graylog_opensearch   opensearchproject/opensearch:2.13.0   "./opensearch-docker…"   opensearch   About a minute ago   Up About a minute (healthy)   9200/tcp, 9300/tcp, 9600/tcp, 9650/tcp
    graylog_server       graylog/graylog:6.1                   "tini -- /docker-ent…"   graylog      About a minute ago   Up 34 seconds (healthy)       0.0.0.0:1514->1514/tcp, :::1514->1514/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:1514->1514/udp, :::9000->9000/tcp, :::1514->1514/udp, 0.0.0.0:12201->12201/tcp, 0.0.0.0:12201->12201/udp, :::12201->12201/tcp, :::12201->12201/udp
    

これで Graylog Web インターフェースにアクセスできるようになりました。Graylog スタックのデプロイに成功し、設定の準備が整いました。

Syslog 入力を設定する

Graylog が実行されたら、次のステップは「Input」を設定することです。Input は、Graylog がログメッセージをどのように受け取るかを指示するコンポーネントです。この実験では、ネットワークデバイスや Linux/Unix サーバーからログを収集するための一般的な標準である Syslog UDP Input を作成します。

  1. ブラウザで Graylog Web インターフェースを開きます。これは、「Web Terminal」タブをクリックして「Desktop」を選択してブラウザを開くか、実験環境の専用ブラウザアイコンを使用することで行えます。次の URL にアクセスしてください。

    http://127.0.0.1:9000

    Graylog web interface

  2. デフォルトの認証情報でログインします。

    • ユーザー名:admin
    • パスワード:admin
  3. ログインしたら、新しい Input を作成します。トップナビゲーションバーで System をクリックし、ドロップダウンメニューから Inputs を選択します。

  4. Inputs ページで、「Select input」ドロップダウンリストから「Syslog UDP」Input タイプを見つけ、その横にある Launch new input ボタンをクリックします。

  5. モーダルウィンドウが表示されます。Input を設定するために、以下の詳細でフォームに入力します。

    • Node: ドロップダウンから利用可能な唯一のノードを選択します(これは Graylog サーバーになります)。
    • Title: Syslog UDP Input (これは Input の説明的な名前です)。
    • Bind address: 0.0.0.0 (これは、Graylog がコンテナのすべてのネットワークインターフェースでログをリッスンするように指示します)。
    • Port: 1514 (これは、Graylog が着信 Syslog メッセージをリッスンするポートです)。

    他のすべての設定はデフォルトのままにして、Save をクリックします。

  6. 保存後、Inputs ページに戻ります。新しい「Syslog UDP Input」がリストに表示され、緑色の「Running」ステータスが表示され、アクティブでデータ受信の準備ができていることを示します。

  7. Input をテストするために、ターミナルに戻り、netcat (nc) ユーティリティを使用してサンプルログメッセージを送信します。このコマンドは、基本的な Syslog メッセージを構築し、ローカルマシンの UDP ポート 1514 に送信します。

    echo "<14>$(date +'%b %d %H:%M:%S') localhost labex: Test syslog message" | nc -w1 -u 127.0.0.1 1514
    

これで、Graylog がログを受信するように正常に設定されました。次のステップでは、より構造化されたログを送信し、Graylog インターフェースでそれらを表示する方法を学びます。

サンプルログの送信と表示

Syslog Input の準備ができたので、サンプルログのバッチを生成して送信する時間です。これにより、Graylog にデータが取り込まれ、検索と分析の練習ができるようになります。アプリケーションからのログメッセージをシミュレートするために、簡単なシェルスクリプトを作成します。

  1. まず、ターミナルでプロジェクトのルートディレクトリに戻ります。

    cd /home/labex/project
    
  2. nano エディタを使用して、generate_logs.sh という名前の新しいシェルスクリプトを作成します。

    nano generate_logs.sh
    
  3. 以下のスクリプトをエディタにコピー&ペーストします。このスクリプトは、ループで 10 個のログメッセージを生成します。各メッセージには、ランダムな重要度レベル、タイムスタンプ、および簡単なメッセージ本文が含まれています。その後、nc を使用して、各ログを設定した Graylog Input に送信します。

    #!/bin/bash
    for i in {1..10}; do
      severity=$(((RANDOM % 8)))
      timestamp=$(date +'%b %d %H:%M:%S')
      echo "<$((severity + 8))>$timestamp localhost sample_app[$i]: Sample log message $i with severity $severity" | nc -w1 -u 127.0.0.1 1514
      echo "Sent log message $i"
      sleep 1
    done
    

    保存して終了するには、Ctrl+OEnterCtrl+X を押します。

  4. chmod コマンドを使用して、スクリプトを実行可能にします。

    chmod +x generate_logs.sh
    
  5. スクリプトを実行して、ログを Graylog に送信します。

    ./generate_logs.sh
    

    各ログが送信される際に、ターミナルに出力が表示されます。

    Sent log message 1
    Sent log message 2
    ...
    Sent log message 10
    
  6. 次に、これらのログを Graylog で表示しましょう。ブラウザで Graylog Web インターフェース(http://127.0.0.1:9000)に戻ります。

  7. トップナビゲーションバーの Search タブをクリックします。送信したばかりのログメッセージが「Messages」リストに表示されているはずです。インデックス化されて表示されるまで数秒かかる場合があります。

    Graylog がメッセージを自動的に解析し、timestampsourceapplication_nameseverity などのフィールドに分割する方法を確認できます。この構造化されたデータは、効果的なログ分析の鍵となります。

ログデータのクエリと分析

Graylog にログが流れ込むようになったので、それらを検索およびフィルタリングする方法を学びましょう。Graylog の検索機能は強力で、特定のイベントを迅速に特定できます。これは、問題のトラブルシューティングやセキュリティインシデントの調査に不可欠です。

  1. Graylog Web インターフェースの Search ページに移動します。検索バーはページの上部にあります。

  2. 簡単なクエリから始めましょう。シミュレートしたアプリケーションからのすべてのログを見つけるには、検索バーに次のように入力して Enter を押します。

    application_name:sample_app

    これにより、application_name フィールドが sample_app と完全に一致するログのみを表示するように結果がフィルタリングされます。

  3. 次に、他のクエリを試して、さまざまなフィルタリング機能を探ってみましょう。

    • 特定の重要度レベル(例:レベル 4)のログを見つける: severity:4
    • 重要度レベルが 5 より大きいログ(警告、エラーなど)を見つける: severity:>5
    • ログメッセージ内のフレーズを検索する: message:"log message 5"
    • AND を使用してフィルタを組み合わせる: application_name:sample_app AND severity:<3
  4. 検索のタイムフレームを制御することもできます。デフォルトでは、Graylog は「Last 5 minutes」のログを表示します。「Last 30 minutes」に変更するには、検索バーの左側にある時間範囲セレクターをクリックして、生成したすべてのログが検索結果に含まれるようにします。

  5. 頻繁に使用するクエリに簡単にアクセスできるように、保存できます。ここでは、重要度の高いイベントの検索を保存しましょう。

    • クエリを実行します:severity:>4
    • 検索バーの右側にあるフロッピーディスクアイコン(Save Search)をクリックします。
    • 「Save Search」ダイアログで、Title を入力します。たとえば、「High Severity Events」とします。
    • Save をクリックします。

    これで、左側のサイドバーにある「Saved Searches」リストからいつでもこの保存された検索にアクセスでき、重要なイベントをすばやく確認できます。

監視ダッシュボードの構築

検索ページはアクティブな調査に最適ですが、ダッシュボードはログデータの概要を一目で把握できます。この最後のステップでは、ログの主要なメトリクスを視覚化するためのいくつかのウィジェットを備えたダッシュボードを作成します。

  1. Graylog Web インターフェースで、トップメニューから Dashboards セクションに移動します。

  2. Create dashboard ボタンをクリックします。

    • Title: Application Health Dashboard
    • Description: Monitors the health and activity of sample_app.
    • Create をクリックします。
  3. これで空のダッシュボードができました。ウィジェットを追加しましょう。Unlock / Edit ボタンをクリックして編集モードに入ります。

  4. "Log Count" ウィジェットの追加: このウィジェットは、時間ごとのログメッセージの総数を示します。

    • Create Widget for Dashboard をクリックします。
    • ウィジェットタイプとして Aggregation を選択します。
    • 設定ウィンドウで:
      • Title: Total Log Volume
      • 「Rows」で、フィールドとして timestamp を選択します。
      • 視覚化タイプとして Bar Chart を選択します。
    • Create をクリックします。
  5. "Severity Distribution" ウィジェットの追加: このウィジェットは、重要度レベルごとのログの内訳を示します。

    • 再度 Create Widget for Dashboard をクリックします。
    • ウィジェットタイプとして Aggregation を選択します。
    • 設定ウィンドウで:
      • Title: Log Severity Distribution
      • 「Rows」で、フィールドとして severity を選択します。
      • 視覚化タイプとして Pie Chart を選択します。
    • Create をクリックします。
  6. "Recent Messages" ウィジェットの追加: このウィジェットは、最新のログメッセージのリストを表示します。

    • Create Widget for Dashboard をクリックします。
    • ウィジェットタイプとして Messages を選択します。
    • 設定ウィンドウで:
      • Title: Recent Log Messages
      • 「Streams」フィールドで、All messages が選択されていることを確認します。
    • Create をクリックします。
  7. ウィジェットを追加したら、ドラッグアンドドロップしてレイアウトを配置できます。角をドラッグしてサイズを変更することもできます。読みやすいように配置してください。

  8. レイアウトに満足したら、右上隅の Lock / Save ボタンをクリックしてダッシュボードを保存します。

これで基本的な監視ダッシュボードが作成されました。実際のシナリオでは、このようなダッシュボードは、システムの健全性やセキュリティ体制を監視する上で非常に役立ちます。

まとめ

この実験では、ログ管理と分析のための Graylog のコア機能について実践的な経験を積みました。Docker Compose を使用して、Graylog サーバー、OpenSearch、MongoDB を含む完全な Graylog 環境をデプロイすることから始めました。

次に、ログ収集を有効にするための Syslog 入力を設定し、スクリプトを使用してサンプルログデータを送信し、実際のアプリケーションログをシミュレートしました。Graylog の強力な検索およびクエリ言語を使用して、ログ内の特定の情報をフィルタリングおよび検索する方法を学びました。最後に、さまざまなウィジェットを備えたカスタムダッシュボードを構築してログメトリクスを視覚化し、システムアクティビティを一目で把握できるようにすることで、すべてをまとめました。これらのスキルは、サイバーセキュリティ監視および運用インテリジェンスで Graylog を使用するための強固な基盤を形成します。