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 をクリックします

../../_images/dcs-menu-app-fw.jpg

設定内容は以下の通りです。表に示したパラメター以外の項目についても 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 を追加

    ../../_images/dcs-app-fw.jpg

3. HTTP Load Balancer で App Firewall Policy の指定

作成済みのHTTP Load Balancerに作成した App Firewall Policyを割り当てます HTTP Load Balancer の設定手順は こちら を参照ください

画面左側 Manage欄の Load BalancersHTTP Load Balancers を開き、対象のLoad Balancerを表示し画面右側に遷移します。

../../_images/dcs-edit-lb.jpg

すでに作成済みのオブジェクトを変更する場合、対象のオブジェクト一番右側 から、 Manage Configuration をクリックします

../../_images/dcs-edit-lb2.jpg

設定の結果が一覧で表示されます。画面右上 Edit Configuration から設定の変更します。 Security COnfiguration 欄の Select Web Application Firewall (WAF) ConfigApp Firewall を選択し、 作成したApp Firewallのポリシーを選択してください。

../../_images/dcs-edit-lb3.jpg

2. 動作確認

Curlコマンドを使って各リクエストを送信し、その結果を確認します。リクエストを送信してから、ログの反映には1~2分ほどかかる場合があります。

注釈

Curlコマンドを使用する環境でhostsファイルの変更が難しい場合、--resolve オプションを指定し、リクエストの送信が可能です

# 今回のテストを想定したサンプルコマンド
curl -k -v --resolve echoapp.f5demo.net:443:<IP Address> https://echoapp.f5demo.net

各リクエストのログは以下の手順で参照することが可能です

../../_images/dcs-app-fw-log.jpg ../../_images/dcs-app-fw-log2.jpg

1. 正常動作

Curlコマンドで https://echoapp.f5demo.net へリクエストを送信し、応答が正常であることを確認します

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 画面の結果

    ../../_images/dcs-app-fw-log-permit.jpg
https://echoapp.f5demo.net への接続結果を示すWAF 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_typecurl と判定され、71行目 bot_classificationsuspicious であると確認できます。これはCurlコマンドであることをBot Signatureの機能により判定しておりますが、suspiciousの設定に従って Report と処理し、拒否は行っておりません

この他にも様々な情報が表示されており、Security Eventから通信の詳細について把握することが可能となっています

2. Signatureによる攻撃の検知

Curlコマンドで https://echoapp.f5demo.net?a=<script> へリクエストを送信し、通信が ブロック されることを確認します

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()">
この例では、URL ParameterにXSSに該当する文字列( <script> )が含まれているため、ポリシーでブロックされていることがわかります。
ブロックページは、titleが、 Request Rejected Custom Page となっており、Custom Pageで指定した内容が反映されていることが確認できます。
Support IDを見ると、 4813018f-1d4b-41e4-9284-144aadbbf578 という値が記載されています

それではログを確認しましょう

  • Security Event 画面の結果

    ../../_images/dcs-app-fw-log-sig.jpg
https://echoapp.f5demo.net?a=<script> への接続結果を示すWAF 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_rating5 となっており、高い値となっております

  • 147行目 から 151行目 attack_typesATTACK_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 画面の結果

    ../../_images/dcs-app-fw-log-sensitive-data.jpg
https://echoapp.f5demo.net?mypass=secret への接続結果を示すWAF 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 画面の結果

    ../../_images/dcs-app-fw-log-response-code.jpg
https://echoapp.f5demo.net/503 への接続結果を示すWAF 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が記録されているかとおもます。そちらを確認してください

../../_images/dcs-app-fw-log-response-code2.jpg
https://echoapp.f5demo.net/503 への接続結果を示すL7 Event
 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_infoactiondescription を見ると、許可されないレスポンスコード( 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 )を指定していますが、 実際のデータ の矛盾により通信が ブロック されることを確認します

https://echoapp.f5demo.net/ への接続結果
 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 画面の結果

    ../../_images/dcs-app-fw-log-violation.jpg
https://echoapp.f5demo.net/ への接続結果を示すWAF 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_typesATTACK_TYPE_JSON_PARSER_ATTACK と表示されており、JSON PARSER ATTACKと検知されていることが確認できます

3. App Firewall Policyの解除

その他の機能を確認するため設定を解除する手順です。

こちら の手順を参考に、HTTP Load Balancerに割り当てたApp FirewallのPolicyを解除してください

../../_images/dcs-app-fw-detach.jpg

4. Terraform を用いた HTTP Load Balancer + WAF の作成

ここで紹介したHTTP load Balancer + WAF を Terraform を使ってデプロイすることが可能です。

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 の利用

以下コマンドを参考に実行および削除をしてください。

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 の利用で必要となる事前作業については こちら の手順を参考してください

以下マニュアルを参考に、パラメータを指定して実行してください。

作成したオブジェクトを適宜HTTP Load Balancerから参照してください

送付するJSON データの書式は実際に作成したコンフィグのJSONデータからも確認をいただけます。合わせてご確認ください

パラメータの指定

GitHubよりファイルを取得します。 app-fw.jsonwaf-httplb.json をAPIの値として指定します。 **<変数名>** が環境に合わせて変更するパラメータとなります。適切な内容に変更してください。

Originl Pool Object は HTTP Load Balancer の Originl Pool 作成手順に従って作成ください

APIの利用

以下のサンプルを参考にAPIを実行してください。 証明書のファイル名、パスワード情報は適切な内容を指定してください。

  • ファイル取得

APIによるオブジェクトの作成
1$ git clone https://github.com/BeF5/f5j-dc-waap-automation
2$ cd f5j-dc-waap-automation/api/waf
  • オブジェクトの作成

APIによるオブジェクトの作成
 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
  • オブジェクトの削除

APIによるオブジェクトの削除
 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