Cloudflare Zero Trust の File sandboxing 動作を確認する

# File sandboxing

File sandboxing 機能の動作を確認します。

https://developers.cloudflare.com/cloudflare-one/policies/gateway/http-policies/file-sandboxing/

> アンチウイルス(AV)スキャンに加え、Gatewayはユーザーがダウンロードした未見のファ イルをサンドボックスに隔離し、マルウェアをスキャンします。
>
> ファイルが隔離されている間、Gatewayはユーザーにスキャンページを表示します。ファイルがスキャンに合格すると、Gateway はそのファイルを隔離から解放し、ユーザーのデバイスにダウンロードします。ファイルにマルウェアが含まれている場合、Gateway はリクエストをブロックし、HTTP ログにブロック決定として一致を記録します。
>
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/53c02ad5-3b6a-1610-e320-7d1d547869eb.png)


# File sandboxing 設定

Settings > Network > Firewall > File sandboxing から有効にします。

AV inspection > File sandboxing の順番で実行されますが、File sandboxing の動作確認のため、AV inspection は無効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/586e66d2-6dd0-e912-3f98-7792a90cce8f.png)

> 悪意のあるコンテンツを含むダウンロードされたファイルを、密閉された環境で識別します。A/Vスキャナでは通常検出されないゼロデイ（新しく検出された/パッチが適用されていないソフトウェアエクスプロイト）や、これまで検出されなかった可能性のある悪意のあるファイルから保護します。HTTPポリシーで適用できます。

# ポリシー設定

Gateway > Firewall policies > HTTP から `Action = Quarantine` とした HTTP ポリシーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/42332a11-2188-ed14-cd49-2fc4570fbc6b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/207d076f-533c-92cb-8d52-a3c06261b869.png)

# テスト
適当なファイルダウンロードページを探して、ファイルダウンロードを試行します。

https://examplefile.com/document/pdf

# スキャンページ
File sandboxing の対象となるファイルダウンロードでは、スキャン中に以下のページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/a91fd8b5-08c4-5df5-6595-5f6e9ffab363.png)

>安全性を確認するため、ファイルをスキャンしています。約2分後に下のリンクから再度ダウンロードをお試しください。注：ファイルによっては、スキャンに最大10分かかる場合があります。


# スキャン後の許可・ブロック

スキャン完了後にリンクをクリックしてファイルダウンロードを試行すると

- 許可された場合、そのままファイルをダウンロードできます。
- ブロックされた場合、カスタマイズ可能なブロックページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/9d78a638-1b1d-010c-b154-4a8c1575986f.png)

# 2回目以降のファイルダウンロード

スキャンページは表示されません。

前回の判定結果に基づき、ファイルダウンロードが許可・ブロックされます。

# ダッシュボードログ

## スキャン
スキャン対象となったリクエストは `Action = Quarantine` と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/f87d27dc-d128-d070-071b-a7ca45f0c45b.png)

## ブロック
スキャン後にブロック対象となったリクエストは `Action = Block`、`Blocked file reason = Quarantine` と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/77990b89-f880-2c41-e9dd-cdd13f8dd5a9.png)


# Logpush - Gateway HTTP

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/462c57e1-e033-bc36-6ebb-034acb16f021.png)

## スキャン
`Action = sandbox` となります。

```json:file-sandbox-scan.json
{
  "AccountID": "xx",
  "Action": "sandbox",
  "ApplicationIDs": [],
  "ApplicationNames": [],
  "BlockedFileHash": "",
  "BlockedFileName": "",
  "BlockedFileReason": "unknown",
  "BlockedFileSize": 0,
  "BlockedFileType": "",
  "CategoryIDs": [
    26,
    109
  ],
  "CategoryNames": [
    "Technology",
    "Information Technology"
  ],
  "Datetime": "2024-10-16T15:57:27Z",
  "DestinationIP": "2606:4700:3036::6815:23dc",
  "DestinationIPContinentCode": "",
  "DestinationIPCountryCode": "",
  "DestinationPort": 443,
  "DeviceID": "xx",
  "DeviceName": "xx",
  "DownloadMatchedDlpProfileEntries": [],
  "DownloadMatchedDlpProfiles": [],
  "DownloadedFileNames": [
    "2mb.pdf"
  ],
  "Email": "user1@example.com",
  "FileInfo.files": [
    {
      "file_size": 2150543,
      "content_type": "application/pdf",
      "action": "none",
      "direction": "download",
      "file_name": "2mb.pdf",
      "file_type": "PDF",
      "file_hash": "6e3f8c115e6878776ce3d01e93238bc4703efa58562075d38e93c43eedb33db4"
    }
  ],
  "ForensicCopyStatus": "none",
  "HTTPHost": "examplefile.com",
  "HTTPMethod": "GET",
  "HTTPStatusCode": 200,
  "HTTPVersion": "HTTP/2",
  "IsIsolated": false,
  "PolicyID": "65e839fd-a946-4776-a4f0-3d675dcda11b",
  "PolicyName": "Sandbox Scan files",
  "PrivateAppAUD": "",
  "ProxyEndpoint": "",
  "Quarantined": false,
  "Referer": "https://examplefile.com/document/pdf/2-mb-pdf",
  "RequestID": "2337a57b07000025f2a0eef400000001",
  "SessionID": "23377b8a48000025f2903fb400000001",
  "SourceIP": "xx",
  "SourceIPContinentCode": "AS",
  "SourceIPCountryCode": "JP",
  "SourceInternalIP": "",
  "SourcePort": 51419,
  "URL": "https://examplefile.com/file-download/152",
  "UntrustedCertificateAction": "none",
  "UploadMatchedDlpProfileEntries": [],
  "UploadMatchedDlpProfiles": [],
  "UploadedFileNames": [],
  "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
  "UserID": "xx",
  "VirtualNetworkID": "604aa865-1642-405c-a745-3d448f69b8f1",
  "VirtualNetworkName": "default"
}
```

## ブロック
`Action = block`、`Quarantined = true`、`BlockedFileReason = sandboxScan` となります。

また、`BlockedFileHash` が同じ値の場合には、スキャンログがなく、ブロックされたこともわかります。

```json:block-after-scan.json
{
  "AccountID": "xx",
  "Action": "block",
  "ApplicationIDs": [],
  "ApplicationNames": [],
  "BlockedFileHash": "4fec481a4f18a275d09fcadf2ff41161bdab4260a5ba4d620841d64f9da1857a",
  "BlockedFileName": "",
  "BlockedFileReason": "sandboxScan",
  "BlockedFileSize": 0,
  "BlockedFileType": "",
  "CategoryIDs": [
    26,
    155
  ],
  "CategoryNames": [
    "Technology",
    "Technology"
  ],
  "Datetime": "2024-10-16T16:06:35Z",
  "DestinationIP": "xx",
  "DestinationIPContinentCode": "EU",
  "DestinationIPCountryCode": "FR",
  "DestinationPort": 443,
  "DeviceID": "xx",
  "DeviceName": "xx",
  "DownloadMatchedDlpProfileEntries": [],
  "DownloadMatchedDlpProfiles": [],
  "DownloadedFileNames": [
    "<unknown file name>"
  ],
  "Email": "user1@example.com",
  "FileInfo.files": [
    {
      "action": "none",
      "direction": "download",
      "file_name": "<unknown file name>",
      "file_type": "PDF",
      "file_hash": "4fec481a4f18a275d09fcadf2ff41161bdab4260a5ba4d620841d64f9da1857a",
      "file_size": 2057,
      "content_type": "application/pdf"
    }
  ],
  "ForensicCopyStatus": "none",
  "HTTPHost": "x.x.x",
  "HTTPMethod": "GET",
  "HTTPStatusCode": 302,
  "HTTPVersion": "HTTP/1.1",
  "IsIsolated": false,
  "PolicyID": "65e839fd-a946-4776-a4f0-3d675dcda11b",
  "PolicyName": "",
  "PrivateAppAUD": "",
  "ProxyEndpoint": "",
  "Quarantined": true,
  "Referer": "",
  "RequestID": "2337add97f000025f2a1e64400000001",
  "SessionID": "2337852e94000025f29155e400000001",
  "SourceIP": "xx",
  "SourceIPContinentCode": "AS",
  "SourceIPCountryCode": "JP",
  "SourceInternalIP": "",
  "SourcePort": 51597,
  "URL": "https://x.x.x/sample.pdf",
  "UntrustedCertificateAction": "none",
  "UploadMatchedDlpProfileEntries": [],
  "UploadMatchedDlpProfiles": [],
  "UploadedFileNames": [],
  "UserAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36",
  "UserID": "xx",
  "VirtualNetworkID": "604aa865-1642-405c-a745-3d448f69b8f1",
  "VirtualNetworkName": "default"
}
```