NGINX App Protect WAF (NAP WAF)
NAP WAF について
NAP WAFは、ワールドワイドで実績豊富なF5製WAFの機能を移植した、NGINX Plusの動的モジュールで実現するWAFです。
1. シンプルなWAFの設定
1. 設定
WAFを設定します
# sudo su
cd /etc/nginx/conf.d
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_demo.conf default.conf
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_log_format.json custom_log_format.json
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_policy.json custom_policy.json
WAFの設定を確認します
設定ファイルを確認します。 listen 80 の server block にて各種WAFの設定を読み込んでいます。
cat default.conf
1upstream server_group {
2 zone backend 64k;
3 server security-backend1:80;
4}
5# waf
6server {
7 listen 80;
8 app_protect_enable on;
9 app_protect_security_log_enable on;
10 app_protect_security_log "/etc/nginx/conf.d/custom_log_format.json" syslog:server=elasticsearch:5144;
11
12 location / {
13 app_protect_policy_file "/etc/nginx/conf.d/custom_policy.json";
14 proxy_pass http://server_group;
15 }
16}
17# no waf
18server {
19 listen 81;
20 location / {
21 proxy_pass http://server_group;
22 }
23}
cat custom_log_format.json
1{
2 "filter": {
3 "request_type": "all"
4 },
5 "content": {
6 "format": "default",
7 "max_request_size": "any",
8 "max_message_size": "10k"
9 }
10}
cat custom_policy.json
1{
2 "policy":
3 {
4 "name": "acceptall",
5 "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
6 "applicationLanguage": "utf-8",
7 "enforcementMode": "transparent"
8 }
9}
enforcementMode で transparent と指定しているため、通信のBlockは行われません。プロセスを再起動し、設定を反映します
nginx -s reload
2. 動作確認
まず初めにサンプルアプリケーションにアクセスできることを確認します。
OWASP Juice Shop というアプリケーションが動作しています。curl -s localhost | grep title
1<title>OWASP Juice Shop</title>
この通信の結果をELKで取得していることを確認します
Jump Host でブラウザを起動し、 http://elk:5601 を開いてください
左上メニューを開いてください。
Discover をクリックし、表示された画面の + Add filter の下にすでに登録されている waf-logs-* を選択してください
Refresh をクリックしてください。> をクリックすると詳細が表示されます。参考に内容を確認すると bot_signature_name に curl と表示されていることがわかります。通信は確認した通り許可されておりますが、Curlコマンドを利用した通信が到達していることが確認できます。
2. 通信のブロック
1. 設定
通信のブロックを行うため設定を変更します。
Default Policy の設定・動作の詳細については、 こちら Basic Configuration and the Default Policy を参照してください
それでは、WAFのセキュリティポリシーのみ変更し、設定を反映します
# sudo su
# cd /etc/nginx/conf.d
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_demo.conf default.conf
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_log_format.json custom_log_format.json
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json custom_policy.json
WAFの設定を確認します
今回確認するポリシーについて 2. 通信のブロック のポリシーの内容との差分を確認します。
diff -u ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_policy.json custom_policy.json
1 --- /root/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_policy.json 2022-04-14 23:27:19.383236359 +0900
2 +++ custom_policy.json 2022-04-14 23:21:06.978541812 +0900
3 @@ -1,9 +1,9 @@
4 {
5 "policy":
6 {
7 - "name": "acceptall",
8 + "name": "blocking",
9 "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
10 "applicationLanguage": "utf-8",
11 - "enforcementMode": "transparent"
12 + "enforcementMode": "blocking"
13 }
14 }
enforcementMode で blocking と指定されていることがわかります。プロセスを再起動し、設定を反映します
nginx -s reload
2. 動作確認
クロスサイトスクリプティング(XSS)に該当する通信を発生させます。以下のCurlコマンドを実行し、結果を確認します。
curl -s "localhost/?a=<script>"
1<html>
2 <head>
3 <title>Request Rejected</title>
4 </head>
5 <body>The requested URL was rejected. Please consult with your administrator.<br><br>
6 Your support ID is: 935833362169160317<br><br>
7 <a href='javascript:history.back();'>[Go Back]</a>
8 </body>
9</html>
Request Rejected の文字とともにHTMLが応答されていることがわかります。Jump Host でブラウザを起動し、 http://elk:5601 を開いてくださいELK > Discover > waf-logs-* を開き、表示された結果の > をクリックし、詳細を表示してください。この項目では、ELKのGUIでどの様に表示されるか確認します。
主要な項目について確認します
中段に表示されている
support_idをまず最初に説明します。先程のBlock Pageを確認してください。こちらに表示されている Support ID と一致していることが確認できます。この様にNAP WAFでは、セキュリティログを一意に特定する値として Support ID が存在します。攻撃が拒否された場合には、Block された画面(HTML)により該当のログを特定することが可能ですbot_categoryは HTTP Library 、bot_signature_nameは curl となっていますclient_classは Bot Signature によるClassというカテゴリを示しており、 Untrusted Bot となっていますoutcomeは 処理の結果を示しており、REJECETD(拒否)となることがわかりますsig_から始まる項目が、 signature に関する情報を示しております。各項目は、Signature ID、Signature Name、Signature Set Name となっていますviolation_から始まる項目が、 VIOLATION に関する情報を示しております。通信がどのような脅威に該当するのか確認できますVIOLATIONの中で
violation_ratingがあり、これはその重要度(危険度)を示しています。NAP WAFのDefault Policyでは、検知した通信で複数の問題が確認され、その結果判定されたRatingが一定の値より高い場合に通信が拒否される設定となっています。
JSON 形式の表示は、該当ログの JSON タブをクリックしてください
次にELKが提供するもう一つの機能である、 Dashboard を確認します
ELK > Dashboard を開き Overview をクリックしてください。通信量が少ないため内容は大変シンプルとなっております。
こちらの内容から横断的に通信の状況を把握することができるようになっています。 リクエストの処理結果の割合や、クライアントIPアドレスの分布、アクセス先のURL、検知したSignatureや、Violation等の割当を知ることができます。 この画面を見ることにより、今の検知状況や頻繁に発生・検知している攻撃などを俯瞰的に知ることができます。
ELK > Dashboard を開き False Positives をクリックしてください。
Overviewと同様に結果はシンプルです。
誤検知の可能性の高い通信 を見つけることを目的としています。3. 特定Signatureの除外設定
1. シナリオ
この項目のシナリオは以下となります。
バックエンドのアプリケーションの動作確認のため、
SQL Injectionがどの様に制御されるか確認するアプリケーションの前段にWAFが配置されているため、一次的にWAFで
SQL Injectionを検知しないように変更する
本来こういったシナリオは多くないかもしれません。WAFのオペレーションの流れとしてご認識ください。
2. ブラウザから攻撃の実施
セキュリティポリシーの設定は 2. 通信のブロック のポリシーを利用します
Jump Host より Owasp Juice Shop にアクセスします。ブラウザを起動し、 http://juice-shop を開いてください
Account > Login をクリックします。Network を表示してください。
|
|
Password |
|
SQL Injection を意図した入力となります。WAFが有効でない場合、認証が回避されログインが完了してしまいます。Webページ側で期待した応答と異なるため、 [object Object] というエラーとなり、ブロックされています。
Network を開き、検索ボックスに login を入力してください。login を選択し、 Response を確認すると、NAP WAFが応答した情報が返されていることがわかります。それではログの情報を確認します。 Jump Host でブラウザを起動し、 http://elk:5601 を開いてください
ELK > Discover > waf-logs-* を開きます。SQL と入力し Enter を押してください表示された結果の > をクリックし、詳細を表示してください。
内容を確認すると、 SQL Injection として検知され通信がブロックされたことがわかります。
次に画面で sig_ids を検索し、右側に表示されている内容をご確認ください
1200002147, 200002419, 200002883, 200002835, 200002476, 200015112
後ほどURL Pathの情報も利用いたしますので uri の欄に表示される内容をご確認ください
1/rest/user/login
3. 設定
SQL Injection を許可する設定を行います。 WAFのセキュリティポリシーを変更し、設定を反映します
# sudo su
# cd /etc/nginx/conf.d
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_demo.conf default.conf
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_log_format.json custom_log_format.json
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l3_custom_policy.json custom_policy.json
WAFの設定を確認します
今回確認するポリシーについて 2. 通信のブロック のポリシーの内容との差分を確認します。
diff -u ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json custom_policy.json
1 --- /root/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json 2022-04-14 23:27:46.608110394 +0900
2 +++ custom_policy.json 2022-04-19 16:53:25.046672699 +0900
3 @@ -1,9 +1,31 @@
4 {
5 "policy":
6 {
7 - "name": "blocking",
8 + "name": "disable-sqli-signatures",
9 "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
10 "applicationLanguage": "utf-8",
11 - "enforcementMode": "blocking"
12 + "enforcementMode": "blocking",
13 + "signatures": [
14 + {
15 + "signatureId": 200002147,
16 + "enabled": false
17 + },
18 + {
19 + "signatureId": 200002419,
20 + "enabled": false
21 + },
22 + {
23 + "signatureId": 200002883,
24 + "enabled": false
25 + },
26 + {
27 + "signatureId": 200002835,
28 + "enabled": false
29 + },
30 + {
31 + "signatureId": 200002476,
32 + "enabled": false
33 + },
34 + {
35 + "signatureId": 200015112,
36 + "enabled": false
37 + }
38 + ]
39 }
40 }
signatures に 先程確認した各Signatureが、 "enabled": false と指定されていることがわかります。
表示されている signatureID が先程画面で確認した内容と一致していることを確認してください。
この設定により通信をブロックから除外することが可能です。
プロセスを再起動し、設定を反映します
nginx -s reload
4. 動作確認
Jump Host より Owasp Juice Shop にアクセスします。ブラウザを起動し、 http://juice-shop を開いてください
Account > Login をクリックします。表示された画面に以下の内容を入力します。
|
|
Password |
|
ログインが完了し、TOPページが表示されました。画面右上 Account をクリックすると、 SQL Injection により認証を回避し、 admin@... でログインできていることが確認できます。
(SQL Injection の攻撃が成功した状態です)
Note
それではログの情報を確認します。 Jump Host でブラウザを起動し、 http://elk:5601 を開いてください
ELK > Discover > waf-logs-* を開きます。
画面上部の検索窓に SQL と入力し Enter を押してください
ログを検索いただくと、直前に接続した内容は SQL Injection としての表示が無いかと思います。
+Add filter をクリックし、画面に表示される項目に以下の内容を入力し Save をクリックしてください。Field |
|
Operator |
|
Vsalue |
|
表示された結果の > をクリックし、詳細を表示してください。
表示結果を確認すると、uri として該当するログであることがわかります。また outcome が PASSED となり許可されていること、 sig_ids は 該当なし(N/A) であることが確認できます。
4. Custom Blocking Page
OWASP Juice Shop では内容の推察ができない内容となっていました。1. 設定
Custom Block Pageの設定を行います。 WAFのセキュリティポリシーを変更し、設定を反映します
# sudo su
# cd /etc/nginx/conf.d
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_demo.conf default.conf
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_log_format.json custom_log_format.json
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l4_custom_policy.json custom_policy.json
WAFの設定を確認します
今回確認するポリシーについて 2. 通信のブロック のポリシーの内容との差分を確認します。
diff -u ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json custom_policy.json
1 --- /root/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json 2022-04-20 10:00:50.107946293 +0900
2 +++ custom_policy.json 2022-04-20 14:07:56.299902065 +0900
3 @@ -1,9 +1,17 @@
4 {
5 "policy":
6 {
7 - "name": "blocking",
8 + "name": "custom-blockingpage",
9 "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
10 "applicationLanguage": "utf-8",
11 - "enforcementMode": "blocking"
12 + "enforcementMode": "blocking",
13 + "response-pages": [
14 + {
15 + "responseContent": "Attack is detected ID: <%TS.request.ID()%>",
16 + "responseHeader": "HTTP/1.1 401 UnauthorizedK\r\nCache-Control: no-cache\r\nPragma: no-cache\r\nConnection: close",
17 + "responseActionType": "custom",
18 + "responsePageType": "default"
19 + }
20 + ]
21 }
22 }
response-pages に Custom Pageを指定しています。responseContent Block時の応答を HTML で記述することが可能です。responseContent 、 responseHeader を指定しています。プロセスを再起動し、設定を反映します
nginx -s reload
2. 動作確認
Jump Host より Owasp Juice Shop にアクセスします。ブラウザを起動し、 http://juice-shop を開いてください
Account > Login をクリックします。表示された画面に以下の内容を入力します。
|
|
Password |
|
Attack is detected ID: **support ID** が表示されており、セキュリティポリシーで指定した内容となっていることが確認できます。ログを確認すると、 SQL Injeciton の動作確認と同様の内容が確認できます。
Jump Host でブラウザを起動し、 http://elk:5601 を開いてください。ELK > Discover > waf-logs-* を開きます。SQL と入力し Enter を押してください。SQL Injection として検知され通信がブロックされたことがわかります。5. Sensitive Parameter
アプリケーションとの通信で重要なデータを取り扱う場合があります。
それらの情報を扱うパラメータを sensitive parameter に指定することでログやリクエストで情報をマスクすることが可能です
1. 設定
sensitive parameterの設定を行います。 WAFのセキュリティポリシーを変更し、設定を反映します
# sudo su
# cd /etc/nginx/conf.d
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_demo.conf default.conf
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_log_format.json custom_log_format.json
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l5_custom_policy.json custom_policy.json
WAFの設定を確認します
今回確認するポリシーについて 2. 通信のブロック のポリシーの内容との差分を確認します。
diff -u ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json custom_policy.json
1 --- /root/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json 2022-04-20 10:00:50.107946293 +0900
2 +++ custom_policy.json 2022-04-20 17:24:28.367618648 +0900
3 @@ -1,9 +1,14 @@
4 {
5 "policy":
6 {
7 - "name": "blocking",
8 + "name": "sensitive-parameter",
9 "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
10 "applicationLanguage": "utf-8",
11 - "enforcementMode": "blocking"
12 + "enforcementMode": "blocking",
13 + "sensitive-parameters": [
14 + {
15 + "name": "mypass"
16 + }
17 + ]
18 }
19 }
sensitive-parameter として mypass を指定しています。指定のパラメータについては情報がマスクされます
プロセスを再起動し、設定を反映します
nginx -s reload
2. 動作確認
Curl コマンドを使ってリクエストを送信します。 mypass というパラメータに対し、 dummy という値を指定しています。
curl -s "localhost/?mypass=dummy" | grep title
1<title>OWASP Juice Shop</title>
通信はエラーなく終了しました。
Jump Host でブラウザを起動し、 http://elk:5601 を開いてください。ELK > Discover > waf-logs-* を開きます。画面上部の検索窓に mypass と入力し Enter を押してください。
該当の通信が表示されています。通信の詳細を確認すると request でURIの情報が確認でき、
パラメータとして指定した mypass の値がマスクされていることがわかります。
この様に、sensitive-parameter を利用することで、対象の値をマスクすることが可能です。
6. 特定パラメータの制御
Sensitive Parameterの他、NAP WAFではより詳細な制御をすることが可能です。
1. 事前動作確認
Tips1. アカウントの登録 の手順に従ってテスト用アカウントを作成してください。
作成後、画面右上 Account > test@example.com(作成したユーザのメールアドレス) をクリックし、 User Profile を開いてください。
ここではユーザの名称や、ユーザのアイコンとなる画像をアップロードすることが可能です。
ブラウザの右上 ︙ > More tools > Developer tools を開きます。
表示された Developer tools の Network タブを開き、通信の状況を取得します。
Username に dummyname を入力し、 Set Username をクリックし、動作を確認してください。Developer tools の検索窓に profile と入力し、 Status が 30x の行をクリックしてくださいPayload のタブを開くと、Form Data で username: dummyname が送付されていることが確認できます。
このUsername欄は、様々な特殊文字など自由に入力することが可能です。入力値を意図した様に制御するようWAFのポリシーを設定します。
2. 設定
設定サンプル: User-Defined Parameters
VIOLATIONの意味: Supported Violations
# sudo su
# cd /etc/nginx/conf.d
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_demo.conf default.conf
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_log_format.json custom_log_format.json
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l6_custom_policy.json custom_policy.json
WAFの設定を確認します
今回確認するポリシーについて 2. 通信のブロック のポリシーの内容との差分を確認します。
diff -u ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json custom_policy.json
1 --- /root/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json 2022-04-20 10:00:50.107946293 +0900
2 +++ custom_policy.json 2022-04-21 00:27:37.705482111 +0900
3 @@ -1,9 +1,93 @@
4 {
5 "policy":
6 {
7 - "name": "blocking",
8 + "name": "parameter",
9 "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
10 "applicationLanguage": "utf-8",
11 - "enforcementMode": "blocking"
12 + "enforcementMode": "blocking",
13 + "blocking-settings": {
14 + "violations": [
15 + {
16 + "name": "VIOL_PARAMETER_STATIC_VALUE",
17 + "alarm": true,
18 + "block": true
19 + },
20 + {
21 + "name": "VIOL_PARAMETER_VALUE_LENGTH",
22 + "alarm": true,
23 + "block": true
24 + },
25 + {
26 + "name": "VIOL_PARAMETER_NUMERIC_VALUE",
27 + "alarm": true,
28 + "block": true
29 + },
30 + {
31 + "name": "VIOL_PARAMETER_DATA_TYPE",
32 + "alarm": true,
33 + "block": true
34 + },
35 + {
36 + "name": "VIOL_PARAMETER_VALUE_METACHAR",
37 + "alarm": true,
38 + "block": true
39 + },
40 + {
41 + "name": "VIOL_PARAMETER_NAME_METACHAR",
42 + "alarm": true,
43 + "block": true
44 + },
45 + {
46 + "name": "VIOL_PARAMETER_VALUE_BASE64",
47 + "alarm": true,
48 + "block": true
49 + },
50 + {
51 + "name": "VIOL_PARAMETER",
52 + "alarm": true,
53 + "block": true
54 + },
55 + {
56 + "name": "VIOL_PARAMETER_MULTIPART_NULL_VALUE",
57 + "alarm": true,
58 + "block": true
59 + },
60 + {
61 + "name": "VIOL_PARAMETER_LOCATION",
62 + "alarm": true,
63 + "block": true
64 + }
65 + ]
66 + },
67 + "parameters": [
68 + {
69 + "name": "username",
70 + "type": "explicit",
71 + "valueType": "user-input",
72 + "dataType": "alpha-numeric",
73 + "decodeValueAsBase64": "required",
74 + "parameterLocation": "form-data",
75 + "checkMaxValueLength": true,
76 + "checkMinValueLength": true,
77 + "maximumLength": 5,
78 + "minimumLength": 0,
79 + "urls": [
80 + {
81 + "method": "*",
82 + "name": "/profile",
83 + "type": "explicit",
84 + "wildcardOrder": 1
85 + }
86 + ]
87 + }
88 + ],
89 + "response-pages": [
90 + {
91 + "responseContent": "Attack is detected ID: <%TS.request.ID()%><br>Redirect in 5 sec... <script>setTimeout(function(){location.href='/profile'},5000);</script>",
92 + "responseHeader": "HTTP/1.1 200",
93 + "responseActionType": "custom",
94 + "responsePageType": "default"
95 + }
96 + ]
97 }
98 }
blocking-settingsのviolationsで、パラメータ制御に関連する VIOLATION を有効にしていますparametersでパラメータ制御の設定をしています。今回対象となるパラメータはusernameで最大文字数(maximumLength)、 入力値をアルファベットと数字(dataType)を指定しています。response-pagesで エラーページを指定します。条件で拒否対象と判定された場合、自動的にリダイレクトするようにしています
プロセスを再起動し、設定を反映します
nginx -s reload
3. 動作確認
長い名前の入力
Username に longname を入力します。
エラーページは5秒のみの表示となりますので、Support ID を取得する場合には注意ください。
ログを確認します。 Jump Host でブラウザを起動し、 http://elk:5601 を開いてください。
ELK > Discover > waf-logs-* を開きます。
画面上部の検索窓に support_id **画面に表示されたsupport ID** と入力し Enter を押してください。
該当の通信が表示されています。
usernameにlongnameが入力されていますviolationsに、Illegal parameter value lengthと表示されています
この様に、文字列の長さを指定することで想定外の入力値を制御することが可能です。
許可されない文字の入力
Username に 許可されない文字列 a@!b を入力します。
エラーページは5秒のみの表示となりますので、Support ID を取得する場合には注意ください。
ログを確認します。 Jump Host でブラウザを起動し、 http://elk:5601 を開いてください。
ELK > Discover > waf-logs-* を開きます。
画面上部の検索窓に support_id **画面に表示されたsupport ID** と入力し Enter を押してください。
該当の通信が表示されています。
ログの内容を確認すると、 username に a@!b が入力され、 violations に、 Illegal Base64 value と表示されていることがわかります。
この様に、文字列のタイプを指定することで想定外の入力値を制御することが可能です。
7. Bot Clientの確認
NAP WAFはBot Signatureを持ち、クライアントが操作するツール以外に、Google等に代表される各サイトをクロールするツールに於いても判定・制御することが可能です。
1. 設定
Botの設定を行います。 WAFのセキュリティポリシーを変更し、設定を反映します
# sudo su
# cd /etc/nginx/conf.d
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_demo.conf default.conf
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_log_format.json custom_log_format.json
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l7_custom_policy.json custom_policy.json
WAFの設定を確認します
今回確認するポリシーについて 2. 通信のブロック のポリシーの内容との差分を確認します。
diff -u ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json custom_policy.json
1 --- /root/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json 2022-04-20 10:00:50.107946293 +0900
2 +++ custom_policy.json 2022-04-21 00:49:07.276916732 +0900
3 @@ -1,9 +1,30 @@
4 {
5 "policy":
6 {
7 - "name": "blocking",
8 + "name": "bot-signature",
9 "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
10 "applicationLanguage": "utf-8",
11 - "enforcementMode": "blocking"
12 + "enforcementMode": "blocking",
13 + "bot-defense": {
14 + "settings": {
15 + "isEnabled": true
16 + },
17 + "mitigations": {
18 + "classes": [
19 + {
20 + "name": "trusted-bot",
21 + "action": "alarm"
22 + },
23 + {
24 + "name": "untrusted-bot",
25 + "action": "block"
26 + },
27 + {
28 + "name": "malicious-bot",
29 + "action": "block"
30 + }
31 + ]
32 + }
33 + }
34 }
35 }
このラボでCurlコマンドによる疎通確認を行っている箇所があります。
Untrusted Bot というクラスに分類されます。今回の設定では、 Untrusted Bot を Block に変更します。
疎通確認で、 Curl と ブラウザ の双方から接続を行い、挙動を確認します
プロセスを再起動し、設定を反映します
nginx -s reload
2. 動作確認
Curl コマンドを使ってリクエストを送信します。
curl -s "localhost/" | grep title
1<html>
2 <head>
3 <title>Request Rejected</title>
4 </head>
5 <body>The requested URL was rejected. Please consult with your administrator.<br><br>
6 Your support ID is: 16452723180063667004<br><br>
7 <a href='javascript:history.back();'>[Go Back]</a>
8 </body>
9</html>
ログを確認します。 Jump Host でブラウザを起動し、 http://elk:5601 を開いてください。
ELK > Discover > waf-logs-* を開きます。
画面上部の検索窓に support_id **画面に表示されたsupport ID** と入力し Enter を押してください。
該当の通信が表示されています。
bot_categoryがHTTP Library、bot_signature_nameがcurl、client_classがUntrusted BotとなっていますoutcomeがREJECTEDとなっています。このことから通信が拒否されたことがわかりますviolationsがBot Client Detectedとなっていることから、Botの判定によって通信が拒否されたと判断できます
次にブラウザでTopページにアクセスしてください
ブラウザの場合、通信はエラーなく終了しました。
ログを確認します。
画面上部の検索窓に client_class Browser と入力し Enter を押してください。
ブラウザを通じてアクセスした場合、様々な通信が行われます。 今回はBotとの比較が主な目的となりますので、適当なログを選択いただければ問題ありません。
bot_***に関する項目に情報がなく、N/Aとなっていますclient_applicationがChrome、client_classがBrowserとなっています
この様に、Curlコマンドとブラウザで接続した場合にはそれぞれ別のクライアントであることが識別されており、 NAP WAFが持つBot Signatureの機能により通信の制御が可能です
8. IPアドレスによる制御
NAP WAFの機能でIPアドレスによる制御を行い、同様にログを確認することができます。
1. 設定
IPアドレス制御の設定を行います。 WAFのセキュリティポリシーを変更し、設定を反映します
# sudo su
# cd /etc/nginx/conf.d
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_demo.conf default.conf
# cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l1_custom_log_format.json custom_log_format.json
cp ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l8_custom_policy.json custom_policy.json
WAFの設定を確認します
今回確認するポリシーについて 2. 通信のブロック のポリシーの内容との差分を確認します。
diff -u ~/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json custom_policy.json
1 --- /root/f5j-nginx-plus-lab2-security-conf/waf/waf-l2_custom_policy.json 2022-04-20 10:00:50.107946293 +0900
2 +++ custom_policy.json 2022-04-21 08:38:00.828843367 +0900
3 @@ -1,9 +1,16 @@
4 {
5 "policy":
6 {
7 - "name": "blocking",
8 + "name": "iplist",
9 "template": { "name": "POLICY_TEMPLATE_NGINX_BASE" },
10 "applicationLanguage": "utf-8",
11 - "enforcementMode": "blocking"
12 + "enforcementMode": "blocking",
13 + "whitelist-ips": [
14 + {
15 + "blockRequests": "always",
16 + "ipAddress": "10.0.0.0",
17 + "ipMask": "255.0.0.0"
18 + }
19 + ]
20 }
21 }
whitelist-ips でIPアドレスを指定した通信の制御を行います。blockRequests で以下パラメータを指定することにより、指定したIPアドレスに対し通信を制御することが可能です。指定する値 |
動作 |
|
Policy Default |
policy-default |
指定したIPからの通信をBlocking Settingの内容に従って処理する |
Never Block |
never |
指定したIPからの通信を許可する。Policyのその他設定よりこちらの処理が優先される |
Always Block |
always |
指定したIPからの通信をブロックする |
プロセスを再起動し、設定を反映します
nginx -s reload
2. 動作確認
Curl コマンドを使ってリクエストを送信します。
curl -s "localhost/" | grep title
1<title>OWASP Juice Shop</title>
Curlコマンドではローカルホストへアクセスしており、正常が完了したことを確認できます。
ブラウザでアクセスします。通信がブロックされました。
ログを確認します。 Jump Host でブラウザを起動し、 http://elk:5601 を開いてください。
ELK > Discover > waf-logs-* を開きます。
画面上部の検索窓に support_id **画面に表示されたsupport ID** と入力し Enter を押してください。
該当の通信が表示されています。
- ip_client が 10.1.1.4 となっており設定の内容に該当することがわかります
- outcome が REJECTED となり通信が拒否されています
- violations に IPアドレスがリストに含まれていると記載があります
特定のIPアドレスに対して制御することができます
9. Signatureのアップデート
NAP WAFのSignatureは頻繁にアップデートされます。 Signatureのアップデートはインストール時に確認いただいた通り、各種OSのパッケージ管理コマンドを通じて管理を頂きます。
以下が参考の確認結果です。
1 # dpkg-query -l | grep app-protect
2
3 ii app-protect 25+3.671.0-1~focal amd64 App-Protect package for Nginx Plus, Includes all of the default files and examples. Nginx App Protect provides web application firewall (WAF) security protection for your web applications, including OWASP Top 10 attacks.
4 ii app-protect-attack-signatures 2021.11.16-1~focal amd64 Attack Signature Updates for App-Protect
5 ii app-protect-common 8.12.1-1~focal amd64 NGINX App Protect
6 ii app-protect-compiler 8.12.1-1~focal amd64 Control-plane(aka CP) for waf-general debian
7 ii app-protect-dos 25+2.0.1-1~focal amd64 Nginx DoS protection
8 ii app-protect-engine 8.12.1-1~focal amd64 NGINX App Protect
9 ii app-protect-plugin 3.671.0-1~focal amd64 NGINX App Protect plugin
このコマンドの出力結果では、Signatureは 2021/11/16 のものであることがわかります
インストール可能なパッケージを Ubuntu で確認する方法は以下です。
1 # apt list app-protect -a
2 Listing... Done
3 app-protect/stable,now 26+3.796.0-1~focal amd64 [installed]
4 app-protect/stable 26+3.780.1-1~focal amd64
5 app-protect/stable 25+3.760.0-1~focal amd64
6 app-protect/stable 25+3.733.0-1~focal amd64
7 app-protect/stable 25+3.671.0-1~focal amd64
8 app-protect/stable 24+3.639.0-1~focal amd64
9 app-protect/stable 24+3.612.0-1~focal amd64
10 app-protect/stable 24+3.583.0-1~focal amd64
11 app-protect/stable 24+3.512.0-1~focal amd64
12 app-protect/stable 23+3.462.0-1~focal amd64
13
14 # apt list app-protect-attack-signatures -a
15 Listing... Done
16 app-protect-attack-signatures/stable,now 2022.04.10-1~focal amd64 [installed]
17 app-protect-attack-signatures/stable 2022.03.31-1~focal amd64
18 app-protect-attack-signatures/stable 2022.03.23-1~focal amd64
19 app-protect-attack-signatures/stable 2022.03.15-1~focal amd64
20 app-protect-attack-signatures/stable 2022.03.02-1~focal amd64
21 app-protect-attack-signatures/stable 2022.02.24-1~focal amd64
22 app-protect-attack-signatures/stable 2022.02.15-1~focal amd64
23 app-protect-attack-signatures/stable 2022.02.08-1~focal amd64
24 app-protect-attack-signatures/stable 2022.02.01-1~focal amd64
25 app-protect-attack-signatures/stable 2022.01.25-1~focal amd64
26 app-protect-attack-signatures/stable 2022.01.12-1~focal amd64
27 app-protect-attack-signatures/stable 2022.01.04-1~focal amd64
28 ** 省略 **
参考に、Attack Signatureをダウングレードする手順を以下に示します
NAP WAFのドキュメント の Releases を見ると、このパッケージは March 9, 2022 リリースされたものであることがわかります。
Versionを指定してSignatureをインストールします。(この例では、古いSignatureを選択します)
1# apt install app-protect-attack-signatures=2022.03.15-1~focal
2
3** 省略 **
4Unpacking app-protect-attack-signatures (2022.03.15-1~focal) over (2022.04.10-1~focal) ...
5Setting up app-protect-attack-signatures (2022.03.15-1~focal) ...
6In order for the signature update to take effect, NGINX must be reloaded.
7
8# apt list app-protect-attack-signatures -a
9Listing... Done
10app-protect-attack-signatures/stable 2022.04.10-1~focal amd64 [upgradable from: 2022.03.15-1~focal]
11app-protect-attack-signatures/stable 2022.03.31-1~focal amd64
12app-protect-attack-signatures/stable 2022.03.23-1~focal amd64
13app-protect-attack-signatures/stable,now 2022.03.15-1~focal amd64 [installed,upgradable to: 2022.04.10-1~focal]
14app-protect-attack-signatures/stable 2022.03.02-1~focal amd64
15app-protect-attack-signatures/stable 2022.02.24-1~focal amd64
16app-protect-attack-signatures/stable 2022.02.15-1~focal amd64
17** 省略 **
NGINXを再起動し、Signatureが反映されたことを確認します
1 # nginx -s reload
2 # grep attack_signatures_package /var/log/nginx/error.log | tail -2
3 2022/04/22 08:18:20 [notice] 8423#8423: APP_PROTECT { "event": "configuration_load_success", "software_version": "3.796.0", "completed_successfully":true,"attack_signatures_package":{"version":"2022.04.10","revision_datetime":"2022-04-10T12:51:45Z"},"threat_campaigns_package":{},"software_version":""}
4 2022/04/22 09:27:35 [notice] 8452#8452: APP_PROTECT { "event": "configuration_load_success", "software_version": "3.796.0", "completed_successfully":true,"attack_signatures_package":{"version":"2022.03.15","revision_datetime":"2022-03-15T11:35:54Z"},"threat_campaigns_package":{},"software_version":""}
2行目が該当のログとなります。1行目と比較すること attack_signatures_package の version の項目に変更後のVersionが記載されたことがわかります。
10. NAP WAF のアップグレード
ここでは、NAP WAFのアップグレードについてまとめます。
NGINXのバージョンのみをアップグレードした場合、NAP WAFはアンインストールされるため、再度 NAP WAFのインストールが必要となります。 NAP WAFのインストール後、以下コマンドを参考にNGINXの再起動を行ってください。
1# sudo su
2systemctl restart nginx
11. Threat Campaign Signature
NAP WAFは Threat Campaign という機能を持っています。 これは、F5のセキュリティチームで観測した、攻撃のキャンペーン(主要な攻撃の手口)の一連のふるまいから同種の攻撃であることを特定し高い精度で検知、制御する機能です。 Attack Signatureは各通信のデータを対象とするのに対し、この機能は攻撃開始から複数の通信に渡るまでそのふるまいで判定する点が違いとなります。
詳細は Threat Campaigns をご覧ください。
Threat Campaign の導入方法を紹介します。
パッケージを確認します
1 # dpkg-query -l | grep app-protect
2 ii app-protect 26+3.796.0-1~focal amd64 App-Protect package for Nginx Plus, Includes all of the default files and examples. Nginx App Protect provides web application firewall (WAF) security protection for your web applications, including OWASP Top 10 attacks.
3 ii app-protect-attack-signatures 2022.04.10-1~focal amd64 Attack Signature Updates for App-Protect
4 ii app-protect-common 10.29.1-1~focal amd64 NGINX App Protect
5 ii app-protect-compiler 10.29.1-1~focal amd64 Control-plane(aka CP) for waf-general debian
6 ii app-protect-dos 26+2.2.20-1~focal amd64 Nginx DoS protection
7 ii app-protect-engine 10.29.1-1~focal amd64 NGINX App Protect
8 ii app-protect-plugin 3.796.0-1~focal amd64 NGINX App Protect plugin
9 ii app-protect-threat-campaigns 2022.03.30-1~focal amd64 Threat Campaign Updates for App-Protect
もし、上記でapp-protect-threat-campaignsがインストールされていない場合は、Threat Campaign Signature を以下にてインストールするしてください。
1 # sudo su
2 apt-get install app-protect-threat-campaigns
プロセスを再起動します。
1 # nginx -s reload
Threat Campaign Signatureを確認します。読み込むまでに数分程度時間がかかる場合があります
1 # grep attack_signatures_package /var/log/nginx/error.log | tail -2
2 2022/04/22 11:12:43 [notice] 8452#8452: APP_PROTECT { "event": "configuration_load_success", "software_version": "3.796.0", "completed_successfully":true,"attack_signatures_package":{"version":"2022.04.10","revision_datetime":"2022-04-10T12:51:45Z"},"threat_campaigns_package":{},"software_version":""}
3 2022/04/22 11:16:33 [notice] 8452#8452: APP_PROTECT { "event": "configuration_load_success", "software_version": "3.796.0", "completed_successfully":true,"attack_signatures_package":{"version":"2022.04.10","revision_datetime":"2022-04-10T12:51:45Z"},"threat_campaigns_package":{"version":"2022.04.20","revision_datetime":"2022-04-20T14:14:04Z"},"software_version":""}
2行目が該当のログとなります。1行目と比較すること threat_campaigns_package の項目にVersionが記載されたことがわかります。
このように設定することで Threat Campaigns Signature を利用することが可能です。
Tips1. アカウントの登録
OWASP Juice Shopではアカウントの登録が可能です。ログインいただくと、カートへ商品の追加などの操作をいただくことが可能です。
1. アカウントの登録
動作確認の為、 OWASP Juice SHop に新規アカウントを登録します。
Jump Host より Owasp Juice Shop にアクセスします。ブラウザを起動し、 http://juice-shop を開いてください
画面右上 Account > Login をクリックします。
すでに別のアカウントでログインしている場合、一度ログアウトをしてください。
画面中段 「Not yet a customer?」をクリックし、以下の内容を入力してください。
|
|
Password |
|
Repeat Password |
|
Security Questions |
|
Answer |
|
(説明の用途でメールアドレス・パスワードを指定していますがいずれの文字列でも問題ありません)
再度表示されますログイン画面に作成したアカウントの情報を入力し、ログインしてください。
アカウント情報を確認すると指定のメールアドレスでログインしたことが確認できます。


































