サーバーコンテナクラウドセキュリティネットワーク

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 に関しても引き続きアップデートは続くようです。

世の中のコンテナ化の波がどんどん迫ってきているなあ、と感じる今回のアップデートでした。

今回は以上となります。 また次回の記事でお会いしましょう!

この記事に関連する記事