次の例から、Terraform で API Shield を使い始められます。Cloudflare で Terraform を使う方法の詳細は、Terraform のドキュメント を参照してください。
Terraform で設定できるリソースは次のとおりです。
セッション識別子
api_shield↗ — API Shield の セッション識別子 を設定します。
Web Assets オペレーション
api_shield_operation↗ — オペレーション を設定します。
スキーマ検証
cloudflare_schema_validation_schemas↗ — スキーマ検証 のスキーマを設定します。は非推奨で、将来の terraform provider のバージョンで削除されます。api_shield_schema↗
JWT 検証
cloudflare_token_validation_config↗ — 鍵情報とトークンの場所を指定して JWT 検証を設定します。cloudflare_token_validation_rules↗ — 検証結果に対するアクションのルールを設定します。
ゾーンに セッション識別子 を設定する例は、次のとおりです。
resource "cloudflare_api_shield" "session_identifiers" {
zone_id = var.zone_id
auth_id_characteristics = [{
name = "authorization"
type = "header"
}]
}オペレーションは、メソッド、ホスト名、パスで管理します。オペレーションは Web Assets のインベントリに表示されます。
resource "cloudflare_api_shield_operation" "get_image" {
zone_id = var.zone_id
method = "GET"
host = "example.com"
endpoint = "/api/images/{var1}"
}
resource "cloudflare_api_shield_operation" "post_image" {
zone_id = var.zone_id
method = "POST"
host = "example.com"
endpoint = "/api/images/{var1}"
}スキーマリソースは OpenAPI スキーマをアップロードします。validation_enabled を true にすると、アップロードしたプロファイルの評価が利用可能になります。
# Upload an OpenAPI schema for Schema Validation
resource "cloudflare_schema_validation_schemas" "example_schema" {
zone_id = var.zone_id
kind = "openapi_v3"
name = "example-schema.yaml"
# In this example, we assume that the `example-schema.yaml` includes `get_image` and `post_image` operations from above
source = file("./schemas/example-schema.yaml")
validation_enabled = true
}有効化だけでは緩和は設定されません。緩和には WAF Custom Rules で cf.schema_validation.uploaded.violated を使います。
ゾーンで JWT Validation を行う設定例は、次のとおりです。
# Setting up JWT validation with specific keying material and location of the token
resource "cloudflare_token_validation_config" "example_es256_config" {
zone_id = var.zone_id
token_type = "JWT"
title = "ES256 Example"
description = "An example configuration that validates ES256 JWTs with `b0078548-c9bc-46e5-a678-06fb72443427` key ID in the authorization header"
token_sources = ["http.request.headers[\"authorization\"][0]"]
credentials = {
keys = [
{
alg = "ES256"
kid = "b0078548-c9bc-46e5-a678-06fb72443427"
kty = "EC"
crv = "P-256"
x = "yl_BZSxUG5II7kJCMxDfWImiU6zkcJcBYaTgzV3Jgnk"
y = "0qAzLQe_YGEdotb54qWq00k74QdiTOiWnuw_YzuIqr0"
}
]
}
}
# Setting up JWT rules for all configured endpoints on `example.com` except for `get_image`
resource "cloudflare_token_validation_rules" "example_com" {
zone_id = var.zone_id
title = "Validate JWTs on example.com"
description = "This actions JWT validation results for requests to example.com except for the get_image endpoint"
action = "block"
enabled = true
# Require that the JWT described through the example_es256_config is valid.
# Reference the ID of the generated token config, this constructs: is_jwt_valid("<id>")
# If the expression is >not true<, Cloudflare will perform the configured action on the request
expression = format("(is_jwt_valid(%q))", cloudflare_token_validation_config.example_es256_config.id)
selector = {
# all current and future operations matching this include selector will perform the described action when the expression fails to match
include = [
{
host = ["example.com"]
}
]
exclude = [
{
# reference the ID of the get_image operation to exclude it
operation_ids = ["${cloudflare_api_shield_operation.get_image.id}"]
}
]
}
}
# With JWT validation, we can also refine session identifiers to use claims from the JWT
resource "cloudflare_api_shield" "session_identifiers" {
zone_id = var.zone_id
auth_id_characteristics = [{
# select the JWT's `sub` claim as an extremely stable session identifier
# this is "<token_config_id:json_path>" format
name = "${cloudflare_token_validation_config.example_es256_config.id}:$.sub"
type = "jwt"
}]
}