XC WAF
※本資料の画面表示や名称は資料作成時点の画面表示を利用しております。アップデート等より表示が若干異なる場合がございます。
XC で WAF を利用する方法や、各種設定について紹介します
マニュアルは以下のページを参照してください
1. XC WAF について
XC WAFは、以下の特徴を備えております
クラウドを含めたあらゆる環境に拡張、展開が可能
F5 WAFで実装されているシグネチャを適応
F5 Labが収集した実攻撃情報をもとに作成した高精度シグネチャ(Threat campaings)を無償バンドル
機械学習による誤検知抑制機能を実装
シグネチャ検出以外の各種回避テクニックの検出にも対応
Botシグネチャを標準実装。BotをGood/Suspicious/Maliciousに自動的に分類
ユーザの異常な行動を分析、特定し、悪意のある攻撃をブロック
XC WAAPはこれらの高度なセキュリティをアプリケーションの迅速な展開に合わせて自由にご利用いただける環境を実現します
2. App Firewall の設定
1. App Firewall の設定項目
XC では、App Firewall でWAFのセキュリティポリシーを管理することが可能です。
App Firewall で表示される主要な項目について説明します。実際の画面は次の新規作成の手順でご確認ください
- Enforcement Mode App:
Firewallで検知する脅威に対し、通信を遮断する(Blocking)か、遮断せず検知をする(Monitoring)を指定します
- Security Policy:
脅威に対する制御方法を指定します。以下の項目に関する制御を行います
Signature Attack Type
攻撃手法を指定可能です(Command Execution等)
Signature Selection By Accuracdy
Signatureの検知に対する精度を指定します
Automatic Attack Signatures Tuning
Signatureの自動チューニングの利用有無を指定します
Threat Campaings
F5が提供するThreat Campaings機能の利用有無を指定します
Violations
どのような通信に対し違反行為を制御するか指定します
- Signature Based Bot Detection:
Botの通信に対しどのように検知、制御するか指定します
- Allowed Response Status Codes:
許可するHTTPレスポンスコードを指定します
- Mask Sensitive Parameters in Logs:
ログ上で情報を秘匿化(Mask)するパラメータを指定します
- Blocking Response Page:
App Firewallがブロックした際に応答するブロックページを指定します
2. App Firewall の作成
以下のメニューより、新規にセキュリティポリシーを作成します
画面左側 Security欄の App Firewall を開き、画面上部 Add App Firewall をクリックします
設定内容は以下の通りです。表に示したパラメター以外の項目についても Custom を選択しておりますが、こちらは設定内容を表示する目的であり表示された各種詳細なパラメータの変更は行っておりません
入力パラメータ
Name
demo-app-fw
Enforcement Mode
Blocking
Allowed Response Status Code
Custom
List of Response code
200
Mask Sensitive Parameters in Logs
Custom
Configuration
Add Itemをクリックし、Query Parameter / mypass を指定Blocking Response Page
Custom
Custom Blocking Page Body
Request Rejected の後ろに
Custom Pageを追加
3. HTTP Load Balancer で App Firewall Policy の指定
作成済みのHTTP Load Balancerに作成した App Firewall Policyを割り当てます HTTP Load Balancer の設定手順は こちら を参照ください
画面左側 Manage欄の Load Balancers 、 HTTP Load Balancers を開き、対象のLoad Balancerを表示し画面右側に遷移します。
すでに作成済みのオブジェクトを変更する場合、対象のオブジェクト一番右側 ‥ から、 Manage Configuration をクリックします
設定の結果が一覧で表示されます。画面右上 Edit Configuration から設定の変更します。
Security COnfiguration 欄の Select Web Application Firewall (WAF) Config で App Firewall を選択し、
作成したApp Firewallのポリシーを選択してください。
2. 動作確認
Curlコマンドを使って各リクエストを送信し、その結果を確認します。リクエストを送信してから、ログの反映には1~2分ほどかかる場合があります。
注釈
Curlコマンドを使用する環境でhostsファイルの変更が難しい場合、--resolve オプションを指定し、リクエストの送信が可能です
各リクエストのログは以下の手順で参照することが可能です
1. 正常動作
Curlコマンドで https://echoapp.f5demo.net へリクエストを送信し、応答が正常であることを確認します
1$ curl -k -v https://echoapp.f5demo.net
2
3** 省略 **
4
5> GET / HTTP/2
6> Host: echoapp.f5demo.net
7> User-Agent: curl/7.58.0
8> Accept: */*
9
10** 省略 **
11
12< HTTP/2 200
13< content-type: application/json
14< content-length: 735
15
16{"request":{"headers":[["host","app1.test10demo.xyz"],["user-agent","curl/7.58.0"],["accept","*/*"],["x-forwarded-for","18.178.83.1"],["x-forwarded-proto","https"],["x-envoy-external-address","18.178.83.1"],["x-request-id","91097bfc-7f80-487f-a028-014f9fab330e"],["content-length","0"]],"status":0,"httpversion":"1.1","method":"GET","scheme":"https","uri":"/","requestText":"","fullPath":"/"},"network":{"clientPort":"51117","clientAddress":"103.135.56.116","serverAddress":"172.21.0.2","serverPort":"443"},"ssl":{"isHttps":true,"sslProtocol":"TLSv1.2","sslCipher":"ECDHE-ECDSA-AES128-GCM-SHA256"},"session":{"requestId":"ccab5c27dd0fea280c42d4e447eaee54","connection":"20","connectionNumber":"1"},"environment":{"hostname":"echoapp"}}u
Response Code 200 が応答され、正しくコンテンツが表示されていることが確認できます。
このリクエストの結果は以下の通りです
Security Event 画面の結果
1{
2 "app_type": "",
3 "signatures": {},
4 "req_id": "91097bfc-7f80-487f-a028-014f9fab330e",
5 "hostname": "master-0",
6 "bot_verification_failed": false,
7 "original_authority": "",
8 "rtt_upstream_seconds": "",
9 "src_instance": "JP",
10 "req_headers": "{\"Accept\":\"*/*\",\"Host\":\"echoapp.f5demo.net\",\"Method\":\"GET\",\"Path\":\"/\",\"Scheme\":\"https\",\"User-Agent\":\"curl/7.58.0\",\"X-Envoy-External-Address\":\"18.178.83.1\",\"X-Forwarded-For\":\"18.178.83.1\",\"X-Forwarded-Proto\":\"https\",\"X-Request-Id\":\"91097bfc-7f80-487f-a028-014f9fab330e\"}",
11 "tenant": "f5-apac-ent-uppdoshj",
12 "app": "obelix",
13 "policy_hits": {
14 "policy_hits": {}
15 },
16 "method": "GET",
17 "threat_campaigns": {},
18 "violations": {},
19 "source_type": "kafka",
20 "dst_instance": "",
21 "x_forwarded_for": "18.178.83.1",
22 "duration_with_no_data_tx_delay": "",
23 "waf_rule_tags": "{}",
24 "rsp_code_class": "",
25 "waf_mode": "allow",
26 "time_to_last_upstream_rx_byte": 0,
27 "scheme": "",
28 "city": "Tokyo",
29 "dst_site": "",
30 "latitude": "35.689300",
31 "messageid": "c102667e-dea5-4551-b495-71bf4217a9f6",
32 "no_active_detections": false,
33 "tls_version": "",
34 "duration_with_data_tx_delay": "",
35 "stream": "svcfw",
36 "violation_rating": "0",
37 "req_size": "208",
38 "waf_rules_hit": "[]",
39 "tls_fingerprint": "456523fc94726331a4d5a2e1d40b2cd7",
40 "bot_name": "curl",
41 "time_to_first_upstream_rx_byte": 0,
42 "sni": "echoapp.f5demo.net",
43 "response_flags": "",
44 "site": "ty8-tky",
45 "@timestamp": "2022-02-24T15:38:01.123Z",
46 "calculated_action": "report",
47 "req_params": "",
48 "sample_rate": "",
49 "original_headers": [
50 "method",
51 "path",
52 "scheme",
53 "host",
54 "user-agent",
55 "accept",
56 "x-forwarded-for",
57 "x-forwarded-proto",
58 "x-envoy-external-address",
59 "x-request-id"
60 ],
61 "dst_port": "0",
62 "req_path": "/",
63 "asn": "AMAZON-02(16509)",
64 "node_id": "",
65 "proxy_type": "",
66 "is_truncated_field": false,
67 "country": "JP",
68 "kubernetes": {},
69 "browser_type": "curl",
70 "device_type": "Other",
71 "bot_classification": "suspicious",
72 "vhost_id": "6c0bb878-7ecb-4b20-815e-1f3521b12ff4",
73 "detections": {},
74 "longitude": "139.689900",
75 "rtt_downstream_seconds": "",
76 "http_version": "HTTP/1.1",
77 "time_to_last_downstream_tx_byte": 0,
78 "waf_rule_hit_count": "",
79 "num_rules_hit": "",
80 "vh_type": "",
81 "rsp_size": "921",
82 "api_endpoint": "{}",
83 "authority": "echoapp.f5demo.net",
84 "region": "13",
85 "time_to_first_downstream_tx_byte": 0,
86 "rsp_code_details": "",
87 "dst": "",
88 "connection_state": "",
89 "dst_ip": "72.19.3.189",
90 "is_new_dcid": true,
91 "network": "18.176.0.0",
92 "src_site": "ty8-tky",
93 "src_ip": "18.178.83.1",
94 "tls_cipher_suite": "",
95 "bot_type": "HTTP Library",
96 "original_path": "",
97 "message_key": null,
98 "user_agent": "curl/7.58.0",
99 "severity": "info",
100 "cluster_name": "ty8-tky-int-ves-io",
101 "headers": {},
102 "types": "input:string",
103 "src": "N:public",
104 "rsp_code": "200",
105 "time_to_first_upstream_tx_byte": 0,
106 "attack_types": {},
107 "src_port": "40472",
108 "dcid": "1645717081123-777275537",
109 "req_body": "",
110 "time_to_last_upstream_tx_byte": 0,
111 "namespace": "h-matsumoto",
112 "time": "2022-02-24T15:38:01.123Z",
113 "waf_instance_id": "",
114 "sec_event_type": "waf_sec_event",
115 "user": "IP-18.178.83.1",
116 "vh_name": "ves-io-http-loadbalancer-demo-echo-lb"
117}
4行目
req_idはそのログメッセージを特定するためのIDです。本サンプルリクエストでは通信がブロックされていないため、通信の応答として情報は表示されませんが、通信がブロックされた場合にはsupport IDとしてこの情報が表示されます25行目
waf_modeが許可(Allow)、46行目calculated_actionが 通知(report) であると確認できます69行目
browser_typeでcurlと判定され、71行目bot_classificationでsuspiciousであると確認できます。これはCurlコマンドであることをBot Signatureの機能により判定しておりますが、suspiciousの設定に従ってReportと処理し、拒否は行っておりません
この他にも様々な情報が表示されており、Security Eventから通信の詳細について把握することが可能となっています
2. Signatureによる攻撃の検知
Curlコマンドで https://echoapp.f5demo.net?a=<script> へリクエストを送信し、通信が ブロック されることを確認します
1$ curl -k -v "https://echoapp.f5demo.net?a=<script>"
2
3** 省略 **
4
5> GET /?a=<script> HTTP/2
6> Host: echoapp.f5demo.net
7> User-Agent: curl/7.58.0
8> Accept: */*
9
10** 省略 **
11
12< HTTP/2 200
13< content-length: 278
14< content-type: text/html; charset=UTF-8
15
16** 省略 **
17
18* Connection #0 to host echoapp.f5demo.net left intact
19<html><head><title>Request Rejected Custom Page</title></head><body>The requested URL was rejected. Please consult with your administrator.<br/><br/>Your support ID is: 4813018f-1d4b-41e4-9284-144aadbbf578<br/><br/><a href="javascript:history.back()">
<script> )が含まれているため、ポリシーでブロックされていることがわかります。Request Rejected Custom Page となっており、Custom Pageで指定した内容が反映されていることが確認できます。4813018f-1d4b-41e4-9284-144aadbbf578 という値が記載されていますそれではログを確認しましょう
Security Event 画面の結果
1{
2 "app_type": "",
3 "signatures": [
4 {
5 "attack_type": "ATTACK_TYPE_CROSS_SITE_SCRIPTING",
6 "matching_info": "Matched 7 characters on offset 24 against value: 'method: GET\r\npath: /?a=<script>\r\nscheme: https\r\nhost: echoapp.f'. ",
7 "context": "header (path)",
8 "name": "XSS script tag end (Headers)",
9 "accuracy": "high_accuracy",
10 "id": "200000091",
11 "state": "Enabled",
12 "id_name": "200000091, XSS script tag end (Headers)"
13 },
14 {
15 "attack_type": "ATTACK_TYPE_CROSS_SITE_SCRIPTING",
16 "matching_info": "Matched 7 characters on offset 23 against value: 'method: GET\r\npath: /?a=<script>\r\nscheme: https\r\nhost: echoapp.f'. ",
17 "context": "header (path)",
18 "name": "XSS script tag (Headers)",
19 "accuracy": "high_accuracy",
20 "id": "200000097",
21 "state": "Enabled",
22 "id_name": "200000097, XSS script tag (Headers)"
23 },
24 {
25 "attack_type": "ATTACK_TYPE_CROSS_SITE_SCRIPTING",
26 "matching_info": "Matched 7 characters on offset 2 against value: 'a=<script>'. ",
27 "context": "parameter (a)",
28 "name": "XSS script tag (Parameter)",
29 "accuracy": "high_accuracy",
30 "id": "200000098",
31 "state": "Enabled",
32 "id_name": "200000098, XSS script tag (Parameter)"
33 },
34 {
35 "attack_type": "ATTACK_TYPE_CROSS_SITE_SCRIPTING",
36 "matching_info": "Matched 7 characters on offset 3 against value: 'a=<script>'. ",
37 "context": "parameter (a)",
38 "name": "XSS script tag end (Parameter) (2)",
39 "accuracy": "high_accuracy",
40 "id": "200001475",
41 "state": "Enabled",
42 "id_name": "200001475, XSS script tag end (Parameter) (2)"
43 }
44 ],
45 "req_id": "4813018f-1d4b-41e4-9284-144aadbbf578",
46 "hostname": "master-2",
47 "bot_verification_failed": false,
48 "original_authority": "",
49 "rtt_upstream_seconds": "",
50 "src_instance": "JP",
51 "req_headers": "{\"Accept\":\"*/*\",\"Host\":\"echoapp.f5demo.net\",\"Method\":\"GET\",\"Path\":\"/?a=\\u003cscript\\u003e\",\"Scheme\":\"https\",\"User-Agent\":\"curl/7.58.0\",\"X-Envoy-External-Address\":\"18.178.83.1\",\"X-Forwarded-For\":\"18.178.83.1\",\"X-Forwarded-Proto\":\"https\",\"X-Request-Id\":\"4813018f-1d4b-41e4-9284-144aadbbf578\"}",
52 "tenant": "f5-apac-ent-uppdoshj",
53 "app": "obelix",
54 "policy_hits": {
55 "policy_hits": {}
56 },
57 "method": "GET",
58 "threat_campaigns": {},
59 "violations": {},
60 "source_type": "kafka",
61 "dst_instance": "",
62 "x_forwarded_for": "18.178.83.1",
63 "duration_with_no_data_tx_delay": "",
64 "waf_rule_tags": "{}",
65 "rsp_code_class": "2xx",
66 "waf_mode": "block",
67 "time_to_last_upstream_rx_byte": 0,
68 "scheme": "",
69 "city": "Tokyo",
70 "dst_site": "",
71 "latitude": "35.689300",
72 "messageid": "c102667e-dea5-4551-b495-71bf4217a9f6",
73 "no_active_detections": false,
74 "tls_version": "",
75 "duration_with_data_tx_delay": "",
76 "stream": "svcfw",
77 "violation_rating": "5",
78 "req_size": "219",
79 "waf_rules_hit": "[]",
80 "tls_fingerprint": "456523fc94726331a4d5a2e1d40b2cd7",
81 "bot_name": "curl",
82 "time_to_first_upstream_rx_byte": 0,
83 "sni": "echoapp.f5demo.net",
84 "response_flags": "",
85 "site": "ty8-tky",
86 "@timestamp": "2022-02-24T15:40:47.470Z",
87 "calculated_action": "block",
88 "req_params": "a=<script>",
89 "sample_rate": "",
90 "original_headers": [
91 "method",
92 "path",
93 "scheme",
94 "host",
95 "user-agent",
96 "accept",
97 "x-forwarded-for",
98 "x-forwarded-proto",
99 "x-envoy-external-address",
100 "x-request-id"
101 ],
102 "dst_port": "0",
103 "req_path": "/",
104 "asn": "AMAZON-02(16509)",
105 "node_id": "",
106 "proxy_type": "",
107 "is_truncated_field": false,
108 "country": "JP",
109 "kubernetes": {},
110 "browser_type": "curl",
111 "device_type": "Other",
112 "bot_classification": "suspicious",
113 "vhost_id": "6c0bb878-7ecb-4b20-815e-1f3521b12ff4",
114 "detections": {},
115 "longitude": "139.689900",
116 "rtt_downstream_seconds": "",
117 "http_version": "HTTP/1.1",
118 "time_to_last_downstream_tx_byte": 0,
119 "waf_rule_hit_count": "",
120 "num_rules_hit": "",
121 "vh_type": "",
122 "rsp_size": "0",
123 "api_endpoint": "{}",
124 "authority": "echoapp.f5demo.net",
125 "region": "13",
126 "time_to_first_downstream_tx_byte": 0,
127 "rsp_code_details": "",
128 "dst": "",
129 "connection_state": "",
130 "dst_ip": "72.19.3.189",
131 "is_new_dcid": true,
132 "network": "18.176.0.0",
133 "src_site": "ty8-tky",
134 "src_ip": "18.178.83.1",
135 "tls_cipher_suite": "",
136 "bot_type": "HTTP Library",
137 "original_path": "",
138 "message_key": null,
139 "user_agent": "curl/7.58.0",
140 "severity": "info",
141 "cluster_name": "ty8-tky-int-ves-io",
142 "headers": {},
143 "types": "input:string",
144 "src": "N:public",
145 "rsp_code": "200",
146 "time_to_first_upstream_tx_byte": 0,
147 "attack_types": [
148 {
149 "name": "ATTACK_TYPE_CROSS_SITE_SCRIPTING"
150 }
151 ],
152 "src_port": "40478",
153 "dcid": "1645717247469-890683506",
154 "req_body": "",
155 "time_to_last_upstream_tx_byte": 0,
156 "namespace": "h-matsumoto",
157 "time": "2022-02-24T15:40:47.470Z",
158 "waf_instance_id": "",
159 "sec_event_type": "waf_sec_event",
160 "user": "IP-18.178.83.1",
161 "vh_name": "ves-io-http-loadbalancer-demo-echo-lb"
162}
66行目
waf_modeが拒否(Block)、87行目calculated_actionが 拒否(block) となり通信が拒否されていることが確認できます45行目
req_idは ブロックページ に表示されたSupport IDの値4813018f-1d4b-41e4-9284-144aadbbf578であることが確認できます3行目 から 44行目に表示されている内容が該当するSignatureを示します。内容を確認すると Cross Site Scripting(XSS)の攻撃であると検知していることが確認できます
77行目
violation_ratingが5となっており、高い値となっております147行目 から 151行目
attack_typesでATTACK_TYPE_CROSS_SITE_SCRIPTINGと表示されており、XSSと検知されていることが確認できます
このように、ブロックページに表示されたSupport IDから対象のログを特定し、どのような理由により通信がブロックされたか確認することが可能です
3. Sensitive Dataのマスキング
Curlコマンドで https://echoapp.f5demo.net?mypass=secret へリクエストを送信し、通信が ブロック されることを確認します
1$ curl -k -v https://echoapp.f5demo.net?mypass=secret
2
3** 省略 **
4
5> GET /?mypass=secret HTTP/2
6> Host: echoapp.f5demo.net
7> User-Agent: curl/7.58.0
8> Accept: */*
9
10** 省略 **
11
12< HTTP/2 200
13< content-type: application/json
14< content-length: 775
15
16** 省略 **
17
18{"request":{"headers":[["host","app2.test10demo.xyz"],["user-agent","curl/7.58.0"],["accept","*/*"],["x-forwarded-for","18.178.83.1"],["x-forwarded-proto","https"],["x-envoy-external-address","18.178.83.1"],["x-request-id","22032402-0f75-412e-a1ac-c8c2afdb6ba7"],["content-length","0"]],"status":0,"httpversion":"1.1","method":"GET","scheme":"https","uri":"/","args":{"mypass":"secret"},"requestText":"","fullPath":"/?mypass=secret"},"network":{"clientPort":"33274","clientAddress":"103.135.56.97","serverAddress":"172.21.0.2","serverPort":"443"},"ssl":{"isHttps":true,"sslProtocol":"TLSv1.2","sslCipher":"ECDHE-ECDSA-AES128-GCM-SHA256"},"session":{"requestId":"abea7d90b1fb3ae939ccde985b149e05","connection":"21","connectionNumber":"1"},"environment":{"hostname":"echoapp"}}
この例では、通信はブロックされず正しく応答されていることが確認できます。
ポリシーではsensitive-parameterを指定しており、 mypass がURL Parameterに含まれる場合、その値をLOG上でマスクするよう設定しました。
それではログを確認しましょう
Security Event 画面の結果
1{
2 "app_type": "",
3 "signatures": {},
4 "req_id": "22032402-0f75-412e-a1ac-c8c2afdb6ba7",
5 "hostname": "master-2",
6 "bot_verification_failed": false,
7 "original_authority": "",
8 "rtt_upstream_seconds": "",
9 "src_instance": "JP",
10 "req_headers": "{\"Accept\":\"*/*\",\"Host\":\"echoapp.f5demo.net\",\"Method\":\"GET\",\"Path\":\"/?mypass=******\",\"Scheme\":\"https\",\"User-Agent\":\"curl/7.58.0\",\"X-Envoy-External-Address\":\"18.178.83.1\",\"X-Forwarded-For\":\"18.178.83.1\",\"X-Forwarded-Proto\":\"https\",\"X-Request-Id\":\"22032402-0f75-412e-a1ac-c8c2afdb6ba7\"}",
11 "tenant": "f5-apac-ent-uppdoshj",
12 "app": "obelix",
13 "policy_hits": {
14 "policy_hits": {}
15 },
16 "method": "GET",
17 "threat_campaigns": {},
18 "violations": {},
19 "source_type": "kafka",
20 "dst_instance": "",
21 "x_forwarded_for": "18.178.83.1",
22 "duration_with_no_data_tx_delay": "",
23 "waf_rule_tags": "{}",
24 "rsp_code_class": "",
25 "waf_mode": "allow",
26 "time_to_last_upstream_rx_byte": 0,
27 "scheme": "",
28 "city": "Tokyo",
29 "dst_site": "",
30 "latitude": "35.689300",
31 "messageid": "c102667e-dea5-4551-b495-71bf4217a9f6",
32 "no_active_detections": false,
33 "tls_version": "",
34 "duration_with_data_tx_delay": "",
35 "stream": "svcfw",
36 "violation_rating": "0",
37 "req_size": "222",
38 "waf_rules_hit": "[]",
39 "tls_fingerprint": "456523fc94726331a4d5a2e1d40b2cd7",
40 "bot_name": "curl",
41 "time_to_first_upstream_rx_byte": 0,
42 "sni": "echoapp.f5demo.net",
43 "response_flags": "",
44 "site": "ty8-tky",
45 "@timestamp": "2022-02-24T15:41:43.531Z",
46 "calculated_action": "report",
47 "req_params": "mypass=******",
48 "sample_rate": "",
49 "original_headers": [
50 "method",
51 "path",
52 "scheme",
53 "host",
54 "user-agent",
55 "accept",
56 "x-forwarded-for",
57 "x-forwarded-proto",
58 "x-envoy-external-address",
59 "x-request-id"
60 ],
61 "dst_port": "0",
62 "req_path": "/",
63 "asn": "AMAZON-02(16509)",
64 "node_id": "",
65 "proxy_type": "",
66 "is_truncated_field": false,
67 "country": "JP",
68 "kubernetes": {},
69 "browser_type": "curl",
70 "device_type": "Other",
71 "bot_classification": "suspicious",
72 "vhost_id": "6c0bb878-7ecb-4b20-815e-1f3521b12ff4",
73 "detections": {},
74 "longitude": "139.689900",
75 "rtt_downstream_seconds": "",
76 "http_version": "HTTP/1.1",
77 "time_to_last_downstream_tx_byte": 0,
78 "waf_rule_hit_count": "",
79 "num_rules_hit": "",
80 "vh_type": "",
81 "rsp_size": "961",
82 "api_endpoint": "{}",
83 "authority": "echoapp.f5demo.net",
84 "region": "13",
85 "time_to_first_downstream_tx_byte": 0,
86 "rsp_code_details": "",
87 "dst": "",
88 "connection_state": "",
89 "dst_ip": "72.19.3.189",
90 "is_new_dcid": true,
91 "network": "18.176.0.0",
92 "src_site": "ty8-tky",
93 "src_ip": "18.178.83.1",
94 "tls_cipher_suite": "",
95 "bot_type": "HTTP Library",
96 "original_path": "",
97 "message_key": null,
98 "user_agent": "curl/7.58.0",
99 "severity": "info",
100 "cluster_name": "ty8-tky-int-ves-io",
101 "headers": {},
102 "types": "input:string",
103 "src": "N:public",
104 "rsp_code": "200",
105 "time_to_first_upstream_tx_byte": 0,
106 "attack_types": {},
107 "src_port": "40480",
108 "dcid": "1645717303530-100012152",
109 "req_body": "",
110 "time_to_last_upstream_tx_byte": 0,
111 "namespace": "h-matsumoto",
112 "time": "2022-02-24T15:41:43.531Z",
113 "waf_instance_id": "",
114 "sec_event_type": "waf_sec_event",
115 "user": "IP-18.178.83.1",
116 "vh_name": "ves-io-http-loadbalancer-demo-echo-lb"
117}
4行目
req_idはそのログメッセージを特定するためのIDです。本サンプルリクエストでは通信がブロックされていないため、通信の応答として情報は表示されませんが、通信がブロックされた場合にはsupport IDとしてこの情報が表示されます25行目
waf_modeが許可(Allow)、46行目calculated_actionが 通知(report) であると確認できます47行目 でリクエストのQuery Parameterが表示されており、
req_paramsの値がmypass=******となっています。これはMask Sensitive Parametersの設定により指定したパラメータが Query Parameter に含まれるため、その値を Sensitive Data として扱い、ログ上でMaskしています。さらに、10行目のreq_headersにもこの情報が含まれておりMaskされていることが確認できます
4. Originから503が応答される場合の動作
Curlコマンドで https://echoapp.f5demo.net/503 へリクエストを送信し、通信が ブロック されることを確認します
1$ curl -k -v https://echoapp.f5demo.net/503
2
3** 省略 **
4
5> GET /503 HTTP/2
6> Host: echoapp.f5demo.net
7> User-Agent: curl/7.58.0
8> Accept: */*
9
10** 省略 **
11
12< HTTP/2 200
13< content-type: text/html; charset=UTF-8
14< content-length: 278
15
16** 省略 **
17
18<html><head><title>Request Rejected Custom Page</title></head><body>The requested URL was rejected. Please consult with your administrator.<br/><br/>Your support ID is: bf5e1262-fe22-46f6-9661-664c46d6ca16<br/><br/><a href="javascript:history.back()">[Go Back]</a></body></html>
サンプルアプリケーションでは、 /503 にアクセスすると、 HTTP Response Code 503 が応答される動作となります。
応答の結果を確認すると通信がブロックされています。
それではログを確認しましょう
Security Event 画面の結果
1{
2 "app_type": "",
3 "signatures": {},
4 "req_id": "bf5e1262-fe22-46f6-9661-664c46d6ca16",
5 "hostname": "master-1",
6 "bot_verification_failed": false,
7 "original_authority": "",
8 "rtt_upstream_seconds": "",
9 "src_instance": "JP",
10 "req_headers": "{\"Accept\":\"*/*\",\"Host\":\"echoapp.f5demo.net\",\"Method\":\"GET\",\"Path\":\"/503\",\"Scheme\":\"https\",\"User-Agent\":\"curl/7.58.0\",\"X-Envoy-External-Address\":\"18.178.83.1\",\"X-Forwarded-For\":\"18.178.83.1\",\"X-Forwarded-Proto\":\"https\",\"X-Request-Id\":\"bf5e1262-fe22-46f6-9661-664c46d6ca16\"}",
11 "tenant": "f5-apac-ent-uppdoshj",
12 "app": "obelix",
13 "policy_hits": {
14 "policy_hits": {}
15 },
16 "method": "GET",
17 "threat_campaigns": {},
18 "violations": {},
19 "source_type": "kafka",
20 "dst_instance": "",
21 "x_forwarded_for": "18.178.83.1",
22 "duration_with_no_data_tx_delay": "",
23 "waf_rule_tags": "{}",
24 "rsp_code_class": "",
25 "waf_mode": "allow",
26 "time_to_last_upstream_rx_byte": 0,
27 "scheme": "",
28 "city": "Tokyo",
29 "dst_site": "",
30 "latitude": "35.689300",
31 "messageid": "c102667e-dea5-4551-b495-71bf4217a9f6",
32 "no_active_detections": false,
33 "tls_version": "",
34 "duration_with_data_tx_delay": "",
35 "stream": "svcfw",
36 "violation_rating": "0",
37 "req_size": "211",
38 "waf_rules_hit": "[]",
39 "tls_fingerprint": "456523fc94726331a4d5a2e1d40b2cd7",
40 "bot_name": "curl",
41 "time_to_first_upstream_rx_byte": 0,
42 "sni": "echoapp.f5demo.net",
43 "response_flags": "",
44 "site": "ty8-tky",
45 "@timestamp": "2022-02-24T15:44:48.969Z",
46 "calculated_action": "report",
47 "req_params": "",
48 "sample_rate": "",
49 "original_headers": [
50 "method",
51 "path",
52 "scheme",
53 "host",
54 "user-agent",
55 "accept",
56 "x-forwarded-for",
57 "x-forwarded-proto",
58 "x-envoy-external-address",
59 "x-request-id"
60 ],
61 "dst_port": "0",
62 "req_path": "/503",
63 "asn": "AMAZON-02(16509)",
64 "node_id": "",
65 "proxy_type": "",
66 "is_truncated_field": false,
67 "country": "JP",
68 "kubernetes": {},
69 "browser_type": "curl",
70 "device_type": "Other",
71 "bot_classification": "suspicious",
72 "vhost_id": "6c0bb878-7ecb-4b20-815e-1f3521b12ff4",
73 "detections": {},
74 "longitude": "139.689900",
75 "rtt_downstream_seconds": "",
76 "http_version": "HTTP/1.1",
77 "time_to_last_downstream_tx_byte": 0,
78 "waf_rule_hit_count": "",
79 "num_rules_hit": "",
80 "vh_type": "",
81 "rsp_size": "198",
82 "api_endpoint": "{}",
83 "authority": "echoapp.f5demo.net",
84 "region": "13",
85 "time_to_first_downstream_tx_byte": 0,
86 "rsp_code_details": "",
87 "dst": "",
88 "connection_state": "",
89 "dst_ip": "72.19.3.189",
90 "is_new_dcid": true,
91 "network": "18.176.0.0",
92 "src_site": "ty8-tky",
93 "src_ip": "18.178.83.1",
94 "tls_cipher_suite": "",
95 "bot_type": "HTTP Library",
96 "original_path": "",
97 "message_key": null,
98 "user_agent": "curl/7.58.0",
99 "severity": "info",
100 "cluster_name": "ty8-tky-int-ves-io",
101 "headers": {},
102 "types": "input:string",
103 "src": "N:public",
104 "rsp_code": "200",
105 "time_to_first_upstream_tx_byte": 0,
106 "attack_types": {},
107 "src_port": "40482",
108 "dcid": "1645717488969-591222023",
109 "req_body": "",
110 "time_to_last_upstream_tx_byte": 0,
111 "namespace": "h-matsumoto",
112 "time": "2022-02-24T15:44:48.969Z",
113 "waf_instance_id": "",
114 "sec_event_type": "waf_sec_event",
115 "user": "IP-18.178.83.1",
116 "vh_name": "ves-io-http-loadbalancer-demo-echo-lb"
117}
4行目
req_idは ブロックページ に表示されたSupport IDの値bf5e1262-fe22-46f6-9661-664c46d6ca16であることが確認できますしかし、25行目
waf_modeが許可(Allow)、46行目calculated_actionが 通知(report) となり、拒否となっていないことが確認できます。この点がWAF Eventsのログと一致しません
もう一つログを確認します。対象のWAF Eventsと合わせてL7 Eventsが記録されているかとおもます。そちらを確認してください
1{
2 "country": "JP",
3 "kubernetes": {},
4 "l7_policy_rules_hit": "",
5 "app_type": "h-matsumoto",
6 "browser_type": "curl",
7 "device_type": "Other",
8 "req_id": "bf5e1262-fe22-46f6-9661-664c46d6ca16",
9 "waf_action": "block",
10 "hostname": "master-1",
11 "original_authority": "app2.test10demo.xyz",
12 "rtt_upstream_seconds": "0.014000",
13 "src_instance": "JP",
14 "req_headers": "null",
15 "tenant": "f5-apac-ent-uppdoshj",
16 "longitude": "139.689900",
17 "app": "obelix",
18 "rtt_downstream_seconds": "0.007000",
19 "policy_hits": {
20 "policy_hits": {}
21 },
22 "method": "GET",
23 "time_to_last_downstream_tx_byte": 0.054213402,
24 "waf_rule_hit_count": "0",
25 "source_type": "kafka",
26 "dst_instance": "18.178.83.1",
27 "vh_type": "HTTP-LOAD-BALANCER",
28 "x_forwarded_for": "18.178.83.1",
29 "duration_with_no_data_tx_delay": "0.005670",
30 "rsp_size": "802",
31 "api_endpoint": "{\"collapsed_url\":\"UNKNOWN\",\"method\":\"GET\"}",
32 "authority": "app2.test10demo.xyz",
33 "app_firewall_info": {
34 "name": "h-matsumoto:demo-app-fw",
35 "action": "block",
36 "description": "Disallowed response code (503)"
37 },
38 "region": "13",
39 "time_to_first_downstream_tx_byte": 0.054180343,
40 "rsp_code_class": "2xx",
41 "rsp_code_details": "via_upstream",
42 "time_to_last_upstream_rx_byte": 0.053070185,
43 "dst": "S:app2.test10demo.xyz",
44 "scheme": "https",
45 "city": "Tokyo",
46 "dst_site": "ty8-tky",
47 "latitude": "35.689300",
48 "messageid": "b5315f10-3181-4f8b-9c1e-3631817e22d6",
49 "tls_version": "TLSv1_3",
50 "connection_state": "CLOSED",
51 "dst_ip": "NOT-APPLICABLE",
52 "network": "18.176.0.0",
53 "src_site": "ty8-tky",
54 "terminated_time": "2022-02-24T15:44:48.970908229Z",
55 "duration_with_data_tx_delay": "0.005703",
56 "src_ip": "18.178.83.1",
57 "connected_time": "2022-02-24T15:44:48.91520768Z",
58 "stream": "svcfw",
59 "tls_cipher_suite": "TLSv1_3/TLS_AES_256_GCM_SHA384",
60 "original_path": "/503",
61 "message_key": null,
62 "req_size": "221",
63 "user_agent": "curl/7.58.0",
64 "severity": "info",
65 "cluster_name": "ty8-tky-int-ves-io",
66 "headers": {},
67 "tls_fingerprint": "456523fc94726331a4d5a2e1d40b2cd7",
68 "types": "input:string",
69 "src": "N:public",
70 "time_to_first_upstream_rx_byte": 0.0528934,
71 "rsp_code": "200",
72 "time_to_first_upstream_tx_byte": 0.048510615,
73 "sni": "echoapp.f5demo.net",
74 "response_flags": "",
75 "src_port": "40482",
76 "site": "ty8-tky",
77 "@timestamp": "2022-02-24T15:44:49.614Z",
78 "req_body": "",
79 "req_params": "",
80 "sample_rate": "1.000000",
81 "time_to_last_upstream_tx_byte": 0.048521521,
82 "dst_port": "443",
83 "namespace": "h-matsumoto",
84 "req_path": "/503",
85 "time": "2022-02-24T15:44:49.614Z",
86 "asn": "AMAZON-02(16509)",
87 "sec_event_type": "l7_policy_sec_event",
88 "user": "IP-18.178.83.1",
89 "vh_name": "ves-io-http-loadbalancer-demo-echo-lb",
90 "node_id": "envoy_1",
91 "proxy_type": "http"
92}
8行目
req_idは ブロックページ に表示されたSupport IDの値bf5e1262-fe22-46f6-9661-664c46d6ca16であることが確認できます9行目
waf_actionが拒否(block) となっていることが確認できます33行目 から 37行目
app_firewall_infoのactionとdescriptionを見ると、許可されないレスポンスコード( Disallowed response code (503) ) であるため拒否(block)されたことがわかります
このようにSecurity Eventsに表示されるログから通信がどのように制御されたものであるか確認することができます。
5. HTTP Protocol 違反の検知
プロトコル(Protocol)は予め通信の内容や仕組みが決まったものであり、通信はそれに則って行われます。 正常なクライアント・サーバはそのプロトコルの通りに動作しますが、攻撃者は本来のプロトコルの仕様に対して矛盾となる通信を行うことにより、アプリケーションの想定外な動作を引き起こす場合があります。
App Firewallでは Violation という仕組みにより、SignatureやBOTとはまた異なる、各種プロトコルの動作や悪意ある通信を検知・拒否することが可能です。
ここではシンプルな HTTP Protocol 違反を制御する動作を確認します
Curlコマンドで https://echoapp.f5demo.net/ へリクエストを送信します。ただし、Protocolとして矛盾した動作となるため、以下のような情報でリクエストを送信します。
Method |
POST |
Content-Type |
application/json |
送信データ |
data=dummy |
Content-TYpe ではJSON形式( application/json )を指定していますが、 実際のデータ の矛盾により通信が ブロック されることを確認します
1$ curl -kv https://echoapp.f5demo.net/ -H "Content-Type: application/json" -X POST -d "data=dummy"
2
3** 省略 **
4
5> POST / HTTP/2
6> Host: echoapp.f5demo.net
7> User-Agent: curl/7.58.0
8> Accept: */*
9> Content-Type: application/json
10> Content-Length: 10
11
12** 省略 **
13
14< HTTP/2 200
15< content-length: 278
16< content-type: text/html; charset=UTF-8
17
18** 省略 **
19
20<html><head><title>Request Rejected Custom Page</title></head><body>The requested URL was rejected. Please consult with your administrator.<br/><br/>Your support ID is: 5a253e51-b03a-465a-96b7-fa388298f759<br/><br/><a href="javascript:history.back()">[Go Back]</a></body></html>
応答の結果を確認すると通信がブロックされています。
それではログを確認しましょう
Security Event 画面の結果
1{
2 "app_type": "",
3 "signatures": {},
4 "req_id": "5a253e51-b03a-465a-96b7-fa388298f759",
5 "hostname": "master-2",
6 "bot_verification_failed": false,
7 "original_authority": "",
8 "rtt_upstream_seconds": "",
9 "src_instance": "JP",
10 "req_headers": "{\"Accept\":\"*/*\",\"Content-Length\":\"10\",\"Content-Type\":\"application/json\",\"Host\":\"echoapp.f5demo.net\",\"Method\":\"POST\",\"Path\":\"/\",\"Scheme\":\"https\",\"User-Agent\":\"curl/7.58.0\",\"X-Envoy-External-Address\":\"18.178.83.1\",\"X-Forwarded-For\":\"18.178.83.1\",\"X-Forwarded-Proto\":\"https\",\"X-Request-Id\":\"5a253e51-b03a-465a-96b7-fa388298f759\"}",
11 "tenant": "f5-apac-ent-uppdoshj",
12 "app": "obelix",
13 "policy_hits": {
14 "policy_hits": {}
15 },
16 "method": "POST",
17 "threat_campaigns": {},
18 "violations": [
19 {
20 "attack_type": "ATTACK_TYPE_JSON_PARSER_ATTACK",
21 "matching_info": "",
22 "context": "URL",
23 "name": "VIOL_JSON_MALFORMED",
24 "state": "Enabled"
25 }
26 ],
27 "source_type": "kafka",
28 "dst_instance": "",
29 "x_forwarded_for": "18.178.83.1",
30 "duration_with_no_data_tx_delay": "",
31 "waf_rule_tags": "{}",
32 "rsp_code_class": "2xx",
33 "waf_mode": "block",
34 "time_to_last_upstream_rx_byte": 0,
35 "scheme": "",
36 "city": "Tokyo",
37 "dst_site": "",
38 "latitude": "35.689300",
39 "messageid": "c102667e-dea5-4551-b495-71bf4217a9f6",
40 "no_active_detections": false,
41 "tls_version": "",
42 "duration_with_data_tx_delay": "",
43 "stream": "svcfw",
44 "violation_rating": "3",
45 "req_size": "263",
46 "waf_rules_hit": "[]",
47 "tls_fingerprint": "456523fc94726331a4d5a2e1d40b2cd7",
48 "bot_name": "curl",
49 "time_to_first_upstream_rx_byte": 0,
50 "sni": "echoapp.f5demo.net",
51 "response_flags": "",
52 "site": "ty8-tky",
53 "@timestamp": "2022-02-25T04:08:03.197Z",
54 "calculated_action": "block",
55 "req_params": "",
56 "sample_rate": "",
57 "original_headers": [
58 "method",
59 "path",
60 "scheme",
61 "host",
62 "user-agent",
63 "accept",
64 "content-type",
65 "content-length",
66 "x-forwarded-for",
67 "x-forwarded-proto",
68 "x-envoy-external-address",
69 "x-request-id"
70 ],
71 "dst_port": "0",
72 "req_path": "/",
73 "asn": "AMAZON-02(16509)",
74 "node_id": "",
75 "proxy_type": "",
76 "is_truncated_field": false,
77 "country": "JP",
78 "kubernetes": {},
79 "browser_type": "curl",
80 "device_type": "Other",
81 "bot_classification": "suspicious",
82 "vhost_id": "6c0bb878-7ecb-4b20-815e-1f3521b12ff4",
83 "detections": {},
84 "longitude": "139.689900",
85 "rtt_downstream_seconds": "",
86 "http_version": "HTTP/1.1",
87 "time_to_last_downstream_tx_byte": 0,
88 "waf_rule_hit_count": "",
89 "num_rules_hit": "",
90 "vh_type": "",
91 "rsp_size": "0",
92 "api_endpoint": "{}",
93 "authority": "echoapp.f5demo.net",
94 "region": "13",
95 "time_to_first_downstream_tx_byte": 0,
96 "rsp_code_details": "",
97 "dst": "",
98 "connection_state": "",
99 "dst_ip": "72.19.3.189",
100 "is_new_dcid": true,
101 "network": "18.176.0.0",
102 "src_site": "ty8-tky",
103 "src_ip": "18.178.83.1",
104 "tls_cipher_suite": "",
105 "bot_type": "HTTP Library",
106 "original_path": "",
107 "message_key": null,
108 "user_agent": "curl/7.58.0",
109 "severity": "info",
110 "cluster_name": "ty8-tky-int-ves-io",
111 "headers": {},
112 "types": "input:string",
113 "src": "N:public",
114 "rsp_code": "200",
115 "time_to_first_upstream_tx_byte": 0,
116 "attack_types": [
117 {
118 "name": "ATTACK_TYPE_JSON_PARSER_ATTACK"
119 }
120 ],
121 "src_port": "40558",
122 "dcid": "1645762083197-412728685",
123 "req_body": "",
124 "time_to_last_upstream_tx_byte": 0,
125 "namespace": "h-matsumoto",
126 "time": "2022-02-25T04:08:03.197Z",
127 "waf_instance_id": "",
128 "sec_event_type": "waf_sec_event",
129 "user": "IP-18.178.83.1",
130 "vh_name": "ves-io-http-loadbalancer-demo-echo-lb"
131}
66行目
waf_modeが拒否(block)、54行目calculated_actionが 拒否(block) となり通信が拒否されていることが確認できます4行目
req_idは ブロックページ に表示されたSupport IDの値5a253e51-b03a-465a-96b7-fa388298f759であることが確認できます18行目 から 26行目に表示されている内容が該当するViolationを示します。内容を確認すると
ATTACK_TYPE_JSON_PARSER_ATTACKであり、正しいJSONの書式でない(VIOL_JSON_MALFORMED)と確認できますまた、116行目から120行目
attack_typesでATTACK_TYPE_JSON_PARSER_ATTACKと表示されており、JSON PARSER ATTACKと検知されていることが確認できます
3. App Firewall Policyの解除
その他の機能を確認するため設定を解除する手順です。
こちら の手順を参考に、HTTP Load Balancerに割り当てたApp FirewallのPolicyを解除してください
4. Terraform を用いた HTTP Load Balancer + WAF の作成
ここで紹介したHTTP load Balancer + WAF を Terraform を使ってデプロイすることが可能です。
Terraform の利用で必要となる事前作業については こちら の手順を参考してください
パラメータの指定
実行に必要なファイル、また実行環境に合わせたパラメータを指定してください
1$ git clone https://github.com/BeF5/f5j-dc-waap-automation
2$ cd f5j-dc-waap-automation/terraform/waf
3
4$ vi terraform.tfvars
5# ** 環境に合わせて適切な内容に変更してください **
6api_p12_file = "**/path/to/p12file**" // Path for p12 file downloaded from VoltConsole
7api_url = "https://**api url**" // API URL for your tenant
8
9# 本手順のサンプルで表示したパラメータの場合、以下のようになります
10myns = "**your namespace**" // Name of your namespace
11op_name = "demo-origin-pool" // Name of Origin Pool
12pool_port = "80" // Port Number
13server_name1 = "**your target fqdn1**" // Target Server FQDN1
14server_name2 = "**your target fqdn1**" // Target Server FQDN2
15httplb_name = "demo-echo-lb" // Name of HTTP LoadBalancer
16mydomain = ["echoapp.f5demo.net"] // Domain name to be exposed
17
18cert = "string///**base 64 encode SSL Certificate**" // SSL Certificate for HTTPS access
19private_key = "string///**base 64 encode SSL Private Key**" // SSL Private Key for HTTPS access
20
21// WAF Parameter
22waf_name = "demo-app-fw" // Name of App Firewall
Terraform の利用
以下コマンドを参考に実行および削除をしてください。
1# 実行前事前作業
2$ terraform init
3$ terraform plan
4
5# 設定のデプロイ
6$ terraform apply
7
8# 設定の削除
9$ terraform destroy
5. API を用いた HTTP Load Balancer + WAF の作成
ここで紹介したHTTP load Balancer + WAF を API を使ってデプロイすることが可能です。
API の利用で必要となる事前作業については こちら の手順を参考してください
以下マニュアルを参考に、パラメータを指定して実行してください。
Application Firewall
Example of creating app_firewall
ページ中段
Request using curlをご覧ください
作成したオブジェクトを適宜HTTP Load Balancerから参照してください
HTTP Load Balancer
Example of creating http_loadbalancer
ページ中段
Request using curlをご覧ください
送付するJSON データの書式は実際に作成したコンフィグのJSONデータからも確認をいただけます。合わせてご確認ください
パラメータの指定
GitHubよりファイルを取得します。 app-fw.json と waf-httplb.json をAPIの値として指定します。
**<変数名>** が環境に合わせて変更するパラメータとなります。適切な内容に変更してください。
Originl Pool Object は HTTP Load Balancer の Originl Pool 作成手順に従って作成ください
APIの利用
以下のサンプルを参考にAPIを実行してください。 証明書のファイル名、パスワード情報は適切な内容を指定してください。
ファイル取得
1$ git clone https://github.com/BeF5/f5j-dc-waap-automation
2$ cd f5j-dc-waap-automation/api/waf
オブジェクトの作成
1# Originl Pool の作成 (HTTP LoadBalancer のパラメータを指定)
2$ curl -k https://**tenant_name**.console.ves.volterra.io/api/config/namespaces/**namespace**/origin_pools \
3 --cert **/path/to/api_credential.p12-file**:**password** \
4 --cert-type P12 \
5 -X POST \
6 -d @../http-load-balancer/base-origin-pool.json
7
8# APP Firewall の作成
9$ curl -k https://**tenant_name**.console.ves.volterra.io/api/config/namespaces/**namespace**/app_firewalls \
10 --cert **/path/to/api_credential.p12-file**:**password** \
11 --cert-type P12 \
12 -X POST \
13 -d @app-fw.json
14
15# HTTP LB の作成
16$ curl -k https://**tenant_name**.console.ves.volterra.io/api/config/namespaces/**namespace**/http_loadbalancers \
17 --cert **/path/to/api_credential.p12-file** \
18 --cert-type P12 \
19 -X POST \
20 -d @waf-httplb.json
オブジェクトの削除
1# HTTP LB の削除
2$ curl -k https://**tenant_name**.console.ves.volterra.io/api/config/namespaces/**namespace**/http_loadbalancers/**httplb_name** \
3 --cert **/path/to/api_credential.p12-file** \
4 --cert-type P12 \
5 -X DELETE
6
7# APP Firewall の削除
8$ curl -k https://**tenant_name**.console.ves.volterra.io/api/config/namespaces/**namespace**/app_firewalls \
9 --cert **/path/to/api_credential.p12-file** \
10 --cert-type P12 \
11 -X DELETE
12
13# Origin Pool の削除
14$ curl -k https://**tenant_name**.console.ves.volterra.io/api/config/namespaces/**namespace**/origin_pools/**op_name** \
15 --cert **/path/to/api_credential.p12-file** \
16 --cert-type P12 \
17 -X DELETE












