SMS API の不正利用を防ぐ

SMS 送信 API が未許可で呼び出されたり、API Key が漏洩して他人に使われたりすると、大量の SMS が送信され、残高が急速に消費され、チャネルの評価が低下するなどの問題が発生します。EngageLab SMS は送信側の頻度、量、国 / 地域範囲を制限できますが、シークレットと業務側の送信入口の保護の代わりにはなりません。

本稿では、プラットフォーム機能と業務側の防御を組み合わせ、API の不正利用リスクを下げる方法を説明します。

正しいアーキテクチャ

EngageLab SMS API は業務システムのサーバー側からのみ呼び出してください。ブラウザ、App クライアント、ミニプログラムから直接リクエストしないでください。

業務システムのサーバー → EngageLab SMS API(API Key を付与。ページ起点の送信では end_user_ip も渡す)
              
              業務システムのサーバー → EngageLab SMS API(API Key を付与。ページ起点の送信では end_user_ip も渡す)

            
このコードブロックはフローティングウィンドウ内に表示されます
  • dev_keydev_secret はサーバー側にのみ保管し、フロントエンドコード、アプリのパッケージ、公開リポジトリ、CI の平文変数には置かないでください。
  • SMS API の URL とシークレットを、エンドユーザーが直接呼べる API に露出させないでください。
  • 本番の API Key には呼び出し元 IP のホワイトリストを設定することを推奨します。詳しくは API Key を参照してください。

2 種類の IP を混同しない

設定 / パラメータ 入力する値 防ぐ対象
API Key の IP ホワイトリスト サーバーの出口 IP 未知の IP が Key を使って SMS API を直接呼び出すこと
送信リクエストの end_user_ip エンドユーザーの IP 同一ユーザー IP が短時間に繰り返し送信を起こすこと

セキュリティセンター で「IP アドレスごと」の頻度制限を有効にした後、SMS送信 リクエストに end_user_ip を渡さないと、この制限は有効になりません。サーバーの IP ではなく、ユーザー端末のグローバル IP を渡してください。サーバー側でマーケティングや通知 SMS を一括送信し、エンドユーザー IP がない場合、そのリクエストには IP ごとの頻度制限は適用されません。API Key のホワイトリストと送信量上限をより重視してください。

プラットフォーム側の防御

SMS コンソールで次の設定を行い、API が不正利用された場合の損失を抑えます。

実施内容 設定場所 目的
API Key に IP ホワイトリストと有効期限を設定し、いつでも無効化できるようにする API Key 呼び出し元を制限し、漏洩時にすぐ停止する
同一番号・同一 IP の送信頻度制限を有効にする セキュリティセンター 単一番号・単一 IP の連打をブロックする
ページ起点の送信リクエストに end_user_ip を渡す SMS送信 IP ごとの頻度制限を有効にする
日次 / 月次の警告値と上限値を設定する セキュリティセンター 量の異常時にアラートまたは自動停止する
国 / 地域のホワイトリストまたはブラックリストを設定する セキュリティセンター 業務対象外の地域への送信を避ける
緊急時に SMS チャネルをワンクリックで一時停止する セキュリティセンター 不正利用中に迅速に損失を抑える
残高不足アラートを設定する アラート設定 費用の異常を早く見つける

送信量の警告または上限に達したときに通知を受け取るには、先に Webhook で該当するコールバックイベントを設定してください。

テンプレート種類ごとに防御を強化する

テンプレート種類 によって不正利用のされ方が異なるため、防御の重点も異なります。

通知 / マーケティングテンプレート

この種の SMS は通常、業務イベントや運用計画に応じてサーバー側から一括送信します。主なリスクは、漏洩した Key を他人が群発に使うことです。

  • 本番では API Key の IP ホワイトリストを必ず設定してください。
  • アプリケーションに妥当な日次 / 月次の送信上限を設け、残高が一気に尽きないようにします。
  • 定期または一括ジョブは管理されたサーバー環境でのみ起動し、送信能力を未認証の HTTP API として公開しないでください。

認証コードテンプレート

認証コード種類のテンプレートを使い、Web サイトや App の「SMS を取得」ボタンで送信する場合は、自前の業務 API でも防御してください。

  • 送信前にボット対策(画像認証や Turnstile / reCAPTCHA など)を行い、サーバー側で結果を検証する。
  • 同一の携帯電話番号に再送間隔(例: 60 秒)を設定し、フロントエンドでカウントダウンを表示する。
  • アカウント、端末、IP ごとに分・時間・暦日のリクエスト上限を設け、失敗リクエストも回数に含める。
  • 「SMS を取得」にはログイン状態、または未ログイン時の有効なセッションが必要です。文脈のない公開送信入口を設けないでください。

エラーコードを異常のシグナルとして扱う

SMS送信 は、検証または送信時に次の頻度関連エラーを返すことがあります。これらが表示されたら再試行を緩め、未許可の呼び出しや集中リクエストがないか確認してください。

エラーコード 意味
3004 頻度制限を超過。同一テンプレート・同一宛先は制限ウィンドウ内で再送できません
10006 頻度制限を超過

送信量がセキュリティセンターの上限に達している場合、または緊急停止を実行済みの場合、以降のリクエストは拒否されます。先にセキュリティセンターで状態を確認し、すぐに連続再試行しないでください。

シークレットが漏洩したとき

  1. SMS コンソールで API Key を無効化またはローテーション します。
  2. セキュリティセンター で緊急停止を使い、SMS 送信を一時停止します。
  3. メッセージ明細 とコールバックで異常な送信を確認します。
  4. アラート設定 で残高アラートが出ていないか確認し、直近の消費を照合します。
  5. API Key の IP ホワイトリストを絞り、日次 / 月次の送信上限が妥当か確認します。
  6. リスクがなくなってから送信を再開します。

本番公開前チェックリスト

  • API はサーバー側からのみ呼び出しており、dev_secret はフロントエンド、アプリ、公開リポジトリ、CI の平文変数に含まれていません。
  • 本番の API Key にサーバー出口 IP のホワイトリストを設定済みです。
  • セキュリティセンターで番号の頻度制限を有効にしています。ページ起点の送信では end_user_ip を渡しています。
  • 日次 / 月次の送信上限を設定し、量に関するコールバックと残高アラートを設定済みです。
  • 認証コード系の送信は EngageLab 呼び出し前にボット対策と業務側レート制限を実施しています。
  • 不正利用時の対応順を把握しています:Key を無効化 → 緊急停止 → 送信記録を確認。
Icon Solid Transparent White Qiyu
お問い合わせ