NGINX App Protect WAF 5 がリリースされたのでインストールしてみた!
はじめに
東京エレクトロンデバイスのJo Nishikawaです。 いつもブログを読んでいただきありがとうございます!
2024年、一回目の投稿になります。 今年もよろしくお願いいたします。
今回の記事では、NGINX App Protect WAF Version 5 がリリースされましたので早速インストールしてみたいと思います。
今回の Version 5 から NGINX Plus だけではなく、NGINX OSS(オープンソースソフトウェア)にもNGINX App Protect WAF をアドオンできるようになったようです。 ※ただし、F5社のリポジトリからインストールしている NGINX OSS に限るようです。
今回はNGINX Plusにアドオンしてみます。NGINX OSS に対しての導入も反響があれば実施してみたいと思います。
前提条件
NGINX App Protect WAF Version 5 では Docker コンテナ上にインストールをしていくようです。 F5社のドキュメントによると前提条件として以下が必須のようです。
- 有効期限が切れていないアクティブなNGINX App Protect WAFライセンス
- Docker がインストールされていること
- サーバーOSが対応していること
動作確認したいこと
- NGINX App Protect WAF Version 5 をインストールできることの確認
- NGINX App Protect WAF Version 5 のWAF機能が有効になっていることの確認
検証環境
- AWS EC2 Ubuntu 20.04
検証
F5社のドキュメントに従ってインストール作業を実施してみます。
STEP1:サーバー上にライセンスファイルを格納
以下のコマンドでライセンスファイルを格納するディレクトリを作成
$ sudo mkdir -p /etc/ssl/nginx
作成したディレクトリに以下のファイルを格納
- nginx-repo.crt
- nginx-repo.key
STEP2:古い NGINX リポジトリ情報、 apt 構成ファイルを削除
以下のコマンドで古い NGINX リポジトリ情報、 apt 構成ファイルを削除
$ sudo rm /etc/apt/sources.list.d/nginx*.list
$ sudo rm /etc/apt/sources.list.d/*app-protect*.list
$ sudo rm /etc/apt/apt.conf.d/90pkgs-nginx
STEP3:前提条件パッケージをインストール
以下のコマンドで前提条件パッケージをインストール
$ sudo apt-get update && sudo apt-get install apt-transport-https lsb-release ca-certificates wget gnupg2 ubuntu-keyring
STEP4:NGINX 署名キーをダウンロードして追加
以下のコマンドで署名キーをダウンロードして追加
$ wget -qO - https://cs.nginx.com/static/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
STEP5:apt 構成をダウンロード
以下のコマンドでapt 構成をダウンロード
$ sudo wget -P /etc/apt/apt.conf.d https://cs.nginx.com/static/files/90pkgs-nginx
--2024-03-21 15:01:20-- https://cs.nginx.com/static/files/90pkgs-nginx
Resolving cs.nginx.com (cs.nginx.com)... 52.59.52.27, 3.126.134.177
Connecting to cs.nginx.com (cs.nginx.com)|52.59.52.27|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 258
Saving to: ‘/etc/apt/apt.conf.d/90pkgs-nginx’
90pkgs-nginx 100%[===================================>] 258 --.-KB/s in 0s
2024-03-21 15:01:21 (43.9 MB/s) - ‘/etc/apt/apt.conf.d/90pkgs-nginx’ saved [258/258]
STEP6:ダウンロードしたファイルに適切なキーが含まれていることを確認
以下のコマンドでダウンロードしたファイルに適切なキー(573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62)が含まれていることを確認
$ gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
hare/keyrings/nginx-archive-keyring.gpg
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>
STEP7:NGINX Plus リポジトリを追加
以下のコマンドでNGINX Plus リポジトリを追加
$ printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/plus/ubuntu `lsb_release -cs` nginx-plus\n" | sudo tee /etc/apt/sources.list.d/nginx-plus.list
deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/plus/ubuntu focal nginx-plus
STEP8:NGINX App Protect WAF v5 リポジトリを追加
以下のコマンドでNGINX App Protect WAF v5 リポジトリを追加
$ printf "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/app-protect-x-plus/ubuntu `lsb_release -cs` nginx-plus\n" | sudo tee /etc/apt/sources.list.d/nginx-app-protect.list
deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] https://pkgs.nginx.com/app-protect-x-plus/ubuntu focal nginx-plus
STEP9:NGINX plus と NGINX App Protect WAF Version 5 パッケージをインストール
以下のコマンドでNGINX Plus と NGINX App Protect WAF Version 5 パッケージをインストール
$ sudo apt-get update
$ sudo apt-get install app-protect-module-plus
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
app-protect-plugin jq libjq1 libonig5 nginx-plus nginx-plus-module-appprotect
The following NEW packages will be installed:
app-protect-module-plus app-protect-plugin jq libjq1 libonig5 nginx-plus nginx-plus-module-appprotect
0 upgraded, 7 newly installed, 0 to remove and 18 not upgraded.
Need to get 3961 kB of archives.
After this operation, 8646 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu focal/universe amd64 libonig5 amd64 6.9.4-1 [142 kB]
Get:2 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu focal-updates/universe amd64 libjq1 amd64 1.6-1ubuntu0.20.04.1 [121 kB]
Get:3 http://ap-northeast-1.ec2.archive.ubuntu.com/ubuntu focal-updates/universe amd64 jq amd64 1.6-1ubuntu0.20.04.1 [50.2 kB]
Get:4 https://pkgs.nginx.com/plus/ubuntu focal/nginx-plus amd64 nginx-plus amd64 31-2~focal [3532 kB]
Get:5 https://pkgs.nginx.com/app-protect-x-plus/ubuntu focal/nginx-plus amd64 app-protect-plugin amd64 5.24.0-1~focal [21.5 kB]
Get:6 https://pkgs.nginx.com/app-protect-x-plus/ubuntu focal/nginx-plus amd64 nginx-plus-module-appprotect amd64 31+4.815.0-1~focal [62.7 kB]
Get:7 https://pkgs.nginx.com/app-protect-x-plus/ubuntu focal/nginx-plus amd64 app-protect-module-plus amd64 31+4.815.0-1~focal [32.0 kB]
Fetched 3961 kB in 6s (696 kB/s)
Selecting previously unselected package nginx-plus.
(Reading database ... 62291 files and directories currently installed.)
Preparing to unpack .../0-nginx-plus_31-2~focal_amd64.deb ...
----------------------------------------------------------------------
Thank you for using NGINX!
Please find the documentation for NGINX Plus here:
/usr/share/nginx/html/nginx-modules-reference.pdf
NGINX Plus is proprietary software. EULA and License information:
/usr/share/doc/nginx-plus/
For support information, please see:
https://www.nginx.com/support/
----------------------------------------------------------------------
Unpacking nginx-plus (31-2~focal) ...
Selecting previously unselected package app-protect-plugin.
Preparing to unpack .../1-app-protect-plugin_5.24.0-1~focal_amd64.deb ...
Unpacking app-protect-plugin (5.24.0-1~focal) ...
Selecting previously unselected package libonig5:amd64.
Preparing to unpack .../2-libonig5_6.9.4-1_amd64.deb ...
Unpacking libonig5:amd64 (6.9.4-1) ...
Selecting previously unselected package libjq1:amd64.
Preparing to unpack .../3-libjq1_1.6-1ubuntu0.20.04.1_amd64.deb ...
Unpacking libjq1:amd64 (1.6-1ubuntu0.20.04.1) ...
Selecting previously unselected package jq.
Preparing to unpack .../4-jq_1.6-1ubuntu0.20.04.1_amd64.deb ...
Unpacking jq (1.6-1ubuntu0.20.04.1) ...
Selecting previously unselected package nginx-plus-module-appprotect.
Preparing to unpack .../5-nginx-plus-module-appprotect_31+4.815.0-1~focal_amd64.deb ...
Unpacking nginx-plus-module-appprotect (31+4.815.0-1~focal) ...
Selecting previously unselected package app-protect-module-plus.
Preparing to unpack .../6-app-protect-module-plus_31+4.815.0-1~focal_amd64.deb ...
Unpacking app-protect-module-plus (31+4.815.0-1~focal) ...
Setting up app-protect-plugin (5.24.0-1~focal) ...
Setting up nginx-plus (31-2~focal) ...
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /lib/systemd/system/nginx.service.
Setting up libonig5:amd64 (6.9.4-1) ...
Setting up libjq1:amd64 (1.6-1ubuntu0.20.04.1) ...
Setting up jq (1.6-1ubuntu0.20.04.1) ...
Setting up nginx-plus-module-appprotect (31+4.815.0-1~focal) ...
----------------------------------------------------------------------
The appprotect dynamic module for nginx has been installed.
To enable this module, add the following to /etc/nginx/nginx.conf
and reload nginx:
load_module modules/ngx_http_app_protect_module.so;
----------------------------------------------------------------------
Setting up app-protect-module-plus (31+4.815.0-1~focal) ...
Processing triggers for systemd (245.4-4ubuntu3.23) ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for libc-bin (2.31-0ubuntu9.14) ...
ここまでで NGINX Plus と NGINX App Protect WAF Version 5 のインストールまで完了
Version 5 になっていることの確認のため、以下のコマンドを実施
$ cat /opt/app_protect/RELEASE
5.0.0
STEP10:/etc/nginx/nginx.confに以下の設定を追記
メインコンテキストに追記
load_module modules/ngx_http_app_protect_module.so;
httpコンテキストに追記
http {
app_protect_enforcer_address 127.0.0.1:50000;
~~~
}
STEP11:/etc/nginx/conf.d/default.confに以下の設定を追記
locationコンテキストに追記
location / {
app_protect_enable on;
~~~
}
STEP12:WAFサービス用にディレクトリ作成、および権限を変更
以下のコマンドでWAFサービス用にディレクトリ作成、および権限を変更
$ sudo mkdir -p /opt/app_protect/config /opt/app_protect/bd_config
$ sudo chown -R 101:101 /opt/app_protect/
STEP13:F5 Container Registry 用に Docker をセットアップする
以下のコマンドで F5 Container Registry と対話ができるようにライセンスファイルを配置
$ sudo mkdir -p /etc/docker/certs.d/private-registry.nginx.com
$ sudo cp etc/ssl/nginx/nginx-repo.crt /etc/docker/certs.d/private-registry.nginx.com/client.cert
$ sudo cp etc/ssl/nginx/nginx-repo.key /etc/docker/certs.d/private-registry.nginx.com/client.key
Docker Compose ファイルを作成 今回は /etc/nginx 配下に docker-compose.yml というファイル名で作成
version: "3.9"
services:
waf-enforcer:
container_name: waf-enforcer
image: private-registry.nginx.com/nap/waf-enforcer:1.0.0
environment:
- ENFORCER_PORT=50000
ports:
- "50000:50000"
volumes:
- /opt/app_protect/bd_config:/opt/app_protect/bd_config
networks:
- waf_network
restart: always
waf-config-mgr:
container_name: waf-config-mgr
image: private-registry.nginx.com/nap/waf-config-mgr:1.0.0
volumes:
- /opt/app_protect/bd_config:/opt/app_protect/bd_config
- /opt/app_protect/config:/opt/app_protect/config
- /etc/app_protect/conf:/etc/app_protect/conf
- /conf/nginx.conf:/etc/nginx/nginx.conf # based on the provided example
- /conf/default.conf:/etc/nginx/conf.d/default.conf # based on the provided example
restart: always
network_mode: none
depends_on:
waf-enforcer:
condition: service_started
networks:
waf_network:
driver: bridge
$ sudo docker compose up -d
WARN[0000] /etc/nginx/docker-compose.yml: `version` is obsolete
[+] Running 11/11
✔ waf-enforcer 4 layers [⣿⣿⣿⣿] 0B/0B Pulled 15.6s
✔ be52d6803f7c Pull complete 0.9s
✔ a8e9f3c344b4 Pull complete 0.9s
✔ 5b8683248c05 Pull complete 10.6s
✔ d9b1f0d3f5de Pull complete 3.9s
✔ waf-config-mgr 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled 11.5s
✔ c1c0b1403019 Pull complete 1.8s
✔ 4ceb24147924 Pull complete 2.7s
✔ a82fc796a1de Pull complete 7.2s
✔ c2bf4aa156c2 Pull complete 8.1s
✔ bd9ddc54bea9 Pull complete 8.1s
[+] Running 2/3
⠸ Network nginx_waf_network Created 1.3s
✔ Container waf-enforcer Started 0.9s
✔ Container waf-config-mgr Started
以下のコマンドでNGINX App Protect WAF に関わるDocker コンテナが起動していることを確認
$ sudo sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
008ec4fd3737 private-registry.nginx.com/nap/waf-config-mgr:1.0.0 "/service/config-mgr…" 5 hours ago Up 6 minutes waf-config-mgr
3e0dcdf3390e private-registry.nginx.com/nap/waf-enforcer:1.0.0 "/start-enforcer" 5 hours ago Up 6 minutes 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp waf-enforcer
STEP14:NGINX サービス起動
NGINXサービスが起動していない場合は以下のコマンドで起動させる
$ sudo service nginx start
STEP15:WAF機能が有効になっているかをcurlにて確認
以下のコマンドで正常アクセスを実施しコンテンツが正常に応答していることを確認
$ curl "localhost"
<title>Welcome to nginx!</title>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br />
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
以下のコマンドで攻撃アクセスを実施し通信をブロックしていることを確認
$ curl "localhost/?"
<title>Request Rejected</title>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 9506285797881587414<br><br><a href='history.back();'>[Go Back]</a>
ubuntu@ip-172-31-40-214:/etc/nginx$
まとめ
NGINX App Protect WAF Version 5 をインストールし、Version 4 と同様に攻撃を防いでくれることを確認できました。 インストールやセットアップの手順に、これまでの Version にはなかった Docker コンテナに手順が追加されてしましたね。
NGINX App Protect Version 5 の仕組みやインストール後の設定変更などは今後、改めて確認・検証を進めていきたいと思います。
また、NGINX App Protect WAF Version 4 に関しても引き続きアップデートは続くようです。
世の中のコンテナ化の波がどんどん迫ってきているなあ、と感じる今回のアップデートでした。
今回は以上となります。 また次回の記事でお会いしましょう!