🦁

Cloudflare WAF の Sensitive Data (DLP) 機能

2024/11/22に公開

一般的なWAFは標準ではRequestとして入ってくる通信にはめっぽう強い効果を発揮する一方、そのResponseとして戻されるデータをデフォルトでは見ていません。CloudflareはSensitive Data というDLP(Data Loss Processing) 機能があり、例えばクレジットカード番号、CVV、AWSやその他クラウドのクレデンシャル、電話番号、パスポート番号等をJSONから検知させることが可能です。

この検査は通信の遅延を引き起こさないように非同期で行われるため、通信のブロックは行われず、ログにセキュリティイベントとして出力されます。管理者はそのイベントをもとに通信をブロックするWAFルールを設定することが可能となっています。

やってみる

1. クレジットカード番号を漏洩させるオリジンの構築

Amazon Linux 2023 上にflaskを用いて構築します。
まずpipをインストールします。python3は最初からAmazon Linux 2023 には入っています。

sudo dnf install python3-pip -y

次にFlaskをインストールします。

pip install Flask

app.pyを以下の名前で作成します。

app.py
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/', methods=['POST'])
def handle_post_request():
    # POSTリクエストからJSONデータを取得
    data = request.get_json()

    # もしリクエストの中に'id'が含まれていれば、適切なレスポンスを返す
    if data and 'id' in data:
        return jsonify({"AMEX": "374245455400126"})
    else:
        return jsonify({"error": "Invalid request"}), 400

if __name__ == '__main__':
    # ポート80で起動
    app.run(host='0.0.0.0', port=80, debug=True)

AMEXのクレジットカード番号はダミー番号ですので安心してそのまま使ってください。

/というルートにPOSTリクエストを処理する関数handle_post_requestを割り当てています。受け取ったデータにidが含まれているかを確認し、含まれていれば{"AMEX": "374245455400126"}というJSONレスポンスを返します。
idが含まれていなければ、400エラーと共に{"error": "Invalid request"}を返します。
ポート80番で起動させるためにはsudoが必要なので以下のコマンドを実行して起動させます。

sudo python3 -m pip install Flask
sudo python3 app.py

起動が完了したら以下のcurlコマンドを実行します。

curl -X POST http://<ip address>/ -H "Content-Type: application/json" -d '{"id": 12345}'

<ip address>は皆さんの値に置き換えてください。別にFQDNでも問題ありません。
以下のJSONが戻るはずです。

{
  "AMEX": "374245455400126"
}

2. Cloudflare の設定

まずいつも通りDNSを設定します。

オリジンがFQDNを持っているなら別にCNAMEでも問題ありません。

curl -X POST https://<cloudflareで管理しているDNS名>/ -H "Content-Type: application/json" -d '{"id": 12345}'

を実行して先ほどと同じResponseが戻れば成功です。

3. Sensitive Data の設定

SecuritySensitive Dataをクリックします。この機能はEnterpriseプランに加えたPaid-Addonになっていますので、テストが必要な方は@kameoncloudまでDM下さい。

Cloudflare Sensitive Data DetectionDeployします。


ルールをクリックします。
監査対象の通信範囲をDNSベースで指定したりその他条件で絞ることが可能ですが、この手順では一旦全て、で進めます。


Rule ConfigurationパートでBrowse rulesをクリックします。

デフォルトでは全てのルールはオンになっていないため、一度全てをオン(Enabled)にしておきます。

4. テスト

この状態で先ほどのcurlを数回実行します。
Eventにアラートが上がっています。




個別のログをドリルダウンすると以下の情報が含まれています。

発生したイベントの情報やリクエストを行ったクライアントの情報、Cloudflareによる攻撃かどうかの判断スコアなどが含まれています。

最後に注意点

この機能は通信遅延を起こさない様、非同期で処理が行われるためLogを出力するのみになります。このログをもとに管理者はWAFのカスタムルールを書いて通信をブロックするか、API Shieldを用いてそのAPIをさらなる監視対象にするか、等を行うことができます。
https://zenn.dev/kameoncloud/articles/cdc891ed63f4b7

Discussion