公開:2022.09.07 03:00 | 更新: 2022.09.07 06:01
システムやアプリケーションにおいて、ログを出力するのが一般的となっております。
ログはシステム開発時のデバッグ、運用時のモニタリングおよび診断が主な使用方法で、継続的にログを出力しておくことで、トラブルシューティング、セキュリティインシデントの対応や監査、性能改善の手がかりなどに活用することができます。
ログに含まれる情報が多いほど問題を解決するための手がかりが増えるため、多くの情報を出力するような仕組みになります。
そのためログは管理サーバーへ不正侵入された場合に狙われる可能性が高いものとなります。
ログに機密データ(ユーザーID、パスワード、クレジットカードなど)をマスキングや暗号化を行わず記録している場合、参照され個人情報の流出へとつながることになります。
ログのへ不正アクセスを防げますが、万が一のためにもロギングへのセキュリティ対策を行う必要があります。
「OWASP Top 10」でもログのセキュリティとして「A09:2021 – Security Logging and Monitoring Failures」としてランクインしております。
「OWASP Top 10」とは「OWASP」がWebアプリケーションに関する脆弱性やリスク、攻撃手法などの動向を研究し、Webセキュリティ上多発する脅威の中で、その危険性が最も高いと判断された項目をまとめ、定期的(2~3年周期)に発行しているセキュリティレポートになります。
ロギングを正しく行うことで不正行為、侵入検知をいち早く察知することができますが、失敗しますと説明責任、可視化、インシデントアラート、フォレンジックなどに影響があります。
A09 セキュリティログとモニタリングの失敗 - OWASP Top 10:2021
セキュリティログの実装のベストプラクティスとして以下の項目が挙げられます。
ログは安全な方法で構築され、管理されなければなりません。
安全なロギング設計には、以下のようなものがあります。
ここで挙がった「機密データを記録しない。」に関して、機密データ保持のために「OWASP」が提供しています「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='********'
マスキング機能の他にも便利な機能もあります。以下、一部の機能を記載します。
セキュリティの観点からログについて纏めてみました。アプリケーションの診断やセキュリティフォレンジック、監視監査業務を行うにおいてログは必要不可欠でありますが、ロギングへのセキュリティは疎かになりがちかと思われます。
これを機に管理アプリケーションやシステムのロギングについて見直してみてはいかがでしょうか。