株式会社セキュアイノベーション

    Menu

    セキュリティ技術BLOG

      公開:2022.09.07 03:00 | 更新: 2022.09.07 06:01

      セキュリティロギングについて

      目次

      ログのセキュリティについて

      システムやアプリケーションにおいて、ログを出力するのが一般的となっております。

      ログはシステム開発時のデバッグ、運用時のモニタリングおよび診断が主な使用方法で、継続的にログを出力しておくことで、トラブルシューティング、セキュリティインシデントの対応や監査、性能改善の手がかりなどに活用することができます。
      ログに含まれる情報が多いほど問題を解決するための手がかりが増えるため、多くの情報を出力するような仕組みになります。

      そのためログは管理サーバーへ不正侵入された場合に狙われる可能性が高いものとなります。
      ログに機密データ(ユーザーID、パスワード、クレジットカードなど)をマスキングや暗号化を行わず記録している場合、参照され個人情報の流出へとつながることになります。
      ログのへ不正アクセスを防げますが、万が一のためにもロギングへのセキュリティ対策を行う必要があります。

      OWASP Top 10 2021 A09:2021

      「OWASP Top 10」でもログのセキュリティとして「A09:2021 – Security Logging and Monitoring Failures」としてランクインしております。

      「OWASP Top 10」とは「OWASP」がWebアプリケーションに関する脆弱性やリスク、攻撃手法などの動向を研究し、Webセキュリティ上多発する脅威の中で、その危険性が最も高いと判断された項目をまとめ、定期的(2~3年周期)に発行しているセキュリティレポートになります。

      ロギングを正しく行うことで不正行為、侵入検知をいち早く察知することができますが、失敗しますと説明責任、可視化、インシデントアラート、フォレンジックなどに影響があります。

      A09 セキュリティログとモニタリングの失敗 - OWASP Top 10:2021

      セキュリティログの実装について

      セキュリティログの実装のベストプラクティスとして以下の項目が挙げられます。

      • システムおよび組織の間で、共通のログ形式とアプローチに従うこと
        ログの出力箇所やフォーマットが共通ではない場合、ログから重要内容を漏らしてしまう可能性が高くなります。不正侵入に気づけず、対応が遅れてしまい大災害に陥ります。
      • アプリケーション間のロギングの一貫性のため共通のロギングフレームワークを使用する
        各々のアプリケーションでのロギング方法が異なる場合、ログフォーマットや設定が統一されなくログチェックに時間を要しますので可能であれば共通のロギングフレームワークを使用するのがよいでしょう。
        ただし、ロギングフレームワークで有名なlog4shellに脆弱性はありましたので依存するフレームワークへのアップデートには注意を払う方がよいでしょう。
      • ログの量が多すぎたり少なすぎたりしないようにする
        例えば、タイムスタンプ、ソースIPやユーザーIDなどの識別情報を常にログに記録するようにしますが、プライベートまたは機密データをログに記録しないように注意してください。
      • タイムスタンプが一貫していることを確認するために、ノード間の時間同期に細心の注意を払うこと
        ログのタイムスタンプにズレが生じている場合、正確な時間軸での調査が困難になります。

      セキュアなロギング設計

      ログは安全な方法で構築され、管理されなければなりません。
      安全なロギング設計には、以下のようなものがあります。

      • ログインジェクション攻撃を防ぐために、ログを記録する前に危険な文字をエンコードし検証する。
      • 機密データを記録しない。パスワード、セッションID、クレジットカードなどをログに記録しない。
      • ログの完全性を保護する。攻撃者はログの改ざんを試みる可能性があります。
        ログファイルの権限とログ変更の監査を考慮する必要があります。
      • 分散したシステムからのログを、中央の安全なログ収集サービスに転送する。
        1つのノードが侵害された場合でもログが失われることはありません。ログの一元監視も可能になります。

      ここで挙がった「機密データを記録しない。」に関して、機密データ保持のために「OWASP」が提供しています「owasp-security-logging」を使用した機密情報のマスキングの例を次項で記載したいと思います。

      owasp-security-loggingを利用したロギング

      セキュリティ関連のイベントをログに記録するための標準のJavaAPIでロギングフレームワークは「Logback」と「log4j」をサポートしております。

      GitHub - augustd/owasp-security-logging: OWASP Security Logging library for Java

      今回はMavenプラグインを利用し、「owasp-security-logging」を使用します。
      例では「Logback」を用いたいと思います。

      プラグインの実装

      Mavenプロジェクトのpom.xmlに「owasp-security-logging」のプラグインを追加します。
      ロギングフレームワークであるlogback(slf4j)については、「owasp-security-logging」に含まれているバージョンのプラグインを使用します。
      ※含まれるフレームワークは古いバージョンのため実際は個別に追加した方がよいです。

      ログバックの構成

      ロガー構成に要素を追加します。
      conversionWord属性ではマスクを行う必要があるパターンを定義します。
      今回、conversionWord属性を「mask」としました。

      <conversionRule conversionWord="mask" converterClass="org.owasp.security.logging.mask.MaskingConverter" />

      定義でconversionWord属性の「mask」を使用するように要素を変更します。

      <appender name="MASK_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
       <encoder>
        <pattern>%d{yyyy/MM/dd HH:mm:ss.SSS} [%thread] %-5level [マスク有] - %mask%n</pattern>
       </encoder>
      </appender>

      コーディング

      入力文字を「*」に変換することにより、機密情報などのマスキングします。
      Javaソースコードで、機密情報を含む可能性のあるログステートメントに「CONFIDENTIAL」のマーカーを追加します。

      実行した結果が以下となります。
      [マスク有] - Marker有の場合に入力文字が「*」に変換されたことが確認できます。

      2022/07/07 08:40:32.540 [main] INFO [マスク無] - Marker無 userid=root, password='password'
      2022/07/07 08:40:32.540 [main] INFO [マスク有] - Marker無 userid=root, password='password'
      2022/07/07 08:40:32.540 [main] INFO [マスク無] - Marker有 userid=root, password='password'
      2022/07/07 08:40:32.540 [main] INFO [マスク有] - Marker有 userid=********, password='********'

      マスキング機能の他にも便利な機能もあります。以下、一部の機能を記載します。

      • インターバルロギング機能
        アプリケーション診断とセキュリティフォレンジックを支援するためにインターバルロギング機能を利用できます。
      • フィルタ機能
        フィルタを使用してログイベントをさまざまなログにルーティングしたり、特定の種類の情報がログに書き込まれないようにしたりできます。
      • 環境変数出力機能
        アプリケーション起動時に環境変数値を出力する機能を利用できます。
        アプリケーションがクラッシュ、セキュリティインシデントが発生した場合、プログラムを起動した正確なコマンドラインオプション、シェルの環境変数値、およびJavaシステムプロパティを確認すると便利です。

      終わりに

      セキュリティの観点からログについて纏めてみました。アプリケーションの診断やセキュリティフォレンジック、監視監査業務を行うにおいてログは必要不可欠でありますが、ロギングへのセキュリティは疎かになりがちかと思われます。
      これを機に管理アプリケーションやシステムのロギングについて見直してみてはいかがでしょうか。

      セキュアイノベーション サービス一覧

      ネットワーク・サーバー

      Webサイトを守る

      ヘルプデスク・サポート