Fessのクローラーで Apache HttpClient 5.x をサポート

Fessのクローラーライブラリであるfess-crawlerに、Apache HttpComponents 5.x のサポートを追加しました。

これまでfess-crawlerでは Apache HttpComponents 4.x を使用していましたが、5.x系ではHTTP/2のサポートやパフォーマンスの改善など、多くの機能強化が行われています。今回の対応により、fess-crawlerでも最新のHttpClientを利用できるようになりました。

主な変更点

新しいHTTPクライアント実装

  • Hc5HttpClient – Apache HttpComponents 5.x を使用した新しいHTTPクライアント実装
  • Hc4HttpClient – 既存の4.x系実装(後方互換性のために維持)

デフォルトの切り替え

Fess 15.5からは、問題がなければHttpClient 5系をデフォルトとして使用する予定です。

後方互換性

以前のHttpClient 4系を利用したい場合は、fess_config.propertiesのクローラーオプションに以下の設定を追加することで切り替えられます。

jvm.crawler.options=\
-Dfess.crawler.http.client=hc4\n\
...

技術的な詳細

今回の実装では、既存のHcHttpClientを抽象クラスとしてリファクタリングし、共通ロジックを共有する形でHc4HttpClientHc5HttpClientを実装しています。これにより、両方のバージョンを同じインターフェースで利用でき、切り替えも容易になっています。

また、以下の機能もHttpClient 5.x向けに実装されています。

  • 認証機能(Basic、Digest、NTLM、SPNEGO)
  • フォームベース認証
  • コネクションプール監視
  • 国際化ドメイン名(IDN)対応のDNSリゾルバ

関連リンク

UbuntuでHomebrewを使う

UbuntuでHomebrewを使えるようにする方法です。

aptでもインストールできるパッケージは多いですが、Homebrewの方が更新頻度が高い場合が多いです。最近ではmacOSと同じ感覚でUbuntuでもHomebrewを使うようにしています。詳しくは、Homebrewを参照してください。

前提条件

事前に以下のパッケージがインストールされている必要があります。

apt-get install build-essential procps curl file git

Homebrewのインストール

以下のコマンドを実行します。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

インストール先は/home/linuxbrew/.linuxbrewになります。

シェルの設定

brewコマンドを使えるようにするため、シェルの設定ファイルに以下を追加します。bashの場合は.bashrcに追加します。

echo "eval \"\$($(brew --prefix)/bin/brew shellenv)\"" >> ~/.bashrc

zshの場合は.zshrcに追加してください。設定後、シェルを再起動するかsource ~/.bashrcを実行すればbrewコマンドが使えるようになります。

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