Fess 15.5に向けたセキュリティ強化

Fess 15.4のリリースに向けて、セキュリティ面でのさまざまな強化を行いました。より安全な運用を実現するための改善点をまとめて紹介します。

暗号化関連の改善

SAML署名アルゴリズムの更新

SAML認証で使用する署名アルゴリズムのデフォルトをRSA-SHA256に更新しました。Azure AD、Okta、OneLoginなど主要なIdPはSHA-256を標準としてサポートしており、より堅牢な認証連携が可能になります。

暗号化アルゴリズムの設定警告

DES、Blowfish、MD5などレガシーな暗号化アルゴリズムが設定されている場合に、起動時に警告ログを出力するようにしました。AESやSHA-256への移行を促すメッセージが表示され、より安全なアルゴリズムへの移行を支援します。

設定プロパティ名の統一

セキュリティという感じではないですが、暗号化アルゴリズム関連の設定プロパティ名を app.cipher.algorithmapp.digest.algorithm に統一しました。

認証・認可の強化

パスワードポリシーの設定

パスワードポリシーを設定できるようになりました。以下の項目を fess_config.properties で設定可能です。

  • password.min.length: 最小文字数(デフォルト: 8)
  • password.require.uppercase: 大文字を必須にするか
  • password.require.lowercase: 小文字を必須にするか
  • password.require.digit: 数字を必須にするか
  • password.require.special.char: 特殊文字を必須にするか

管理画面でのユーザー作成、プロフィールでのパスワード変更、パスワードリセット時にポリシーが適用されます。

LDAPエスケープ処理の追加

LDAP認証で使用するフィルタやプリンシパルの構築時に、RFC 4515に準拠したエスケープ処理を行うようにしました。バックスラッシュ、アスタリスク、括弧などの特殊文字が適切に処理されます。

メモリ上のパスワードクリア

ユーザー作成・更新処理の完了後、Userエンティティに一時的に保持された平文パスワードをメモリからクリアする処理を追加しました。

ファイル操作の改善

アトミックファイル操作

サムネイル生成処理で、Java NIOのアトミック操作を使用するように改善しました。Files.deleteIfExists()Files.createDirectories() を使用することで、マルチスレッド環境でのファイル操作がより堅牢になります。

パストラバーサル対策

管理画面のデザインファイルアップロード、JSP編集、ログファイルダウンロードにおいて、パスの検証を強化しました。.. シーケンスの除去、パス区切り文字の正規化、ホワイトスペースの除去などを行い、意図しないディレクトリへのアクセスを防止します。

監査・ログ機能の強化

スクリプト実行の監査ログ

Groovyスクリプトの実行を監査ログに記録する機能を追加しました。スクリプトの種類、内容、実行元、ユーザー、実行結果がログに記録されます。script.audit.log.enabled 設定で有効/無効を切り替えられます。

機密情報のマスキング

デバッグログ出力時に、環境変数やシステムプロパティの中で機密性の高い値(PASSWORD、SECRET、TOKEN、KEYなどを含むキー)を自動的にマスキングするようにしました。パターンは app.log.sensitive.property.pattern で設定可能です。

SAMLログの機密情報軽減

SAMLログアウト時の警告ログで、SamlUserオブジェクト全体ではなくユーザー名のみを出力するように変更しました。

シリアライズの安全性向上

Kryoシリアライザで、クラス登録を必須とする設定に変更しました。プリミティブ型、コレクション、日付などの許可されたクラスのみがデシリアライズ可能となり、ガジェットチェーン攻撃のリスクを軽減します。

まとめ

これらの改善により、Fessはより堅牢なセキュリティを備えた検索プラットフォームになります。特にエンタープライズ環境での運用において、監査ログやパスワードポリシーなどの機能が有用です。

FessをMCPサーバーとして利用する

Fessを生成AIと連携させたいという要望が増えてきています。そこで、FessをMCP(Model Context Protocol)サーバーとして利用できるプラグインを公開しました。これにより、Claude DesktopなどのMCP対応AIクライアントからFessの検索機能を直接利用できるようになります。

MCPとは

MCPは、生成AIとデータソースを接続するためのオープンなプロトコルです。Anthropic社が策定したもので、AIアシスタントが外部のツールやデータにアクセスするための標準的な方法を提供します。

Fessをこのプロトコルに対応させることで、AIとの対話の中でFessの検索を行い、検索結果をAIの回答生成に活用できるようになります。

必要な環境

  • Fess 15.x 以降
  • Java 21 以降

インストール方法

fess-webapp-mcpプラグインをインストールすることで、FessがMCPサーバーとして機能するようになります。(管理画面からもインストールできます)

  1. Maven RepositoryからプラグインのJARファイルをダウンロード
  2. ダウンロードしたJARファイルをFessのプラグインディレクトリ(app/WEB-INF/plugin/)に配置
  3. Fessを再起動

再起動後、http://<fess-server>:<port>/mcp でMCPサーバーのエンドポイントが有効になります。

Claude Desktopとの連携

このプラグインの代表的な使い方として、Claude Desktopとの連携があります。Claude Desktopの設定ファイル(claude_desktop_config.json)に以下のように設定を追加します。

{
  "mcpServers": {
    "Fess": {
      "url": "http://localhost:8080/mcp"
    }
  }
}

設定後、Claude Desktopを再起動すると、Fessの検索機能がClaude上で利用できるようになります。

利用できる機能

MCPサーバーとして以下の機能を提供しています。

検索(search)

Fessの全文検索機能を呼び出せます。検索クエリ、件数、ソート順、言語フィルタなどのパラメータを指定できます。AIが対話の中で必要に応じて検索を実行し、その結果を回答に活用します。

インデックス統計情報(get_index_stats)

Fessに登録されているドキュメント数などのインデックス統計情報を取得できます。

設定情報の参照

Fessの各種設定情報(ラベル、パスマッピングなど)をAIが参照できるようになっています。

使い方の例

Claude Desktopで以下のような使い方ができます。

  • 「Fessで〇〇について検索して」と依頼すると、AIがFessに検索を実行し、検索結果をもとに回答を作成
  • 「社内ドキュメントから〇〇に関する情報を探して」といった自然言語での検索依頼が可能
  • 検索結果の要約や、複数の検索結果を横断した分析をAIに依頼

まとめ

fess-webapp-mcpプラグインにより、Fessの検索機能を生成AIから活用できるようになります。RAGのような大規模な仕組みを構築しなくても、既存のFess環境にプラグインを追加するだけで、AIとの連携が実現できます。

プラグインの詳細についてはGitHubを参照してください。

Fess 15.4.0のリリース

Fess 15.4.0をリリースしました。いつもは、codelibs/fessのリポジトリで修正件数は10件いかないくらいだと思いますが、今回はこんな感じで、52件に達しました。大幅に増えた感じではありますが、量だけでなく、質も向上している気はしますが、多くのことをClaude Codeで対応したので、生産性が爆上がりみたいな感じになっています。Fessの開発は、関連する依存ライブラリも毎回修正しているので、実際には52件以上の修正が入っている感じではあります。

コードの修正だけでも結構あったなという感じではありますが、ドキュメントやリリース作業周りでも活用することでかなり楽になりました。ドキュメントに関しても、fess.codelibs.orgでは、7言語で提供しているので、これを手動で作業すると、リリースするのにも数日かかりそうな感じになってしまいますが、Claude Codeに前回リリース作業を理解してもらって、任せることで、待っていれば、そのうち修正が終わるみたいな楽に更新ができるようになりました。

そのほかにもリリースノートの文面も修正内容をまとめるのも数が増えると面倒になりますが、Claude Codeがghコマンドを活用することで、修正内容をピックアップして、いい感じの文面を作って、リリースノートのドラフトまで作成できるので、あとはリリース物をアップロードして、公開するだけになりました。

という感じで、今回のリリースは開発の大幅な効率化して、いろいろと修正してみたリリースになるので、利用してみてください。