この文書は2016年以降更新されていません

ロギングに関するチートシート

OWASP 作成
ジャンプ先: 移動検索
Cheatsheets-header.jpg

最終改訂日 (yy/mm/dd): 2015/07/18

はじめに

このチートシートは、特にセキュリティロギングに関して、アプリケーションのロギングメカニズムを構築するための集中ガイダンスを開発者に提供することに重点を置いています。多くのシステムでは、ネットワークデバイス、オペレーティングシステム、Web サーバー、メールサーバー、およびデータベースサーバーのロギングが有効になっていますが、アプリケーションイベントのロギングが欠けていたり、無効になっていたり、適切に設定されていなかったりすることがよくあります。アプリケーションイベントのロギングでは、インフラストラクチャロギングだけの場合に比べ、はるかに多くの洞察が得られます。Web アプリケーション (Web サイト、Web サービスなど) のロギングは、拡張ログファイル形式などを使用して Web サーバーのログを有効にするよりも一段と優れています。

アプリケーションロギングは、アプリケーション内だけでなく組織のアプリケーションポートフォリオ全体を通じて一貫性を保つことが必要であり、該当する場合は業界標準規格を採用することをお勧めします。これにより、ログに記録したイベントデータを多様なシステムで使用、関連付け、管理できるようになります。

目的

アプリケーションロギングには、必ずセキュリティイベントを含めます。アプリケーションログは、以下の目的にきわめて貴重なデータです。

  • セキュリティインシデントの特定
  • ポリシー違反の監視
  • ベースラインの設定
  • 障害や異常な状況に関する情報の提供
  • インシデント調査に役立つ、他のログソースにはない追加のアプリケーション固有データの提供
  • 攻撃の検出による、脆弱性の特定と悪用に対する防御支援

アプリケーションロギングを使用して、上記の他に次のようなイベントも記録できます。

  • セキュリティイベント
  • ビジネスプロセスの監視 (販売プロセス、破棄、取引、関係など)
  • 監査証跡 (データの追加、変更、削除、エクスポートなど)
  • パフォーマンスの監視 (データロード時間、ページタイムアウトなど)
  • 法令遵守の監視
  • 後の情報提供依頼のためのデータ (データ主体アクセス、情報公開、訴訟、警察、その他の法規制上の調査)
  • 法的に認められたデータ傍受 (アプリケーション層の傍受など)
  • その他のビジネス固有の要件

通常、プロセス監視、監査、トランザクションのログ / 証跡などは、セキュリティイベントロギングとは異なる目的で収集されます。したがって、多くの場合、これらのログ / 証跡は別にしておく必要があります。収集するイベントの種類と詳細は異なる傾向にあります。たとえば、PCIDSS 監査ログは活動の時系列記録を格納し、独立して検証可能な証跡を提供します。この証跡により、帰属トランザクションの元の順序を特定するための再構築、確認、調査が可能になります。 ログへの記録は、多すぎず少なすぎないことが重要です。意図する目的に応じて、何を、いつ、どれだけ記録するか判断してください。ここからは、主にセキュリティイベントのロギングについて説明します。


設計、実装、テスト

イベントデータのソース

アプリケーション自体から、ログエントリの生成に使用される広範な情報にアクセスできます。したがって、イベントデータの一番のソースはアプリケーションコードそのものです。アプリケーションは、ユーザーに関する情報 (ID、ロール、アクセス許可) やイベントのコンテキストについての情報 (ターゲット、アクション、結果) のほとんどを把握しています。このデータは、多くの場合、インフラストラクチャデバイスからも、密接に関係する他のアプリケーションからも入手できないものです。

アプリケーションの使用状況に関する他の情報源で、検討に値するものを次に示します。

  • クライアントソフトウェア (ローカルログに記録された、またはメッセージングテクノロジを使用したデスクトップソフトウェアおよびモバイルデバイス上の操作、Ajax による JavaScript 例外ハンドラー、コンテンツセキュリティポリシー (CSP) レポートメカニズムなどを使用した Web ブラウザーなど)
  • 埋込みのインストルメンテーションコード
  • ネットワークファイアウォール
  • ネットワークとホストの侵入検出システム (NIDS、HIDS)
  • 密接に関係するアプリケーション (Web サーバーソフトウェアに組み込まれたフィルター、Web サーバーによるカスタムエラーページやハンドラーへの URL リダイレクト / 書き換えなど)
  • アプリケーションファイアウォール (フィルター、ガード、XML ゲートウェイ、データベースファイアウォール、Web アプリケーションファイアウォール (WAF など))
  • データベースアプリケーション (自動監査証跡、トリガーベースのアクションなど)
  • 評判監視サービス (可用時間やマルウェアの監視)
  • その他のアプリケーション (不正使用監視、CRM など)
  • オペレーティングシステム (モバイルプラットフォームなど)

異なる信頼ゾーンに属すシステムのイベント情報を含めるときは、イベント情報の信頼度を考慮する必要があります。データが欠落、改ざん、偽造、リプレイされた可能性や、悪意のあるデータであるおそれがあります。必ず、信頼できないデータとして扱ってください。ソースを検証する方法、および完全性と否認不可を実現する方法を検討してください。

どこにイベントデータを記録するか

アプリケーションは通常、イベントログデータをファイルシステムかデータベース (SQL または NoSQL) に書き込みます。デスクトップやモバイルデバイスにインストールされたアプリケーションは、ローカル記憶域とローカルデータベースを使用できるほか、データをリモート記憶域にも送信できます。選択したフレームワークによって利用できる選択肢が制限される場合もあります。どの種類のアプリケーションもイベントデータを (ローカル記憶域の代わりに、またはローカル記憶域に加えて) リモートシステムへ送信できます。これは、集中型のログ収集 / 管理システム (SIEM、SEM) でも別のアプリケーションでもかまいません。実行環境で管理できるように、アプリケーションのイベントストリームを単純にバッファリングなしで標準出力へ送信できないかどうか検討してください。

  • ファイルシステムを使用する場合は、オペレーティングシステム、他のアプリケーションファイル、およびユーザー作成コンテンツが使用するパーティションとは別のパーティションの使用をお勧めします。
    • ファイルベースのログの場合は、各ディレクトリにアクセスできるユーザーや、ディレクトリ内の各ファイルのアクセス許可について、厳密にアクセス許可を適用してください。
    • Web アプリケーションでは、ログを Web からアクセス可能な場所に置かないでください。Web からアクセス可能な場所に置く場合は、アクセス制限を設定し、MIME タイプは HTML ではなくプレーンテキストにしてください。
  • データベースを使用する場合は、ログデータの書き込み専用のデータベースアカウントを使用することをお勧めします。このアカウントでは、データベース、テーブル、関数、コマンドへのアクセス許可を必要最小限に限定してください。
  • イベントデータやログファイルを他のシステムへ送信する場合は、セキュアな通信プロトコル上で標準的な形式のデータにして送信してください。たとえば、共通ログファイルシステム (CLFS)、syslog 上の共通イベント形式 (CEF) のほか、将来的には共通イベント記述 (CEE) などです。標準形式は、集中型のロギングサービスとの統合を容易にします。

エラースタックトレースや HTTP リクエストや応答のヘッダー情報や本文といった拡張イベント情報については、別のファイル / テーブルへの保存を検討してください。

どのイベントをログに記録するか

プロジェクトの要件と設計の段階で、セキュリティの監視、アラート、およびレポートのレベルと内容を設定する必要があります。また、これは情報セキュリティリスクに見合ったものであることが必要です。その後、この設定に基づいて、何をログに記録するかを定義できます。すべてに対応できる万能のソリューションは存在しません。無闇にログをとると、無用なアラームが多発し、実際の問題が見過ごされてしまいます。できる限り、以下の項目は必ずログに記録してください。

  • 入力検証エラー (プロトコル違反、受け入れ不可能なエンコード、無効なパラメータ名と値など)
  • 出力検証エラー (データベースレコードセットの不整合、無効なデータエンコードなど)
  • 認証の成否
  • 認可 (アクセス制御) エラー
  • セッション管理エラー (Cookie のセッション ID 値の変更など)
  • アプリケーションエラーとシステムイベント (構文および実行時エラー、接続障害、パフォーマンス障害、サードパーティサービスのエラーメッセージ、ファイルシステムのエラー、ファイルアップロード時のウイルス検出、構成の変更など)
  • アプリケーションと関連システムの起動と終了、およびロギングの初期化 (開始、停止、一時停止)
  • 比較的リスクの高い機能の使用 (ネットワーク接続、ユーザーの追加と削除、権限の変更、トークンへのユーザーの割り当て、トークンの追加と削除、システム管理特権の使用、アプリケーション管理者によるアクセス、管理特権を持つユーザーによるすべての操作、支払カードの名義人データへのアクセス、データ暗号鍵の使用、鍵の変更、システムレベルのオブジェクトの作成と削除、画面ベースのレポートを含むデータのインポートとエクスポート、ユーザー作成コンテンツの送信、特にファイルアップロードなど)
  • 法定その他のオプトイン (携帯電話機能のアクセス許可、利用規約、使用条件、個人データの使用許諾、マーケティング情報の受け取り許可など)

オプションとして、以下のイベントがロギング可能であるかどうか、望ましい情報であるかどうかを検討してください。

  • シーケンス処理エラー
  • 過度な使用
  • データの変更
  • 不正その他の犯罪活動
  • 疑わしい挙動、許容できない挙動、または予期せぬ挙動
  • 構成の変更
  • アプリケーションコードファイルやメモリの変更

イベントの属性

各ログエントリは、その後の監視や分析に必要十分な情報を含んでいる必要があります。コンテンツデータ全体でもかまいませんが、抜粋や概要プロパティだけの方が一般的です。アプリケーション ログには、"いつ、どこで、誰が、何を" をイベントごとに記録する必要があります。これらのプロパティは、アーキテクチャやアプリケーションの種類、ホストシステム / デバイスによって異なりますが、通常、以下を含みます。

  • いつ
    • ログの日時 (国際形式)
    • イベントの日時: イベントのタイムスタンプは、ロギングの時間と異なることがあります (定期的または断続的にのみオンラインになるリモートデバイス上にクライアントアプリケーションがホストされている場合のサーバーのロギングなど)
    • 対話式操作の識別子 (注 A を参照)
  • どこで
    • アプリケーションの識別子 (名前とバージョンなど)
    • アプリケーションのアドレス (クラスタ / ホスト名、サーバーの IPv4 または IPv6 アドレスとポート番号、ワークステーション ID、ローカルデバイス識別子など)
    • サービス (名前とプロトコルなど)
    • 位置情報
    • ウィンドウ / フォーム / ページ (Web アプリケーションのエントリポイント URL と HTTP メソッド、ダイアログボックス名など)
    • コードの位置 (スクリプト名、モジュール名など)
  • 誰が (人間またはマシンユーザー)
    • ソースアドレス (ユーザーのデバイス / マシンの識別子、ユーザーの IP アドレス、移動通信 / 無線基地局 ID、携帯電話番号など)
    • ユーザー ID (認証された場合または既知の場合) (ユーザーデータベーステーブルの主キー値、ユーザー名、ライセンス番号など)
  • 何を
    • イベントの種類 (注 B を参照)
    • イベントの重大度 (注 B を参照) {0=緊急、1=警告、7=デバッグ}、{致命的、エラー、警告、情報、デバッグ、トレース} など
    • セキュリティ関連イベントフラグ (ログに非セキュリティイベントデータも含まれる場合)
    • 説明

加えて、以下の項目の記録も検討してください。

  • 別の時刻情報源 (GPS など) を使って記録したイベントの日時
  • 処理: リクエストの所期の目的 (ログイン、セッション ID のリフレッシュ、ログアウト、プロファイルの更新など)
  • オブジェクト (影響を受けるコンポーネントなど) やその他のオブジェクト (ユーザーアカウント、データリソース、ファイル) (URL、セッション ID、ユーザーアカウント、ファイルなど)
  • 結果ステータス: オブジェクトに対する目的の処理の成否 (成功、失敗、延期など)
  • 理由: 前述のステータスが発生した理由 (ユーザーがデータベースチェックで認証されなかった、無効な資格情報など)
  • HTTP 状態コード (Web アプリケーションのみ): ユーザーに返された状態コード (通常は 200 または 301)
  • リクエストの HTTP ヘッダーまたは HTTP ユーザーエージェント (Web アプリケーションのみ)
  • ユーザータイプの分類 (パブリック、認証されたユーザー、CMS ユーザー、検索エンジン、許可された侵入テスト担当者、可用時間モニターなど) (下の「除外するデータ」を参照)
  • イベント検出の分析信頼度 (注 B を参照) (低、中、高、または数値など)
  • ユーザーに表示された応答やアプリケーションによる応答 (状態コード、個別のテキストメッセージ、セッション終了、管理者アラートなど)
  • 拡張詳細 (スタックトレース、システムエラーメッセージ、デバッグ情報、HTTP リクエストの本文、HTTP 応答のヘッダーと本文など)
  • 内部分類 (責任、法令遵守レファレンスなど)
  • 外部分類 (NIST のセキュリティ設定共通化手順 (SCAP)、Mitre の共通攻撃パターン一覧 (CAPEC) など)

以上の詳細については、巻末に挙げる「その他」の関連資料を参照してください。特に、Anton Chuvakin 氏と Gunnar Peterson 氏による総合的な資料を参照してください。

注 A: "対話式操作の識別子" とは、ユーザーによる単一の対話式操作 (デスクトップアプリケーションのフォーム送信、Web ページのリクエスト、モバイルアプリのボタンクリック、Web サービスの呼び出しなど) に関連するすべてのイベントをリンクするための方法です。これらすべてのイベントが同じ対話式操作に関連していることをアプリケーションは認識しています。この情報を失うことなく記録しておけば、後で関連付け手法によって力ずくで個々のイベントを再構成せずにすみます。たとえば、1 つの SOAP リクエストに複数の入力検証エラーがあり、各エラーが短い期間にわたっている場合があります。別の例として、出力検証エラーが入力の送信からかなり後に発生することがあります。これは、実行時間の長いリクエストがアプリケーションからデータベースサーバーに送信されるためです。

注 B: 各組織は、イベントの分類 (種類、信頼度、重大度)、記述の構文、フィールドの長さとデータ型 (日時に使用する形式を含む) について、文書化された一貫したアプローチを確保する必要があります。

除外するデータ

法的に認められる場合を除いては、絶対にデータをログに記録しないでください。たとえば、通信の傍受、従業員の監視、許諾なしのデータ収集は、すべて違法にあたる可能性があります。

"既知の" ユーザー (他の内部システム、"信頼できる" サードパーティ、検索エンジンロボット、可用時間 / プロセスおよびその他のリモート監視システム、侵入テスト担当者、監査担当者など) からのイベントは、絶対に除外しないでください。記録されたデータにイベントごとの分類フラグを追加したい場合があります。

一般に、以下のものはログに直接記録しないで、削除、サニタイズ、ハッシュ化、または暗号化してください。

  • アプリケーションのソース コード
  • セッション識別値 (セッション固有のイベントを追跡する必要がある場合は、ハッシュ値への置換を検討してください)
  • アクセストークン
  • 機密個人データとある種の個人情報 (PII) (健康、政府の識別子、社会的弱者など)
  • 認証パスワード
  • データベース接続文字列
  • 暗号鍵
  • 銀行口座または支払カードの名義人データ
  • ロギングシステムへの保存が許可されているセキュリティ分類を超えるデータ
  • 商業上の機密情報
  • 当該管轄内で収集が違法である情報
  • ユーザーが収集をオプトアウトしたか、許諾しなかった情報 (トラッキング拒否の使用、収集の許諾が失効した場合など)

場合によっては、以下のデータが存在してもかまいませんが、これらのデータは後の調査に役立つ一方、イベントを記録する前に特別な扱いが必要になる可能性があります。

  • ファイルパス
  • データベース接続文字列
  • 内部ネットワーク名とアドレス
  • 機密でない個人データ (個人名、電話番号、メールアドレスなど)

個人の ID が必要でない場合やリスクがきわめて高いと考えられる場合は、個人データの非特定化手法 (直接および間接の識別情報の削除、スクランブリング、匿名化など) の使用を検討してください。

一部のシステムでは、ログの収集後とログの表示前にサニタイズを実行できます。

カスタマイズ可能なロギング

ロギングのレベル (重大度または脅威のレベル、記録する詳細の量に基づくイベントの種類) を変更できることが望ましい場合があります。これを実装する場合は、以下のことを確保してください。

  • 既定のレベルがビジネスニーズに必要十分な詳細を提供する。
  • 法令遵守の要件に必要なアプリケーションロギングまたはイベントのロギングを完全には非アクティブ化できないようにする。
  • ロギングのレベル / 範囲の変更は、アプリケーション内で行うか (承認されたアルゴリズムに基づいてアプリケーションで自動実行するなど)、または変更管理プロセスに従って行う (構成データの変更、ソースコードの変更など)。
  • ロギングレベルを定期的に検証する。

イベントの収集

開発フレームワークで適切なロギングメカニズムがサポートされている場合は、それを使用するか、それをもとに構築します。それ以外の場合は、他のモジュール / コンポーネントから呼び出すことができるアプリケーション全体のログハンドラーを実装します。組織固有のイベント分類と記述構文の要件を参照しながら、インターフェイスを文書化します。可能であれば、このログハンドラーは、完全なテストも、複数のアプリケーションへの展開も、承認された推奨モジュールの一覧への追加もできる標準モジュールとして作成します。

  • 他の信頼ゾーンからのイベントデータに対して入力検証を実行し、データが適切な形式であることを確認します。入力検証エラーがある場合は、警告するかロギングしないことを検討します。
  • すべてのイベントデータに対してサニタイズを実行し、ログインジェクション攻撃を防御します (復帰 (CR)、改行 (LF)、区切り文字など)。また、オプションとして機密データを削除します。
  • 出力 (ログ) 形式に合わせてデータを適切にエンコードします。
  • データベースに書き込む場合は、SQL インジェクションに関するチートシートを読み、内容を理解して適用します。
  • ロギングプロセス / システム内の障害によってアプリケーションの実行が妨げられることや情報漏えいを許すことがないようにします。
  • すべてのサーバーとデバイスの時刻を同期させます (注 C を参照)。

注 C: 他者の制御下にあるデバイス (個人の携帯電話、異なる社内ネットワーク上にある、リモート顧客のワークステーションなど) 上でアプリケーションが実行されている場合は、同期できないこともあります。このよう場合は、時間差を測定するか、イベントのタイムスタンプに信頼度を記録します。

できる限り標準形式でデータを記録します。または、少なくとも、業界標準形式を使用してエクスポート / ブロードキャストできるようにします。

複数のイベントが中間点でまとめて中継または収集される場合があります。後者の場合、一部のデータが集約または集計されてから、集中リポジトリおよび分析システムに転送される可能性があります。

検証

ロギングの機能とシステムを、コードレビュープロセス、アプリケーションテストプロセス、およびセキュリティ検証プロセスに必ず含めます。

  • ロギングが仕様どおりに正しく動作することを確認します。
  • イベントが矛盾なく分類されており、フィールドの名前、型、および長さが合意した標準に従って定義されていることを確認します。
  • ロギングが実装され、有効化されていることをアプリケーションのセキュリティテスト、ファジングテスト、侵入テスト、およびパフォーマンステストで確認します。
  • メカニズムがインジェクション攻撃に対して脆弱でないかどうかテストします。
  • ロギングの実行時に意図しない副作用がないことを確認します。
  • 外部ネットワーク接続が失われた際のロギングメカニズムへの影響を確認します (これが日常的に必要な場合)。
  • たとえば、ディスク領域を満杯にしたり、データベースのトランザクションログ領域を超過したりするなどして、システムリソースを使い切り、サービス妨害 (DoS) を引き起こす目的にロギングが悪用できないことを確認します。
  • ロギングの障害がアプリケーションに及ぼす影響をテストします。たとえば、データベース接続の喪失、ファイルシステム領域の不足、ファイルシステムに対する書き込みアクセス許可の欠如、ロギングモジュール自体の実行時エラーなどをシミュレートします。
  • イベントログデータに対するアクセス制御を確認します。
  • ログデータがユーザーに対する任意のアクション (アクセスのブロック、アカウントのロックなど) で使用される場合は、これが他のユーザーのサービス妨害 (DoS) を引き起こす目的に利用できないことを確認します。


展開と運用

リリース

  • ロギングメカニズムの詳細をリリースドキュメントに追加することで、セキュリティ構成情報を提供します。
  • アプリケーションのロギングメカニズムについて、アプリケーション / プロセスの所有者に概略を説明します。
  • 監視 (下記参照) の出力がインシデント対応プロセスに統合されていることを確認します。

運用

ロギングが停止したかどうかを検出するプロセスと、改ざんまたは不正なアクセスや削除を識別するプロセスを有効にします (下記の「保護」を参照)。

保護

ロギングメカニズムと収集されたイベントデータを、転送中の改ざんや保存後の不正なアクセス、変更、削除などの悪用から保護する必要があります。ログに個人その他の機密情報が含まれていたり、データにアプリケーションのコードやロジックが含まれていたりする可能性があります。また、収集された情報そのものに、(競合他社、ゴシップ屋、ジャーナリスト、活動家にとって) ビジネス上の価値がある場合があります。たとえば、収益を推測できたり、従業員の業績情報が得られたりするなどです。このデータは、端末デバイス、中間点、集中リポジトリ、アーカーブ、およびバックアップに保持されている可能性があります。調査時またはデータを取り出す時にデータの一部を除外、マスク、サニタイズ、ハッシュ化、または暗号化することを検討してください。

保存時:

  • レコードが変更または削除されたかどうかを察知できるように、改ざん検出機能を組み込みます。
  • ログデータをできるだけ早く読み取り専用媒体に保存またはコピーします。
  • ログへのアクセスをすべて記録し、監視します (事前承認を要求する方法もあり)。
  • ログデータを読み取る権限を制限し、定期的に見直します。

転送時:

  • ログデータを (収集、他の場所へのディスパッチ、分析、レポートなどの目的で) 信頼できないネットワークを通じて送信する場合は、セキュアな通信プロトコルを使用します。
  • イベントデータの生成元の検証が必要かどうかを検討します。
  • イベントデータをサードパーティに送信する前に due diligence check (法規制およびセキュリティ) を実行します。

詳細なガイダンスについては、『NIST SP 800-92 Guide to Computer Security Log Management』(コンピューターセキュリティログ管理ガイド) を参照してください。

イベントの監視

ログに記録されたイベントデータはレビューが可能であることが必要です。また、適切な監視、通知、レポートのためのプロセスが確立されている必要があります。

  • アプリケーションロギングを既存のログ管理システム / インフラストラクチャ (集中ロギングシステム、集中分析システムなど) に組み込みます。
  • イベント情報を適切なチームが入手できることを確認します。
  • より重大なイベントについては、即時に担当チームに通知できるようにします。
  • 該当するイベント情報を他の検出システム、関連組織、集中インテリジェンス収集 / 共有システムと共有します。

ログの廃棄

ログデータ、一時デバッグログ、およびバックアップ / コピー / 抽出を、所定のデータ保持期間が経過する前に破棄してはなりません。また、この期間を超えて保持してもいけません。法律、規制、および契約上の義務がこの保持期間に影響することがあります。


関連資料

OWASP ESAPI ドキュメント

OWASP Logging Project

IETF syslog protocol

Mitre Common Event Expression (CEE)

NIST SP 800-92 Guide to Computer Security Log Management

PCISSC PCI DSS v2.0 要件 10 と PA-DSS v2.0 要件 4

W3C Extended Log File Format

その他 How to Do Application Logging Right、Anton Chuvakin & Gunnar Peterson、IEEE Security & Privacy Journal

その他 Build Visibility In、Richard Bejtlich、TaoSecurity ブログ

その他 Common Event Format (CEF)、Arcsight

その他 Application Security Logging、Colin Watson、Web Security Usability and Design Blog

その他 Common Log File System (CLFS)、Microsoft

その他 Building Secure Applications: Consistent Logging、Rohit Sethi & Nish Bhalla、Symantec Connect


Authors and Primary Contributors

Most of the information included is based on content in the articles referenced in the text and listed above, but the following people have provided their ideas, knowledge and practical experience:

Colin Watson - colin.watson[at]owasp.org
Eoin Keary - eoin.keary[at]owasp.org
Alexis Fitzgerald - alexis.fitzgerald[at]owasp.org

Other Cheatsheets

Developer Cheat Sheets (Builder)

Assessment Cheat Sheets (Breaker)

Mobile Cheat Sheets

OpSec Cheat Sheets (Defender)

Draft Cheat Sheets