NGINX WAFを試してみよう!
NGINX App Protect、通称 NAP(ナップ)の紹介です。WAFを体験してみませんか。
東京エレクトロンデバイスでエンジニアをやっている Nagaoka です。grasys 様とリレー形式のブログも最終回となりました。
さて、私からは、NGINX の WAFの導入方法に関してご説明します。
NGINXのWAFは、NGINX App Protect という名称で、F5 BIG-IP のWAF技術が この NGINX App Protect にも組み込まれています。既に 有償版である NGINX Plus をご利用ということであれば、Add-on という形で、NGINX App Protectの機能を有効にすることができます。その他に以下のような特徴があります。
・軽量で、CI/CDパイプライン上でのデプロイが容易
・旧ModSecurityに比べ圧倒的な高速パフォーマンス
・OWASP 10 対応
・使い慣れたKubernetes APIを使用してセキュリティポリシーと構成を管理などが可能
ここでは、お試しということで イチから NGINX App Protect の導入方法に関して紹介していきたいと思います。
なお、メーカーの公式サイトのインストール手順は以下になります。
NGINX App Protect WAF Administration Guide
https://docs.nginx.com/nginx-app-protect/admin-guide/install/
導入にはライセンスが必要となりますが、無料トライアルライセンスを活用します。
無料トライアルライセンス申し込み
https://cn.teldevice.co.jp/product/f5-nginx/
ステップ 0:事前準備
NGINX App Protect と NGINX Plus の両方が有効になるトライアルライセンスを事前に取得しておきます。必要なライセンスファイルは、以下の2つです。
・nginx-repo.crt
・nginx-repo.key
ステップ 1:インストール
Linux OS種類によってインストール方法が異なります。今回は、Ubuntu 20.04 を使ってWAF構築を進めていきます。
他のLinux OSでWAF導入を試したい場合には、公式サイト にインストール詳細が記載されていますので、そちらをご参照ください。
大まかなインストール手順は以下のとおりです。
- ライセンスファイルをコピーします
- NGINXのインストールに必要となるパッケージをインストールします
- リポジトリを登録します
- パッケージマネージャーのプロキシの設定ファイルをダウンロードします
- リポジトリを更新します
- NGINX App Protectをインストールします
それでは、順に実施してみます。
1. ライセンスファイルをコピーします
準備しておいたライセンスファイルを 導入対象の Linux に転送しておきます。転送後、2つのライセンスファイルを /etc/ssl/nginx/ ディレクトリにコピーします。
/etc/ssl/nginx というディレクトリを作成します。
$ sudo mkdir -p /etc/ssl/nginx
ファイルをコピーします。
$ sudo cp -p nginx-repo.crt /etc/ssl/nginx/
$ sudo cp -p nginx-repo.key /etc/ssl/nginx/
2. NGINXのインストールに必要となるパッケージをインストールします
$ sudo apt-get -y update
$ sudo apt-get -y install apt-transport-https lsb-release ca-certificates wget gnupg2
3. リポジトリを登録します
GPGキーを追加します。
$ sudo wget https://cs.nginx.com/static/keys/nginx_signing.key && sudo apt-key add nginx_signing.key
古いバージョンのNGINX Plusのリポジトリ と パッケージマネージャーの設定ファイル を既に存在する場合は削除します。
$ sudo rm /etc/apt/sources.list.d/nginx-plus.list
$ sudo rm /etc/apt/apt.conf.d/90nginx
NGINX Plusのリポジトリの追加
$ printf "deb https://pkgs.nginx.com/plus/ubuntu `lsb_release -cs` nginx-plus\n" | sudo tee /etc/apt/sources.list.d/nginx-plus.list
NGINX App Protectのリポジトリの追加
$ printf "deb https://pkgs.nginx.com/app-protect/ubuntu `lsb_release -cs` nginx-plus\n" | sudo tee /etc/apt/sources.list.d/nginx-app-protect.list
4. パッケージマネージャーのプロキシの設定ファイルをダウンロードします
$ sudo wget -P /etc/apt/apt.conf.d https://cs.nginx.com/static/files/90pkgs-nginx
5. リポジトリを更新します
$ sudo apt-get update
6. NGINX App Protectをインストールします
最新の NGINX App Protect をインストールします。このとき、NGINX Plus も同時にインストールされます。
$ sudo apt-get -y install app-protect
ステップ 2:インストールしたバージョンの確認
無事にインストールができましたら、インストールされたバージョンを確認します。
1. NGINX Plusのバージョンを確認
$ nginx -v
2. NGINX App Protectのバージョンを確認
$ cat /opt/app_protect/VERSION
表示例:
パッケージとしてインストールされたバージョンを確認できます。
$ sudo apt policy nginx-plus
$ sudo apt policy app-protect
表示例:
NGINX Plus は R27、NGINX App Protect は 3.954.0 がインストールされました。NGINX App Protect の 3.954.0 は NGINX App Protect WAF Release 3.11 のことです。詳細はメーカーのページで確認することができます。
NGINX App Protect WAF Release 3.11
https://docs.nginx.com/nginx-app-protect/releases/release-notes-3.11/
ステップ 3:Attack Signatureのインストール
続いて、Attack Signatureをインストールします。
Attack Signature とは、メーカーが用意した「攻撃パターン等のルールを集めたパッケージ」です。
Attack Signatureの更新は、NGINX App Protectよりも高頻度でリリースされるため、NGINX App Protectとは別の独自のパッケージでリリースされます。直近の1年間では月平均3.9回リリースされていました。
NGINX App Protectをインストールした時点で、Attack Signatureはインストールされていません。このパッケージは必ずインストールしておきましょう。
1. NGINX App ProtectのUpdatesリポジトリを追加します
$ printf "deb https://pkgs.nginx.com/app-protect-security-updates/ubuntu/ `lsb_release -cs` nginx-plus\n" | sudo tee /etc/apt/sources.list.d/app-protect-security-updates.list
2. NGINX App Protectのシグネチャサインキーをapt-keyに追加します
$ sudo wget https://cs.nginx.com/static/keys/app-protect-security-updates.key && sudo apt-key add app-protect-security-updates.key
3. リポジトリを更新します
$ sudo apt-get update
4. 最新のAttack Signatureパッケージをインストールします
$ sudo apt-get -y install app-protect-attack-signatures
インストールされたAttack Signatureパッケージを確認します。
$ sudo apt policy app-protect-attack-signatures
表示例:
2022.06.22のAttack Signatureパッケージがインストールされたことが分かります。
なお、Attack Signatureパッケージをインストールした際にログに以下のメッセージが表示されています。
In order for the signature update to take effect, NGINX must be reloaded.
インストールしたAttack Signatureパッケージを更新にするには、NGINX をリロードしなくてはいけない、と書かれてありますので、以下のコマンド実行で リロードします。
$ sudo nginx -s reload
ここで、NGINXサービスが起動されていない場合にはエラーとなります。この場合は以下のサービス起動のコマンドを実行してください。
$ sudo systemctl start nginx.service
ステップ 4:サービスの確認
ひと通りのインストール作業が終わりましたので、NGINX App Protect のサービスの稼働状況を確認します。
サービスとしては NGINX Plus と NGINX App Protect の 2つが動いているはずですので、その両方を確認します。
NGINX Plusのサービス稼働状況を確認します。
$ sudo systemctl status nginx.service
NGINX App Protectのサービス稼働状況を確認します。
$ sudo systemctl status nginx-app-protect.service
起動していない場合には、以下のコマンドで起動させます。
$ sudo systemctl start nginx.service
ステップ 5:設定と確認
無事、サービス起動も確認できましたところで、これから NGINX App Protect用の設定を追加していきます。設定を追加するまでは、WAFとして機能しません。confファイルに数行追加するだけで WAFを有効化できます。
1. nginx.confのメインコンテキストに NGINX App Protect WAFのモジュールをロードする設定を追加します
/etc/nginx/nginx.confファイルを編集します。事前にファイルのバックアップはしておいてください。
追加する設定は以下の 1行です。「 events {
」の行の前に挿入します。挿入する位置が、「 events {
」より後だとうまくいきません。
load_module modules/ngx_http_app_protect_module.so;
2. http/server/locationコンテキストに NGINX App Protect WAFを有効化する設定をします
/etc/nginx/conf.d/default.confファイルを編集します。事前にファイルのバックアップはしておいてください。
追加する設定は以下の 1行です。「 location /
」の行の後に挿入します。
app_protect_enable on;
3. NGINXサービスをリロードします
以下のコマンドを実行します。
$ sudo nginx -s reload
4. ブラウザで設定確認テスト
NGINX App Protectをインストールでき、WAFとしての設定も有効化できました。
それでは、早速、ブラウザからHTTPリクエストを投げて設定確認テストを実施してみましょう。
a) WAFが検知しない通常のHTTPリクエスト
NGINXが標準で用意している「ようこそ画面」が表示されました。設定どおりです。
b) WAFが検知するHTTPリクエスト
NGINX App Protectでブロックされた画面が表示されました。設定どおりうまくいきました。
まとめ
NGINX App Protect は手順どおりに実施すれば問題なくインストールができます。有効化もconfファイルに数行の設定を追加するだけで、直ぐに攻撃通信をブロックすることが出来ます。NGINX App Protectでプリセットされているセキュリティルールを適用するだけであれば、これだけになります。ですが、実際の運用では 検知ログを確認したり、セキュリティポリシールールをチューニングしていかなくてはいけません。
今回は、NGINX App Protectの導入をどのような流れで実施するか、という観点で紹介しました。
検知ログの確認、および、セキュリティポリシーのチューニングに関しては、また別の機会に紹介したいと思います。
今後もNGINXに関連する記事を書いていきますので、何かご要望があればご連絡ください。
<< grasys×F5×TED ブログ一覧 >>
4月27日 NGINX Plusの検証をした!(grasys様)
6月 2日 grasys×F5×TEDが徹底解析! NGINX Plusの仕組みがよくわかる!(TED)
6月9日 NGINX Plusのインストール方法とLBの基本設定(grasys様)
6月16日 NGINX PlusでJWT認証をやってみた!(TED)
6月22日 NGINX PlusのLB機能:アクティブヘルスチェック&セッション維持 (grasys様)
6月30日 NGINX Controllerをインストールしてみた!(TED)
7月7日 NGINX PlusのLB機能:DNSディスカバリー (grasys様)
7月14日 NGINX Plus Ingress Controller を触ってみた (TED)
7月25日 NGINX WAFを試してみよう! (TED)
【 株式会社grasys:https://www.grasys.io/ 】
大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。