🍱

Cloudflare Gateway で自前の脅威情報を利用・共有する

2024/04/30に公開

はじめに

サイバー攻撃対策において脅威情報を他の組織と共有することは理にかなっているようです。
参考: 総務省 サイバー攻撃の情報共有にかかる取組について(PDF)

Cloudflare のプラットフォームにも、ユーザーが自前の脅威情報をインポートし、自身のアカウントで利用および他のアカウントと共有できる機能が用意されています。

執筆時点(2024年4月)では Cloudflare Gateway での情報利用に対応しています。今後の展開に期待します。

Custom Indicator Feeds

Custom Indicator Feeds という機能です。

Provider が脅威情報の提供者、Subscriber が享受者となり、共有機能を利用します。
Cloudflare のアカウントはどちらにもなりえます。
脅威情報は stix2 形式に対応しています。
執筆時点で Provider になるには Cloudflare への連絡が必要です。

If your organization has interest in becoming a provider or a subscriber, contact your account team, who will help facilitate the required authorization.

設定の流れ

大まかには下記の流れになります。

  1. フィードの準備
  2. フィードのアップロード
  3. フィードの共有
  4. Gatetway での利用

フィードの準備

  1. stix2 形式で脅威情報を用意します。今回は OASIS Open の python-stix2 APIを使い、www.example.(com|net) 2 つのドメインを指定したテスト用の stix2 ファイルを作成しました。👉使用コード
$ cat domains.txt
www.example.net
www.example.com

$ python3 domain2stix2.py
{
    "type": "bundle",
    "id": "bundle--ae605199-5a10-4bfc-b048-cd64d110fe84",
    "objects": [
        {
            "type": "malware",
            "spec_version": "2.1",
            "id": "malware--40281b19-ff61-4bdb-b6fb-3734d855ad4d",
            "created": "2024-04-26T08:32:11.371164Z",
            "modified": "2024-04-26T08:32:11.371164Z",
            "name": "myTestPhishingDomains",
            "is_family": false
        },
        {
            "type": "indicator",
            "spec_version": "2.1",
            "id": "indicator--bf275514-6ef3-4269-ac66-af17b2fa4338",
            "created": "2024-04-26T08:32:11.371747Z",
            "modified": "2024-04-26T08:32:11.371747Z",
            "name": "Phshing Domain",
            "pattern": "[domain-name:value='www.example.net']",
            "pattern_type": "stix",
            "pattern_version": "2.1",
            "valid_from": "2024-04-26T08:32:11.371747Z"
        },
        {
            "type": "relationship",
            "spec_version": "2.1",
            "id": "relationship--0ec5e659-11c6-4fe6-9c73-c3f8f44e4a64",
            "created": "2024-04-26T08:32:11.377889Z",
            "modified": "2024-04-26T08:32:11.377889Z",
            "relationship_type": "indicates",
            "source_ref": "indicator--bf275514-6ef3-4269-ac66-af17b2fa4338",
            "target_ref": "malware--40281b19-ff61-4bdb-b6fb-3734d855ad4d"
        },
        {
            "type": "indicator",
            "spec_version": "2.1",
            "id": "indicator--e5dd835e-3d63-4152-b358-f21a0631b712",
            "created": "2024-04-26T08:32:11.378658Z",
            "modified": "2024-04-26T08:32:11.378658Z",
            "name": "Phshing Domain",
            "pattern": "[domain-name:value='www.example.com']",
            "pattern_type": "stix",
            "pattern_version": "2.1",
            "valid_from": "2024-04-26T08:32:11.378658Z"
        },
        {
            "type": "relationship",
            "spec_version": "2.1",
            "id": "relationship--9c25f383-138e-48ec-97f4-289fc1af4c88",
            "created": "2024-04-26T08:32:11.380786Z",
            "modified": "2024-04-26T08:32:11.380786Z",
            "relationship_type": "indicates",
            "source_ref": "indicator--e5dd835e-3d63-4152-b358-f21a0631b712",
            "target_ref": "malware--40281b19-ff61-4bdb-b6fb-3734d855ad4d"
        }
    ]
}

フィードのアップロード

  1. Cloudflare の担当営業チームに Custom Indicator Feeds を使いたい旨、連絡します。
  2. Cloudflare により Provider 機能が有効にされたあと、フィードを投入するエンドポイントを作成します。👉 API
    フィードごとに複数作成できます。出力の id を確認します。
 curl --request POST \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/intel/indicator-feeds" \
  --header 'Content-Type: application/json' \
  --header "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY" \
  --data '{
  "description": "test feed",
  "name": "my_feed_1"
  }'

...
 {
    "id": 21,
    "name": "my_feed_1",
    "description": "test feed",
    "created_on": "2024-04-26T07:44:55.959692Z",
    "modified_on": "2024-04-26T07:44:55.959692Z"
  }
  1. 付与された id(この場合 21) に対して stix2 ファイルをアップロードします。👉 API
$ FID=21
## アップロード
$ curl --request PUT \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/intel/indicator-feeds/$FID/snapshot" \
  --header 'Content-Type: multipart/form-data' \
  --header "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY" \
  --form source=@phi.stix2

...
 {
    "file_id": 21,
    "filename": "Keio_21_snapshot_20240426T074558Z.unified",
    "status": "unified"
  }
  
## 確認
$ curl --request GET \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/intel/indicator-feeds/$FID" \
  --header 'Content-Type: application/json' \
  --header "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY"

...
 {
    "id": 21,
    "name": "my_feed_1",
    "description": "test feed",
    "created_on": "2024-04-26T07:44:55.959692Z",
    "modified_on": "2024-04-26T07:44:55.959692Z",
    "latest_upload_status": "Complete"
  }

## 確認(中身)
$ curl --request GET \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/intel/indicator-feeds/$FID/data" \
  --header 'Content-Type: application/json' \
  --header "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY"

...
Indicator	Category
www.example.com	22
www.example.net	22

フィードの共有

  1. 自分のアカウントでそのフィードを使えるようにします。👉 API
    Provider になっただけではフィードを使えません。自分自身のアカウントで利用するにも Subscriber として登録し、許可を与えます。
$ curl --request PUT \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/intel/indicator-feeds/permissions/add" \
  --header 'Content-Type: application/json' \
  --header "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY" \
  --data '{"account_tag": "'"$ACCOUNT_ID"'", "feed_id": "'"$FID"'"}'

...
 {
    "success": true
  }
  1. パーミッションを確認します。👉API
    すでにひとつ作成しているので、2個目で追加されています。
$ curl --request GET \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/intel/indicator-feeds/permissions/view" \
  --header 'Content-Type: application/json' \
  --header "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY"

...
 [
    {
      "id": 20,
      "name": "keio_test_1",
      "description": "testing custom threat feeds api",
      "provider_name": "Keio",
      "provider_id": *
    },
    {
      "id": 21,
      "name": "my_feed_1",
      "description": "test feed",
      "provider_name": "Keio",
      "provider_id": *
    }
  ]

Gateway での利用

  1. この状態で自分のアカウントの Gateway DNS ポリシーをみると、 Indicator Feeds というセレクタに作成した Custom Feed が表示されます。
    フィードを選択し、Block で定義してみます。

  2. WARP 経由で組織にログインし DNS を参照すると、期待通り Block されました。

$ warp-cli status
Status update: Connected
Success

$ dig www.example.com +noal +an
www.example.com.	60	IN	A	0.0.0.0

## WARP を切ると通常応答
$ warp-cli disconnect
Success

$ dig www.example.com +noal +an
www.example.com.	5	IN	A	93.184.215.14

Gateway のログをみると、登録したフィードにマッチしたことがわかります。

  1. 他のアカウントに共有してみます。👉 API
    共有したいアカウントの ID と共有するフィード ID を指定します。
$ OTHER_ACCOUNT=<他の Cloudflare アカウント ID>

$ curl --request PUT \
  --url "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/intel/indicator-feeds/permissions/add" \
  --header 'Content-Type: application/json' \
  --header "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY" \
--data '{"account_tag": "'"$OTHER_ACCOUNT"'", "feed_id": "'"$FID"'"}'

...
 {
    "success": true
  }
  1. 共有を許可されたアカウントでもフィードが利用できるようになりました。

まとめ

以上、自前の脅威情報を Gateway で利用・共有することができました。
今後、他のオブジェクトやプロダクトにも共有機能が展開され、さらなるセキュリティ強化・連携につながることを期待します。

Discussion