Cloudflare Zero Trust の DLP ポリシーを日本語で試す

# Cloudflare Zero Trust の DLP

> [Data Loss Prevention · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/policies/filtering/http-policies/data-loss-prevention/)
>
> ~~Data Loss PreventionはEnterpriseプランでのみ利用可能です。~~
>
> Cloudflare Data Loss Prevention (DLP) と Secure Web Gateway を使用すると、社会保障番号やクレジットカード番号などの機密データの存在をHTTPトラフィックで検査することができます。DLPは、アップロードまたはダウンロードされたMicrosoft Officeドキュメント（Office 2007以降）、PDF、チャットメッセージ、フォーム、その他のWebコンテンツなど、HTTPボディ全体をスキャンします。可視性は、サイトやアプリケーションによって異なります。DLPは、電子メールなどの非HTTPトラフィックや、Cloudflare Gatewayを迂回するトラフィック（例えば、Do Not Inspectルールに一致するトラフィック）をスキャンすることはありません。
>
> DLPフィルタリングを行うには、まず検出したいデータパターンを持つDLPプロファイルを構成し、次にGateway HTTPポリシーを構築して、機密データが組織から外に出るのを許可またはブロックします。Gateway は HTTP トラフィックを解析し、DLP プロファイルで指定されたキーワードまたは正規表現に一致する文字列をスキャンします。

```mermaid:
graph BT

subgraph Web ["Web App (TCP 80 or 443)"]
subgraph Private
Connector
Intranet[Origin]
end
subgraph Public
Internet[Origin]
subgraph SaaS
subgraph rest [Data at rest]
SaaSFile[File]
end
end
end
end

subgraph Client
Body
File
end

subgraph Cloudflare
  subgraph Gateway ["Gateway TLS decryption (Inspect data in transit)"]
    %%subgraph transit [Inspect data in transit]
      subgraph HTTPPolicies["HTTP Policies"]
        PayloadLogging[Payload Logging]
      end
    %%end
  end
  subgraph DLP [DLP Profiles]
    subgraph Entries [Detection Entries]
    direction LR
      Pre-defined
      CustomRegex[Custom Regex]
      Pre-defined ~~~ Integration
      CustomRegex ~~~ Datasets
      subgraph Integration
        MIP["Microsoft Purview Information Protection<br>(MIP) sensitivity labels"]
      end
      subgraph Datasets
      direction LR
        EDM[Exact Data Match]
        CWL[Custom Wordlist]
        EDM ~~~ CWL
      end
    end
    subgraph Config [Advanced settings]
    direction TB
      MatchCount[Match count]
      ContextAnalysis[Context analysis]
      OCR
      MatchCount ~~~ ContextAnalysis ~~~ OCR
    end
  end
  CASB
end

Client <---> |Upload<br>or<br>Download|Gateway
Gateway <--> |HTTPS|Internet & SaaS
Gateway <--> |HTTPS|Connector <--> Intranet
CASB --> |API-driven Scan|rest
DLP <-.-> HTTPPolicies
DLP ~~~ CASB
DLP <-.-> CASB
DLP ~~~ CASB
```

# 適用可能な接続方式
DLP は HTTP ポリシーに付随する機能のため、HTTP ポリシーが適用可能な以下のいずれかの接続方式の場合で適用が可能です。

https://developers.cloudflare.com/reference-architecture/architectures/sase/#summary-of-swg-capabilities-for-each-traffic-forwarding-method

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/ece3a4b3-7b4b-2d79-84c5-8e0610fb5641.png)


# DLP カスタムプロファイル作成

- [Build a custom profile · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/policies/filtering/http-policies/data-loss-prevention/#build-a-custom-profile)

日本語で以下のように「こんにちは」をそのまま正規表現の Value として定義できます。

「Detection entry name」は英字表記にしておくと、ダッシュボードログでも表示できます。

![image-20221130010442804](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221130010442804.png)

![image-20221130010636530](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221130010636530.png)

# HTTP ポリシー設定

- [Create a DLP policy · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/policies/filtering/http-policies/data-loss-prevention/#2-create-a-dlp-policy)

テスト用に以下の HTTP ポリシーを作成します。

![image-20221130011424491](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221130011424491.png)

# DLP テスト

- [Test DLP· Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/policies/filtering/http-policies/data-loss-prevention/#3-test-dlp)

こちらにあるように https://dlptest.com/https-post/ からテストできます。

## Test Message

以下のテキストメッセージを POST すると、Access restricted のページが表示されることが確認できます。

![image-20221130003309446](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221130003309446.png)

![image-20221130004911624](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221130004911624.png)

以下がダッシュボードで確認可能なログです。

![image-20221130004711966](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221130004711966.png)

以下がブロック時のログ出力のレコードです。

```json
{
  "AccountID": "xxx",
  "Action": "block",
  "BlockedFileHash": "",
  "BlockedFileName": "",
  "BlockedFileReason": "unknown",
  "BlockedFileSize": 0,
  "BlockedFileType": "",
  "Datetime": 1669735991664000000,
  "DestinationIP": "35.209.241.59",
  "DestinationPort": 443,
  "DeviceID": "df469de4-6ff5-11ed-9b86-2617b8795c9a",
  "DownloadedFileNames": [],
  "Email": "non_identity@xxx.cloudflareaccess.com",
  "HTTPHost": "dlptest.com",
  "HTTPMethod": "POST",
  "HTTPVersion": "HTTP/2",
  "IsIsolated": false,
  "PolicyID": "7a8e0617-0153-420b-b87c-f9a58f5474ad",
  "Referer": "https://dlptest.com/https-post/",
  "RequestID": "15659e616d00001d938ce4a400000001",
  "SourceIP": "100.96.0.33",
  "SourcePort": 59693,
  "URL": "https://dlptest.com/https-post/",
  "UploadedFileNames": [],
  "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
  "UserID": "b7761faf-27e6-4d08-a35a-802db584b739"
}
```

## File Upload

Google Docs から「こんにちは」だけのファイルを作成 ＞ PDF として `dlptest.pdf` をダウンロード保存します。

 `dlptest.pdf` をアップロードすると、以下のようにポリシー適用が確認できます。

![image-20221130005450372](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221130005450372.png)

以下がダッシュボードで確認可能なログです。

![image-20221130005653480](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221130005653480.png)

以下がダッシュボードで確認可能なログです。

ファイルアップロードのブロックでは `BlockedFileName` 、`BlockedFileType` に情報が入ってきます。

```json
{
  "AccountID": "xxx",
  "Action": "block",
  "BlockedFileHash": "",
  "BlockedFileName": "dlptest.pdf",
  "BlockedFileReason": "unknown",
  "BlockedFileSize": 0,
  "BlockedFileType": "PDF",
  "Datetime": 1669737211797000000,
  "DestinationIP": "35.209.241.59",
  "DestinationPort": 443,
  "DeviceID": "df469de4-6ff5-11ed-9b86-2617b8795c9a",
  "DownloadedFileNames": [],
  "Email": "non_identity@xxx.cloudflareaccess.com",
  "HTTPHost": "dlptest.com",
  "HTTPMethod": "POST",
  "HTTPVersion": "HTTP/2",
  "IsIsolated": false,
  "PolicyID": "7a8e0617-0153-420b-b87c-f9a58f5474ad",
  "Referer": "https://dlptest.com/https-post/",
  "RequestID": "1565b0ff8000001d938da69400000001",
  "SourceIP": "100.96.0.33",
  "SourcePort": 59693,
  "URL": "https://dlptest.com/wp-admin/admin-ajax.php",
  "UploadedFileNames": [],
  "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
  "UserID": "b7761faf-27e6-4d08-a35a-802db584b739"
}
```

## Payload Logging
以下のガイドに従って、公開鍵・秘密鍵のペアを作成し、公開鍵を登録します。

https://developers.cloudflare.com/cloudflare-one/policies/data-loss-prevention/dlp-policies/payload-logging/

>Data Loss Prevention では、特定の DLP ポリシーをトリガーしたデータをログに記録できます。このデータは、ペイロードとして知られる HTTP リクエストの部分に保存されます。ペイロードのロギングは、DLP ルールの動作を診断する場合に特に役立ちます。

その後、各 HTTP (DLP) ポリシーで Payload Logging　を有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2e61e8c9-9f80-03ce-9a09-ef5238969c0d.png)

以下の内容でテストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7e11264e-24bf-c7f3-a72c-470bd9f37f00.png)

Gateway activity log から「Payload log match > Decrypt payload log」をたどり、リクエストの DLP 一致部分がログに記録されたため、秘密鍵を入力してログを復号化します。

>ルールのトリガーとなった値には機密データが含まれている可能性があるため、顧客提供の公開鍵で暗号化され、後で自分だけが検査できるようになります。保存されるデータには、マッチの非表示バージョンに加え、マッチの両側に20文字の追加コンテキストが含まれます。

以下のように確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/1d725249-eccb-7c06-8f3f-71bdc96c17d4.png)

```json:
{
  "AccountID": "b5341236aea624bd7e2a0770ee3fb5e5",
  "Action": "block",
  "BlockedFileHash": "",
  "BlockedFileName": "dlptest.pdf",
  "BlockedFileReason": "unknown",
  "BlockedFileSize": 0,
  "BlockedFileType": "PDF",
  "Datetime": "2024-05-20T15:49:54Z",
  "DestinationIP": "35.209.95.242",
  "DestinationPort": 443,
  "DeviceID": "85a88112-16ba-11ef-b134-dadffe834e39",
  "DeviceName": "xxxxxxxxxx",
  "DownloadMatchedDlpProfileEntries": [],
  "DownloadMatchedDlpProfiles": [],
  "DownloadedFileNames": [],
  "Email": "non_identity@xxx.cloudflareaccess.com",
  "FileInfo": {
    "files": [
      {
        "direction": "upload",
        "file_name": "dlptest.pdf",
        "file_type": "PDF",
        "file_hash": "038851b7cc273c4351a984b54ec10365f8cf4ce25647b010ccfc832a2443bbf4",
        "file_size": 7858,
        "content_type": "application/pdf",
        "action": "block"
      },
      {
        "direction": "upload",
        "file_name": "<unknown file name>",
        "file_hash": "6ac36bf23aae4f2ae59dabb142a0bffaf977c1945a681d656ae75e8f286a3492",
        "file_size": 19,
        "action": "none"
      },
      {
        "file_name": "<unknown file name>",
        "file_hash": "6f4b6612125fb3a0daecd2799dfd6c9c299424fd920f9b308110a2c1fbd8f443",
        "file_size": 2,
        "action": "none",
        "direction": "upload"
      },
      {
        "file_hash": "4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8",
        "file_size": 2,
        "action": "none",
        "direction": "upload",
        "file_name": "<unknown file name>"
      },
      {
        "file_size": 10,
        "action": "none",
        "direction": "upload",
        "file_name": "<unknown file name>",
        "file_hash": "617c4e0c5ab1803cb058ee6049277f61ca90ae3e244fbcbbc4607bfe25f0ae97"
      }
    ]
  },
  "HTTPHost": "dlptest.com",
  "HTTPMethod": "POST",
  "HTTPStatusCode": 302,
  "HTTPVersion": "HTTP/2",
  "IsIsolated": false,
  "PolicyID": "7a8e0617-0153-420b-b87c-f9a58f5474ad",
  "PolicyName": "Block with Japanese DLP",
  "Referer": "https://dlptest.com/https-post/",
  "RequestID": "20384b07b800001d778b41d400000001",
  "SessionID": "20384aee1000001d778b3e2400000001",
  "SourceIP": "x.x.x.x",
  "SourceInternalIP": "",
  "SourcePort": 52706,
  "URL": "https://dlptest.com/wp-admin/admin-ajax.php",
  "UntrustedCertificateAction": "none",
  "UploadMatchedDlpProfileEntries": [
    "d743a889-b636-4e1c-a863-ec8521104f8e"
  ],
  "UploadMatchedDlpProfiles": [
    "b89956af-0cc6-4aef-8aa0-41dcb4e910dd"
  ],
  "UploadedFileNames": [
    "<unknown file name>"
  ],
  "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
  "UserID": "b7761faf-27e6-4d08-a35a-802db584b739"
}
```

# 感想

正規表現としては日本語がそのまま使えて検知できたので、日本でも柔軟な使い方ができそうです。

また、検査としてはボディの中身を見ますが、ログではボディの中身が全て閲覧できるのではなく、あくまで検知アクションの結果とファイル名のレベルで確認できる内容になっています。

「DLP profiles」や「DLP profile entries」もログ出力レコードのフィールドとして確認できるとより便利になってくるかと思いますが、そのうち対応されることでしょう。--> `DownloadMatchedDlpProfileEntries`, `DownloadMatchedDlpProfiles`, `UploadMatchedDlpProfileEntries`, `UploadMatchedDlpProfiles` が追加されました。

https://developers.cloudflare.com/logs/reference/log-fields/account/gateway_http/

以下のラーニングパスも整備されているため、参考にしてください。

https://developers.cloudflare.com/learning-paths/secure-internet-traffic/build-http-policies/data-loss-prevention/#dlp-datasets