TL;DR: Bank Statement Parser はすべてのデータをローカルで処理し、デフォルトで PII を秘匿化し、XXE 攻撃に対して XML 解析を強化し、LLM を Ollama 経由でローカル実行し、SHA-256 ハッシュロック依存関係と CycloneDX SBOM を同梱しています。
設計によるセキュリティ
Bank Statement Parser は、機密の財務データを処理するために構築されています。すべての設計上の決定は、セキュリティ、プライバシー、監査可能性を優先します。
ゼロクラウド依存
すべての処理はランタイム内でローカルに行われます。確定的パーサーはネットワーク呼び出しを一切行いません。ハイブリッド PDF パイプラインは Ollama を使用してローカル LLM 推論を行います。クラウド API にデータが送信されることはありません。XML パーサーは no_network=True、resolve_entities=False、load_dtd=False で明示的に構成され、送信アクセスを防止します。
PII 秘匿化
個人を特定できる情報(名前、IBAN、住所)は、CLI 出力およびストリーミングモードで自動的に秘匿化されます。デフォルトでオンです。
- CLI: 機密フィールドは
***REDACTED***と表示されます - ストリーミング:
parse_streaming(redact_pii=True)(デフォルト) - エクスポート: CSV/JSON/Excel は後続処理のために完全なデータを保持します
- オプトイン: 秘匿化されていない出力が必要な場合は
--show-piiまたはredact_pii=Falseを使用します
XML セキュリティ(XXE 保護)
すべての XML 解析は lxml の強化設定を使用します:
resolve_entities=False-- XML エンティティ拡張攻撃を防止no_network=True-- パーサーからのすべての送信ネットワークアクセスをブロックload_dtd=False-- DTD ベースの攻撃を防止- 処理前の名前空間除去 -- あらゆる CAMT.053 バリアントを安全に処理
ZIP アーカイブのセキュリティ
iter_secure_xml_entries() は抽出前にすべての ZIP メンバーを検証します:
- エントリサイズ上限: エントリあたり 10 MB(構成可能)
- 合計サイズ上限: 非圧縮で合計 50 MB(構成可能)
- 圧縮率制限: デフォルト 100:1 -- ZIP 爆弾を検出
- 暗号化エントリの拒否: 暗号化エントリは警告とともにスキップ
- ディスク書き込みなし: XML バイトは
from_bytes()でパーサーに直接渡されます
パストラバーサル防止
入力検証により危険なファイルパスをブロックします:
- Null バイト、ディレクトリトラバーサルパターン(
../)、シンボリックリンクは拒否 - 想定される形式に対するファイル拡張子の検証
- ファイルサイズ制限(デフォルト 100 MB、構成可能)
残高検証(ゴールデンルール)
すべての PDF 抽出は opening balance + credits − debits == closing balance の式で検証されます。結果は VERIFIED、DISCREPANCY、FAILED とタグ付けされます。不一致は --type review でインタラクティブにレビューできます。
確定的出力
構造化形式(CAMT、PAIN.001、CSV、OFX、QFX、MT940)の場合、同じ入力ファイルを指定すると、パーサーは毎回バイト同一の出力を生成します。ランダム性、モデル推論、ヒューリスティックサンプリングはありません。これは以下の場面で重要です:
- 監査の再現性: 同じファイルを 2 回実行し、出力を diff する
- 規制遵守: 一貫した処理を実証する
- CI 検証: 718 テストが 100% ブランチカバレッジで確定性を強制
サプライチェーンセキュリティ
- SHA-256 ハッシュロック依存関係:
poetry.lockのすべてのパッケージでファイルハッシュを検証済み - CycloneDX SBOM: すべてのリリースにソフトウェア部品表が含まれます
- GitHub ビルド来歴: アテステーションが各アーティファクトをソースコミットにリンク
- 署名付きコミット: すべてのコミットは SSH 署名され、CI で検証されます
- 依存関係検証:
scripts/verify_locked_hashes.pyがすべてのハッシュをローカルで検証
ローカルで検証する
python -m pytest # 718 tests, 100% branch coverage
python scripts/verify_locked_hashes.py # SHA-256 hash verification
git log --show-signature -1 # Verify commit signature