このガイドでは、Dedicated CDN Egress IPs(専用 CDN エグレス IP)と Logpush の設定およびテスト手順を説明します。固定の専用エグレス IP でログを配信できるようにします。
専用エグレス IP で Logpush を使うには、Dedicated CDN Egress IPs(旧称 Aegis)付きの Smart Shield Advanced が必要です。Dedicated CDN Egress IPs のプールはアカウントではなくゾーンに紐づきます。専用 IP で Logpush を使う場合、トラフィックは 1 つのゾーンへルーティングする必要があります。
基本の考え方は、Dedicated CDN Egress IPs を有効にした Cloudflare ゾーン経由で、Logpush ジョブがログデータをプロキシし、目的の送信先へ送ることです。こうすると、送信先側ではプロキシゾーンに割り当てた専用エグレス IP だけを許可リストに登録すれば足ります。
前提として、専用ゾーンを作成するか、既存ゾーンを使います。既存ゾーンを使う場合、そのゾーンのエグレスは Dedicated CDN Egress IPs に制限されます。そのゾーンを使うほかのサービスに影響がないことを確認してください。
本番システムへの影響を避けるため、プロキシ専用の別ゾーンを使うことを推奨します。新しいゾーンを作る場合は、Cloudflare でドメインを登録する 手順 に従ってください。
次の例は、HTTPS 送信先をプロキシするように Logpush と Dedicated CDN Egress IPs を設定します。ただし、対応する Logpush 送信先であればプロキシは機能します。どの送信先も内部では HTTP プロトコルを使います。
-
Cloudflare のアカウントチームと連携し、ゾーン向けに Dedicated CDN Egress IPs を購入します。
-
(任意ですが推奨)リージョンをまたいでカバーするため、PDX-B と SJC-A に 1 つずつ、合計 2 つの IP を依頼します。
-
プロビジョニング後、Pool ID を確認します。
- 専用エグレス IP プール向けに、ゾーンを登録するか既存ゾーンを使います。
- アカウントチームに連絡し、専用エグレス IP プールの ID を取得します。
- Edit Zone Setting エンドポイントへ
PATCHリクエストを送ります。
- URL の setting ID に
aegisを指定します。 - リクエスト本文で
enabledをtrueにし、前の手順の ID をpool_idに使います。
Required API token permissions
At least one of the following token permissions is required:Zone Settings Write
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/aegis" \
--request PATCH \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"id": "aegis",
"value": {
"enabled": true,
"pool_id": "<YOUR_EGRESS_POOL_ID>"
}
}'- ゾーンに DNS レコード(CNAME または A/AAAA)を追加し、Target を HTTP 送信先エンドポイントにします。
- 必要なら、オリジンルール でカスタムポートを指定します。送信先が標準以外のポート(例:
12345)だけを受け付ける場合に便利です。logpush.yourdestinationendpoint.com(ポートは指定しません。Cloudflare はデフォルトで HTTP/HTTPS ポートのトラフィックだけをプロキシします)を、yourdestinationendpoint.com:12345へプロキシするように設定できます。
- 次の内容で Logpush ジョブを作成します。
- Destination: HTTP
- Endpoint: 用意したドメインとパスを使います(Cloudflare ダッシュボードが送信先を自動検証します)。DNS レコードの Name に指定したサーバー名を使います。この例では
logpush.yourdestionationendpoint.comです。
- Configuration: データセット、ジョブ名、フィルター、フィールドを選びます。詳細は Logpush のドキュメント を参照してください。
- 送信先でログを受信していることを確認します。
プロキシゾーンのホスト名は公開で解決できますが、トラフィックは Cloudflare のエッジを通るため、そこでセキュリティ制御を適用できます。エンドポイントを守るには、次のベストプラクティスを使います。
Logpush ジョブにシークレットトークンを HTTP ヘッダーとして追加し、それが無いリクエストをブロックする WAF ルールを作成します。ほとんどの導入では、この方法を推奨します。
シークレットヘッダー付きで Logpush を設定する
header_ で始まる URL パラメーターは、リクエストの HTTP ヘッダーになります。Logpush ジョブの作成時または更新時に、送信先 URL へシークレットヘッダーを追加します。
https://logpush.yourdestinationendpoint.com?header_X-Logpush-Secret=YOUR_RANDOM_SECRET_TOKEN強力なランダムトークンは openssl rand -hex 32 で生成します。
WAF カスタムルールを作成する
プロキシゾーンで Security > WAF > Custom rules を開き、正しいシークレットヘッダーが無いリクエストをブロックするルールを作成します。
- Expression:
(http.host eq "logpush.yourdestinationendpoint.com" and all(http.request.headers["x-logpush-secret"][*] ne "YOUR_RANDOM_SECRET_TOKEN")) - Action: Block
多層防御として、Cloudflare の ASN からのトラフィックだけを許可するルールを追加します。Logpush のトラフィックは Cloudflare のネットワーク(ASN 13335、132892、または 202623)から発信されます。
- Expression:
(http.host eq "logpush.yourdestinationendpoint.com" and not ip.geoip.asnum in {13335 132892 202623}) - Action: Block
より強い認証には、マシン間認証向けの Cloudflare Access Service Tokens を使います。Zero Trust ダッシュボードで Service Token を作成し、Access ヘッダー付きで Logpush を設定します。
https://logpush.yourdestinationendpoint.com?header_CF-Access-Client-Id=YOUR_CLIENT_ID&header_CF-Access-Client-Secret=YOUR_CLIENT_SECRETWAF ルールが不正なリクエストをブロックしているかをテストします。
$ curl https://logpush.yourdestinationendpoint.com
# 期待される結果: error code: 1020
$ curl -H "X-Logpush-Secret: wrong-token" https://logpush.yourdestinationendpoint.com
# 期待される結果: error code: 1020プロキシゾーンの Cloudflare Analytics で Logpush トラフィックが流れていることを確認し、WAF イベントを監視して不正なリクエストがブロックされていることを確かめます。