包括的なセキュリティを確保するには、プライベートアプリケーションごとに、少なくとも次の 2 つのポリシーを設定することを推奨します。
アプリケーションを定義するドメインリストを対象に、適切なアイデンティティとデバイスポスチャの値を指定した Gateway DNS ポリシー 。ポリシーは、リクエストの名前解決時、ユーザーのデバイスがアプリケーションへ接続を試みる前に適用されます。ここで拒否されると、プライベートネットワークへトラフィックは届きません。
DNS ポリシーと同じアイデンティティとデバイスポスチャの値を指定し、アプリケーションを定義する IP リストを対象にした Gateway ネットワークポリシー 。任意で、SNI ヘッダーに一致させることでドメインリストも含められます。アプリケーションへのアクセスに必要なポートやプロトコルの組み合わせも指定できます。ネットワークポリシーは、ユーザーが DNS ポリシーを通過したあと、デバイスが対象アプリケーションへ接続を試みたときに適用されます。
新しいポリシーを作成するには、Cloudflare ダッシュボード ↗ を開き、Zero Trust > Traffic policies > Firewall policies へ進みます。
curl https://api.cloudflare.com/client/v4/accounts/ $ACCOUNT_ID /gateway/rules \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN " \
--header "Content-Type: application/json" \
--data '{
"name": "Company Wiki DNS policy",
"conditions": [
{
"type": "traffic",
"expression": {
"any": {
"in": {
"lhs": {
"splat": "dns.domains"
},
"rhs": "$<DOMAIN_LIST_ID>"
}
}
}
},
{
"type": "identity",
"expression": {
"matches": {
"lhs": "identity.email",
"rhs": ".*@example.com"
}
}
}
],
"action": "allow",
"precedence": 13002,
"enabled": true,
"description": "Allow employees to access company wiki domains.",
"filters": [
"dns"
]
}' resource "cloudflare_zero_trust_gateway_policy" "dns_allow_wiki_domains" {
name = "Company Wiki DNS policy"
enabled = true
account_id = var . cloudflare_account_id
description = "Managed by Terraform - Allow employees to access company wiki domains."
precedence = 102
action = "allow"
filters = [ "dns" ]
traffic = "any(dns.domains[*] in ${ "$" }${ cloudflare_zero_trust_list . wiki_domains . id } )"
identity = "identity.email matches \" .*@example.com \" "
}
curl https://api.cloudflare.com/client/v4/accounts/ $ACCOUNT_ID /gateway/rules \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN " \
--header "Content-Type: application/json" \
--data '{
"name": "Company Wiki network policy",
"conditions": [
{
"type": "traffic",
"expression": {
"in": {
"lhs": "net.dst.ip",
"rhs": "$<IP_LIST_ID>"
}
}
},
{
"type": "identity",
"expression": {
"matches": {
"lhs": "identity.email",
"rhs": ".*@example.com"
}
}
}
],
"action": "allow",
"precedence": 13002,
"enabled": true,
"description": "Allow employees to access company wiki IPs.",
"filters": [
"l4"
]
}' resource "cloudflare_zero_trust_gateway_policy" "network_allow_wiki_IPs" {
name = "Company Wiki Network policy"
enabled = true
account_id = var . cloudflare_account_id
description = "Managed by Terraform - Allow employees to access company wiki IPs."
precedence = 103
action = "allow"
filters = [ "l4" ]
traffic = "net.dst.ip in ${ "$" }${ cloudflare_zero_trust_list . wiki_IPs . id } "
identity = "identity.email matches \" .*@example.com \" "
}
ネットワークポリシー一覧の末尾に、キャッチオールポリシーを追加することを推奨します。効果的な Zero Trust モデルでは、過度に緩いポリシーを避けるため、デフォルト拒否を優先します。たとえば、次のように設定します。
curl https://api.cloudflare.com/client/v4/accounts/ $ACCOUNT_ID /gateway/rules \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN " \
--header "Content-Type: application/json" \
--data '{
"name": "Catch-all block policy",
"conditions": [
{
"type": "traffic",
"expression": {
"or": [
{
"in": {
"lhs": "net.dst.ip",
"rhs": "$<IP_LIST_ID>"
}
},
{
"any": {
"in": {
"lhs": {
"splat": "net.sni.domains"
},
"rhs": "$<DOMAIN_LIST_ID>"
}
}
}
]
}
}
],
"action": "block",
"precedence": 14002,
"enabled": true,
"description": "Block access to private network.",
"filters": [
"l4"
]
}' resource "cloudflare_zero_trust_gateway_policy" "network_catch_all" {
name = "Catch-all block policy"
enabled = true
account_id = var . cloudflare_account_id
description = "Managed by Terraform - Block access to private network."
precedence = 14002
action = "block"
filters = [ "l4" ]
traffic = "net.dst.ip in ${ "$" }${ cloudflare_zero_trust_list . private_IPs . id } or any(net.sni.domains[*] in ${ "$" }${ cloudflare_zero_trust_list . private_domains . id } )"
}
ネットワークポリシーは 上から順 に評価されます。アプリケーション向けに明示したポリシーにユーザーが一致しない場合、そのユーザーはブロックされます。
複数ポリシーの相互作用については、適用順序 を参照してください。
Note
テスト中はデフォルト拒否モデルの採用は推奨しません。代わりに、アプリケーション向けの明示的なポリシーを作成し、ログを監視 して、ポリシーが想定どおり動いているかを確認します。ログにポリシーが現れない場合は、ポリシーを調整し、トラフィックにどのような情報(アイデンティティグループ、デバイスポスチャの値など)が付いているかを確認してください。