データ送出
Merlon が自組織のネットワーク外へ何を送るのか、その契機は何か。「セルフホスト」は主張にすぎず、レビュー担当者はそれを断言ではなく列挙として確認する権利がある。本ページはそのために存在する。
要約
Merlon は、利用者が設定していない外向き通信を一切行わない。 テレメトリ、利用状況分析、クラッシュレポート、ライセンス確認、更新確認のいずれも存在しない。
既定のデプロイ、すなわちアダプター未設定・スクリーニングリストの取得元未設定・webhook サブスクリプション無し・SMTP サーバー未設定の状態では、外向き通信は自組織の PostgreSQL への1本のみである。
完全な一覧
アプリケーションが行いうる外向き通信のすべて。5種類あり、いずれも利用者が設定した場合にのみ発生する。
| # | 宛先 | 契機 | 送出内容 |
|---|---|---|---|
| 1 | 自組織の PostgreSQL サーバー | 常時 | すべてのアプリケーションデータ |
| 2 | 設定したスクリーニングリストの取得元 | スケジュールされたリストインポートジョブ | HTTP リクエスト以外に送出は無い。リストはレスポンスとして受け取る |
| 3 | 購読設定した webhook URL | 有効なサブスクリプションに合致するイベント | イベントのペイロード |
| 4 | アダプター設定に記載した REST エンドポイント | コアバンキング/ウォレットシステムからの取り込み | 取得対象レコードのクエリパラメータ |
| 5 | 設定した SMTP サーバー | 通知ルートに合致したアラート | 通知メール本文。アラートの内容を含む |
6つ目は存在しない。これはコードベース中の外向き通信の呼び出し箇所から検証できる。HTTP は internal/screening/adapter.go、internal/server/webhook.go、internal/adapter/rest.go、アダプターの到達性確認は internal/adapter/dryrun.go(宛先は4と同一)、SMTP は internal/notify/mailer.go である。
1. PostgreSQL
MERLON_DATABASE_URL、MERLON_MIGRATION_DATABASE_URL、MERLON_BACKUP_DATABASE_URL で設定する。通常は自組織のネットワーク内にある。Merlon がこの宛先を選ぶことはない。
2. スクリーニングリストのインポート
制裁リストおよび PEP リストの取得元は利用者が設定する。リストを内部でホストしている場合、この通信がネットワーク外へ出ることはない。
取得に失敗した場合、Merlon は fail-open するのではなく、最後に取得に成功したリストで照合を継続し、3回連続の失敗で運用者向けにその失敗をフラグとして示す(構造化ログのフィールド、ダッシュボードのフラグ、merlon_screening_list_stale_days メトリクス。組み込みの通知機構は存在しない)。代替の取得元へフォールバックすることはない。
3. Webhook の配信
利用者が作成したサブスクリプションの URL に対してのみ行われる。ペイロードは購読したイベントデータである。
配信クライアントは宛先を解決し、プライベートアドレス、ループバック、リンクローカルアドレスへの接続を拒否する。リダイレクトのたびに再検証も行う。これはサーバーサイドリクエストフォージェリ(SSRF)対策であり、webhook サブスクリプションが、外部に公開していない内部サービスへ到達する手段として使われることを防ぐ。
4. アダプターによる取り込み
MERLON_ADAPTER_CONFIG_PATH で設定する。宛先は利用者が指定した自組織のシステムである。アダプターは、アダプターのセキュリティ設定によって制限されたトランスポートを使用する。
アダプターの dry-run は、到達性を報告するために同一のホスト・ポートへ素の TCP 接続を行う。ペイロードは一切送出せず、宛先は取り込み用に既に設定済みのものだけである。
5. メール通知
MERLON_SMTP_HOST(および MERLON_SMTP_PORT、MERLON_SMTP_USERNAME、MERLON_SMTP_PASSWORD、MERLON_SMTP_FROM、MERLON_SMTP_TO、MERLON_SMTP_USE_TLS)で設定する。既定では未設定であり、未設定の場合は何も送信されない。
5つのうち、自組織のネットワーク外にある宛先へアラートの内容を運びうるのはこの経路である。ホスティング型のメールサービスも他者のインフラであることに変わりはない。通知メールはアラートとその重大度を特定できる内容を含む。これが問題となる場合は内部リレーを指定するか、未設定のままにしてダッシュボードを使う。
トランスポートは既定で STARTTLS を用いる。MERLON_SMTP_USE_TLS=true を指定した場合は暗黙的 TLS を用いる。
存在しないもの
| 存在しないもの | 補足 |
|---|---|
| 製品テレメトリ/利用状況分析 | 該当コードが存在しない。無効化する対象も無い |
| ベンダーへのクラッシュ/エラー報告 | エラーは自組織のログにのみ出力される |
| ライセンスキーの検証 | ライセンスキー機構自体が存在しない |
| 更新/バージョン確認 | 未実装。下記参照 |
| UI 内の第三者フォント・スクリプト・CDN アセット | UI バンドルは自己完結しており、Go バイナリが配信する |
| オペレーター UI の分析タグ | 存在しない |
これらを無効化するための環境変数は不要である。無効化すべきものが存在しないためである。
更新確認について
Merlon は新バージョンの存在を通知しない。これには実際の運用コストがある。公表済みの脆弱性を含むバージョンを、促されないまま運用しうる。
これは意図的である。Merlon は閉域網で運用されることが多い機関に導入される。そのような環境では、公開ホストへの説明のつかない外向きリクエストはそれ自体が指摘事項であり、「このソフトウェアはベンダーへ通信するのか」という問いには、一度ではなくデプロイごとに答えなければならない。
リリースは自組織で追跡すること。Releases を購読し、新しいリリースへの対応はアップグレードを参照。稼働中のバージョンは GET /healthz が返す。
自分で検証する
本ページの記述を鵜呑みにしないこと。アダプター・スクリーニング取得元・webhook サブスクリプション・SMTP ホストのいずれも設定していないデプロイで、コンテナからの送出を取得し、宛先が PostgreSQL のみであることを確認する。
# データベースホストを除き、コンテナが到達しようとするすべての宛先。
docker run --rm --network container:<merlon-container> nicolaka/netshoot \
tcpdump -n 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0'
あるいは外向き通信を全面的に遮断し、Merlon が起動・応答・スコアリング・モニタリングを継続することを確認する。実際に継続する。その経路に、ネットワーク外へ出る要素が何も無いためである。
データ所在
すべての顧客データ、取引データ、スクリーニング結果、ケース、疑わしい取引の届出草案、監査記録は、貴組織のインフラ上、貴組織の管轄下にある PostgreSQL データベースに存在する。Merlon はクラウドコンポーネントを持たず、ベンダーがホストするサービスも、登録すべきアカウントも存在しない。
直接的な PII 顧客属性は保存時に暗号化され、鍵はデータベース外の MERLON_ENCRYPTION_KEY_RING に保持される。バックアップと復元を参照。