IPアドレスでオンプレミス環境を制限する
このページは、オンプレミス版MonoChatの運用担当者向けです。インターネットからMonoChatを呼び出す必要のあるサービスをブロックせずに、ネットワークレベル(nginxまたはファイアウォール)でWebアプリを自社ネットワークに限定する方法を説明します。
MonoChat自体にはIP許可リスト機能がありません。制限はnginx、ロードバランサー、ファイアウォールで行い、単一のワークスペースではなく、インストール全体に適用されます。
制限するもの、公開しておくもの
| 自社ネットワークに限定するもの | インターネットから到達可能にしておくもの |
|---|---|
| Webアプリと、右列に記載されていないすべて | 以下の表に記載したWebhookおよびコールバックのパス |
WebアプリがWebSocketで接続するDDP/WebSocketエンドポイント(/websocket) |
Web UIとWebSocketエンドポイントはアプリが両方を使うため、まとめて制限してください。それ以外のユーザーには以下のパスだけを許可し、残りはブロックします。
外部サービスが呼び出すパス
以下のパスはすべてMonoChatサーバーが登録するものです。設定から作られるパスは、サーバー設定(channelConnectors.<name> または paymentSystemConnectors.<name>)で指定した hookPath で、サフィックスはコードが付加します。使用するコネクターのパスだけを開放してください。
チャネル
| パス | 呼び出し元 | 定義場所 |
|---|---|---|
<hookPath>/webhooks (POST) | omni-message(WhatsApp Cloud、WhatsApp Gupshup、Instagram、Messenger、Telegram、TikTok、Twilio SMS、Varan OTP 向け) | packages/app-connectors-om2-*/src/webhooks/webhook.ts、hookPath の取得元は channelConnectors.whatsappBusinessVegaCloud, whatsappBusinessVegaGupshup, instagramCastor, messengerRigel, telegramBotRegulus, tikTokTimir, twilioSms, varanOtp |
<hookPath>/webhooks, <hookPath>/sessions, <hookPath>/messages (POST) | Messages APIチャネル経由の自社システム | channelConnectors.messagesApi.hookPath, packages/app-connectors-messages-api/src/webhooks/webhook.ts |
<hookPath>/message, <hookPath>/info (POST) | Chatwoot | channelConnectors.chatwoot.hookPath, packages/app-connectors-chatwoot/src/webhook.ts |
<hookPath>/inbound (POST) | SIPプロバイダー(汎用SIPおよびSonitel SIPチャネル) | channelConnectors.genericSip.hookPath, channelConnectors.sonitelSip.hookPath |
/api/facebook/channels/:channelId/flows/:flowId (POST) | WhatsApp(WhatsApp Flows 用) | server/api/whatsapp-flow.js |
チャネルプロバイダー(Meta、Telegram、TikTok、Twilio)はMonoChatを直接呼び出しません。omni-messageのWebhookリスナーを呼び出し、それが上記の /webhooks パスに転送します。omni-messageを自社で運用する場合、そのWebhookリスナーは次のパスでインターネットから到達可能である必要があります: /webhooks/meta-messenger, /webhooks/instagram-business, /webhooks/wab-cloud, /webhooks/wab-gupshup/:channelId, /webhooks/wab-360-dialog/:channelId, /webhooks/telegram-bot/:channelId, /webhooks/tiktok, /webhooks/twilio-sms/:channelId(omni-messageの apps/webhook-listener/src/modules/webhook-listeners/webhook-listeners.controller.ts)。MonoChat自体も、omni-messageから上記の /webhooks パスに到達できる必要があります。
決済システム
決済プロバイダーは、顧客が支払いを行うとコールバックを送り、その後、顧客をMonoChatに戻します。どちらもネットワークの外から動作する必要があります。
| コネクター | hookPath(paymentSystemConnectors.<name>.hookPath)配下のパス |
|---|---|
| Stripe | /webhook/:clientId (POST), /return/success/:paymentSystemId, /return/cancel/:paymentSystemId |
| HyperPay | /pay/:clientId/:paymentSystemOrderId, /result/:clientId/:paymentSystemOrderId |
| Mamo | /webhook/:clientId (POST), /return/:clientId/:paymentSystemOrderId |
| Midtrans | /webhook/:clientId (POST), /return/:paymentSystemOrderId |
| Paymob | /webhook/:clientId (POST), /return/:paymentSystemOrderId |
| PayTabs | /callback/:clientId/:paymentSystemOrderId (POST), /return/:paymentSystemOrderId |
| Tabby | /webhook/:clientId (POST), /return/:paymentSystemOrderId/:status |
| Tamara | /webhook/:clientId (POST), /return/:paymentSystemOrderId/:status |
| Tap | /webhook/:clientId (POST), /return/:clientId/:paymentSystemOrderId |
| Telr | /webhook/:clientId/:paymentSystemOrderId (POST), /return/:paymentSystemOrderId/:status |
| Ziina | /return/:clientId/:paymentSystemOrderId/:status |
| iyzico | /:transactionId (POST) |
| JCC | /:status |
| MyFatoorah | hookPath そのもの (POST)、/:paymentSystemOrderId/:status (POST) |
| N-Genius | hookPath そのもの (POST)、/:paymentSystemOrderId/:status |
| Paywall | /:paymentSystemOrderId/:status |
| UniqoPay | hookPath そのもの (POST)、/:paymentSystemOrderId/:status (POST) |
| VakıfBank Sanal POS | /:status (GETおよびPOST) |
| İş Yerim POS | hookPath そのもの (GETおよびPOST) |
最も簡単なルールは、使用する決済コネクターごとに <hookPath> とその配下すべてを開放することです。各定義場所は packages/app-connectors-<name>/src/webhook.ts です。
その他のサーバーエンドポイント
| パス | 用途 | 定義場所 |
|---|---|---|
/api/:slug/custom-functions/… (POST) | アクセストークンを使ってHTTP経由でカスタム関数を呼び出す | lib/managers/custom-function-sdk/_/server/endpoint.js |
/api/ai-agent/mcp, /api/ai-agent/events (POST) | AIエージェントの実行結果をMonoChatに報告する | server/api/ai-agent.ts |
/api/channels-manager/facebook/auth, /api/channels-manager/tiktok/auth (GET) | FacebookまたはTikTokアカウントの接続後に戻ってくるポップアップ | packages/app-managers-channel/src/webhook.ts |
/l/:_id (GET) | 顧客に送信する短縮リンク | server/api/short-link.js |
/api/status (GET) | モバイルアプリがサーバーとそのサインイン方法を確認する | server/api/status.js |
/.well-known/assetlinks.json, /.well-known/apple-app-site-association (GET) | AndroidおよびiOSのアプリリンク | server/api/assetlinks.js, server/api/apple-app-site-association.js |
これらの機能をネットワークの外から使う場合は、/api/:slug/custom-functions、/api/ai-agent、/l/ と2つのチャネルポップアップのパスを開放してください。チャネルポップアップのパスは、アカウントを接続する人のブラウザーで開かれるため、チャネルを接続するのが社内ネットワークの人だけであれば制限したままで構いません。/api/status と2つの /.well-known ファイルは、エージェントがネットワークの外からMonoChatモバイルアプリを使う場合にのみ開放してください。
プロバイダーによるサインイン(OAuth)
サインインプロバイダーがブラウザーをMonoChatにリダイレクトで戻すとき、そのリダイレクトはサインインする人からの通常のブラウザーリクエストなので、Webアプリと同じ制限に従います。この方法でサインインする人がリダイレクトのパスに到達できるようにしてください。パスは、サーバー設定の public.oauth.<provider> にある redirectPath の値です(デフォルトの例は /api/oauth/google/redirect、/api/oauth/microsoft/redirect、/api/oauth/facebook/redirect、/api/oauth/apple/redirect)。Appleのサインインはブラウザーを POST(responseMode: form_post)で戻しますが、同じパスがこれを受け付けます。モバイルアプリ向けには、サーバーは /api/oauth/facebook/mobile、/api/oauth/microsoft/mobile、/auth/oauth-callback/<provider> にも応答します(server/configs/oauth/mobile.ts)。
Microsoft Marketplace連携を使う場合、microsoftMarketplace.redirectWebhookPath のパスがMicrosoft Marketplaceのリクエストを受信するため、インターネットから到達可能である必要があります(server/configs/microsoft-marketplace/webook.ts)。
プロキシ経由で実際のクライアントIPを渡す
MonoChatはセッションとステータスログのためにクライアントIPを記録します。リバースプロキシやロードバランサーの背後では、実際のアドレスを渡さない限り、プロキシのアドレスが記録されます。
- nginx(またはロードバランサー)が元のアドレスを
X-Forwarded-Forヘッダーで送るようにします。例:proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;。 - MonoChatサーバーの環境変数
HTTP_FORWARDED_COUNTに、アプリの前段にあるプロキシの数を設定します。この変数はMonoChatのコードではなくMeteorフレームワークが読み取るため、設定JSONではなく、デプロイ設定に記述します。
設定を確認する
- 許可されていないネットワークからWebアプリを開きます。拒否されるはずです。
- 許可されたネットワークからサインインして受信トレイを開きます。メッセージが読み込まれれば、WebSocketエンドポイントに接続できていることが確認できます。
- ネットワークの外から、接続済みのチャネルにテストメッセージを送り、受信トレイに届くことを確認します。
- 少額のテスト注文の支払いリンクを作成して支払いを行い、注文が支払い済みと表示されることを確認します。
プロキシのルールを変更するたびに、各パスをテストしてください。ブロックされたWebhookパスは、MonoChatにエラーを表示しません。メッセージや支払い確認が届かなくなるだけです。