本日、Cloudflare Sequence Analytics for APIsを発表します。API Gatewayをご契約のお客様はSequence Analyticsを使って、エンドポイントへのAPI呼び出しの最重要シーケンスを表示できます。この新機能は、お客様がまず最も重要なエンドポイントに保護を適用できるようサポートします。
シーケンスとは何でしょうか。簡単に言えば、特定の訪問者がAPI経由でWebサイトをブラウジングしたり、モバイルアプリを使ったり、B2Bパートナーとやり取りしたりする際に送信するHTTP APIリクエストを時間順に整理したリストです。銀行で資金移動を行う際のシーケンスの一部を例に挙げると、次のような形になります:
.tg {border-collapse:collapse;border-color:#ccc;border-spacing:0;} .tg td{background-color:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;} .tg th{background-color:#f0f0f0;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;} .tg .tg-1wig{font-weight:bold;text-align:left;vertical-align:top} .tg .tg-0lax{text-align:left;vertical-align:top}
Order | Method | Path | Description |
---|---|---|---|
1 | GET | /api/v1/users/{user_id}/accounts | user_id is the active user |
2 | GET | /api/v1/accounts/{account_id}/balance | account_id is one of the user’s accounts |
3 | GET | /api/v1/accounts/{account_id}/balance | account_id is a different account belonging to the user |
4 | POST | /api/v1/transferFunds | Containing a request body detailing an account to transfer funds from, an account to transfer funds to, and an amount of money to transfer |
順序
メソッド
パス
説明
1
GET
Order | Method | Path | Description |
---|---|---|---|
1 | GET | /api/v1/users/{user_id}/accounts | user_id is the active user |
2 | GET | /api/v1/accounts/{account_id}/balance | account_id is one of the user’s accounts |
3 | GET | /api/v1/accounts/{account_id}/balance | account_id is a different account belonging to the user |
4 | POST | /api/v1/transferFunds | Containing a request body detailing an account to transfer funds from, an account to transfer funds to, and an amount of money to transfer |
… attacker copies the request to a debugging tool like Postman … | |||
5 | POST | /api/v1/transferFunds | Attacker has modified the POST body to try and trick the API |
6 | POST | /api/v1/transferFunds | A further modified POST body to try and trick the API |
7 | POST | /api/v1/transferFunds | Another, further modified POST body to try and trick the API |
/api/v1/users/{user_id}/accounts
user_idがアクティブユーザー
2
GET
/api/v1/accounts/{account_id}/balance
account_idはこのユーザーのアカウントの1つ
3
GET
/api/v1/accounts/{account_id}/balance
account_idはこのユーザーの別アカウント
4
POST
/api/v1/transferFunds
資金の移動元アカウント、移動先アカウント、移動金額の詳細を示すリスエスト本体
シーケンスに注意を払うことがAPIセキュリティ上重要なのは、なぜでしょうか。仮に上記のAPIがPOST /api/v1/transferFundsのリクエストを受け取った場合、それ以前のリクエストが一切なければ不審に見えます。考えてみてください。APIクライアントは該当するアカウントIDを、ユーザーへの一覧表示なしにどうやって知るのでしょうか。APIクライアントは、移動可能資金がどれだけあるかをどうやって知るのでしょうか。この例では明白かもしれませんが、本番環境のAPIに送られるAPIリクエストの数は膨大で、人間のアナリストが不審な利用に気づくのは難しい場合があります。
セキュリティにおいて、人間のチームでは到底排除できない数知れない脅威に対する防御方法の一つが、_ポジティブセキュリティモデル_の作成です。脅威かもしれないものすべてをブロックしようとするのではなく、既知の良性(無害)のトラフィックをすべて許可し、その他をすべてブロックするというデフォルト設定にするのです。お客様はこれまでも、2つの主要分野のポジティブセキュリティモデルをAPI Gatewayで作成することができました。帯域幅消費型攻撃に対する保護とスキーマ検証です。シーケンスはAPIトラフィックのポジティブセキュリティモデルの第3の柱になります。API Gatewayは、任意のAPIシーケンスにエンドポイント優先度を適用することができます。APIシーケンス内の優先順位を確立することにより、想定外のトラフィックをすべてログ記録またはブロックし、不正トラフィックを減らすのです。
不正トラフィックをシーケンスに基づいて検出
攻撃者が不正によりデータ抽出を試みる際、想定されたAPIトラフィックのパターンに従うことは滅多にありません。特殊なソフトウェアを用いてAPIを「ファズ」し、複数のリクエストでさまざまなリクエストパラメータを送信して、データ抽出のチャンスを意味する想定外の応答がAPIから返ってくるのを待つ攻撃が多いのです。また、リクエストを手動送信し、APIを騙して、オブジェクトレベルの認証の不備によって攻撃者に権限昇格やデータアクセスを認めるといった権限外のアクションをとらせようとすることもあります。レート制限によるAPIの保護はよく実施されるベストプラクティスですが、上記の例のいずれでも、攻撃者がリクエストシーケンスを故意にゆっくり実行し、帯域幅消費型攻撃の検出を掻い潜ろうとするかもしれません。
再び、上記のリクエストシーケンスを考えてみましょう。ここでは、正当な資金移動のリクエストを攻撃者がコピーし、リクエストペイロードを改ざんしてシステムを欺こうとする場合を想像してください:
.tg {border-collapse:collapse;border-color:#ccc;border-spacing:0;} .tg td{background-color:#fff;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;overflow:hidden;padding:10px 5px;word-break:normal;} .tg th{background-color:#f0f0f0;border-color:#ccc;border-style:solid;border-width:1px;color:#333; font-family:Arial, sans-serif;font-size:14px;font-weight:normal;overflow:hidden;padding:10px 5px;word-break:normal;} .tg .tg-1wig{font-weight:bold;text-align:left;vertical-align:top} .tg .tg-0lax{text-align:left;vertical-align:top} .tg .tg-5frq{font-style:italic;text-align:center;vertical-align:top} .tg .tg-8zwo{font-style:italic;text-align:left;vertical-align:top}
順序
メソッド
パス
説明
1
GET
/api/v1/users/{user_id}/accounts
user_idがアクティブユーザー
2
GET
/api/v1/accounts/{account_id}/balance
account_idはこのユーザーのアカウントの1つ
3
GET
/api/v1/accounts/{account_id}/balance
account_idはこのユーザーの別アカウント
4
POST
/api/v1/transferFunds
資金の移動元アカウント、移動先アカウント、移動金額の詳細を示すリスエスト本体
... 攻撃者が、Postmanのようなデバッグツールへリクエストをコピー ...
5
POST
/api/v1/transferFunds
APIを騙すために攻撃者がPOST本体を改ざん
6
POST
/api/v1/transferFunds
APIを騙すためにPOST本体を再び改ざん
7
POST
/api/v1/transferFunds
APIを騙すためにPOST本体をさらに改ざん
資金移動のエンドポイントが極めて重要な保護対象であり、シーケンス中に一度だけ起こるということをお客様が事前に知っていれば、2度続けて呼び出されることが決してなく、GET /balance(残高照会)が必ずPOST /transferFunds(資金移動)に先立つようにルールを書くことができます。しかし、どのエンドポイントシーケンスの保護が必須なのかをあらかじめ知ることなく、どのルールを定義すべきかがわかるでしょうか。APIユーザーが短時間のうちに正当な資金移動リクエストを数回行うこともあるでしょうから、レートを低く制限するのはリスクが高すぎます。この種の不正を予防するツールがほとんどない現在、お客様の多くは、アプリケーションチームと詐欺対策部門が不正を事後クリーンアップするという対処的な取り組みに終始しています。
結局、お客様がAPIリクエストシーケンスに関するポジティブセキュリティモデルを定義できるようにするには、次の3本柱のアプローチが必要だと当社は考えています:
Sequence Analytics(シーケンス分析):APIリクエストのどのシーケンスがいつ起こるかを見極め、データを容易に理解できる形態に要約
Sequence Abuse Detection(シーケンス不正検出):APIリクエストのどのシーケンスの送信元が無害で、どれが悪意あるものである可能性が高いかを識別
Sequence Mitigation(シーケンス不正軽減):APIリクエストシーケンスに関して、どのトラフィックを許可し、どれをブロックするかを決めるのに適したルールを識別
シーケンス作成の課題
セッションが長く続いたり、多くのリクエストから成る場合もあるため、Sequence Analyticsには技術的に難しい課題がいくつかあります。そのため、シーケンスの定義にはセッションIDだけでは不十分で、任意セッション内で起こる複数シーケンスを自動識別できるソリューションを開発する必要がありました。また、重要なシーケンスが必ずしもボリュームが多く、作成可能なシーケンスセットが大きいとは限りませんから、単にうわべ上の_頻出_シーケンスではなく_重要シーケンス_を識別できるソリューションを開発する必要がありました。
api.cloudflare.comを例にとってこれらの課題を説明するため、APIリクエストをセッションごとにグループ分けして、シーケンス長に対する固有シーケンスの数をプロットしてみましょう:
このプロットは、およそ8万8000のセッション、2億6000万件のAPIリクエストから成り、301の個別APIエンドポイントを含む1時間のスナップショットに基づいています。各セッションに固定長のスライディングウィンドウを適用してデータを処理し、その結果として見られた個別の固定長シーケンス(「n-grams」)の総数をカウントします。プロットは、ウィンドウのサイズ(「n-gram」長)を1リクエストから10リクエストまで変化させた結果を示しています。個別シーケンスの数は、301(ウィンドウサイズが1リクエストの場合)から約78万(ウィンドウサイズが10リクエストの場合)の範囲で変化しています。このプロットから、可能シーケンス数がシーケンス長に伴って増えていることが見てとれます。スライディングウィンドウのサイズが大きくなるにつれて、サンプル中の個別シーケンスの総数が増えています。このような滑らかなトレンドは、スライディングウィンドウの適用(セッション自体に多くのシーケンスが含まれる場合があります)と、シーケンス長に対して比較的長いセッションが多いという事実によって説明できます。
可能シーケンスの数が多いため、不正シーケンスを見つけ出すのは「至難の業」なのです。
Sequence Analyticsの紹介
こちらは、API Gatewayのダッシュボードから撮ったSequence Analyticsのスクリーンショットです:
スクリーンショットに写った新機能を詳しく見ていきましょう。
API Gatewayは、API利用者が送ったリクエストのシーケンスを、この記事で前述したメソッドでインテリジェントに見極めます。API Gatewayは、相関スコアと呼ばれる指標に従ってシーケンスのスコアを付けます。Sequence Analyticsは、相関スコアの高い順から上位20シーケンスを表示します。当社ではこれらを最重要シーケンスと呼んでいます。重要性の高いシーケンスには、順番に共起する可能性が高いAPIリクエストが含まれます。
相関スコアを理解するには、各シーケンスを精査する必要があります。相関スコアの高いシーケンスは、滅多に使われないエンドポイント(潜在的なユーザー異常行動)から成る場合もあれば、よく使われるエンドポイント(おそらく無害なユーザー行動)から成る場合もあります。これらのシーケンスに見られるエンドポイントは共起することが多く、APIの実際の使用パターンを表しています。これらのエンドポイントには可能な限りのAPI Gateway保護(レート制限の提案、スキーマ検証、JWT検証、mTLS)をことごとく適用し、開発チームと共に特定エンドポイントの並び順をチェックするとよいでしょう。
お客様が、API Gatewayが現在提供するアクティブな保護に加え、API上で許される行動の明示的設定を望まれていることは承知しています。当社はまもなく、シーケンスの優先順位に関するルールを発表し、それらのルールに基づいてリクエストをブロックする機能を有効化します。このシーケンス優先順位の新ルールにより、お客様は許可できるAPIリクエストの厳密な並び順を指定できるようになります。未知の脅威からAPIを保護するポジティブセキュリティモデルを確立する方法が、また一つ増えるのです。
使用開始手順
API Gatewayをお使いのお客様は、Sequence Analyticsにアクセスできます。Cloudflareダッシュボード内のゾーンへナビゲートし、Securityタブ>API Gatewayタブ>Sequencesタブを順にクリックしてください。お客様のAPI利用者がリクエストする最重要シーケンスが表示されます。
Enterpriseプランをご利用でAPI Gatewayを未購入のお客様は、Cloudflareダッシュボード内のAPI Gatewayトライアルを有効化するか、担当アカウントマネージャーにご連絡いただければ、API Gatewayの利用を開始できます。
今後の展開は?
シーケンスに基づく検出は、攻撃を識別・阻止する新たな機会を多くもたらす強力な独自機能です。当社では、攻撃のシークエンスを識別してCloudflareグローバルネットワークへ送るメソッドを微調整しており、カスタムシーケンスマッチングやリアルタイム軽減の機能を後日リリースする予定です。当社はまた、ポリシーと合致しないリクエストシーケンスを試みたAPIユーザーは誰かについて、お客様がチームと共有できる実用的なインテリジェンスを得られるようにしていきます。