Webサーバへのアタックが多くなってきたのでWAF(naxsi)を導入してみた。
自宅 Web サーバのログを確認しているとインジェクション攻撃など、サーバへのアタックが多くなっているようです。そこで NGINX 用の WAF(naxsi)を導入することにしました。当初、ModSecurity も検討しましたが、今回は Web サーバの規模も小さくシンプルで自分で一つ一つルール設定できそうな naxsi を選択することにしました。
前回のブログから 1 年以上経ってしまいました。この1年でネットワークやコンテナの構成も更新もしましたので、今は以下のような構成となっています。
ネットワークの構成は、フロントに TL-SG105E を置いてその配下に IPv6(IPoE)接続は、WSR-3200AX4S、IVP4 固定アドレス用(PPPoE)に EdgerouterX を配置。色々構成変えて試しましたが、今は、この構成で落ち着きました。またネットワークトラフィック監視用に Raspberry Pi を配置しました。ネットワーク機器のログは rsyslog コンテナに集約し、prometheus,victoria,loki 経由 grafana でモニタリングしています。この辺の備忘録はそのうち整理したいと思います。そう思って半年以上放置状態でそろそろ設定した内容忘れそうです。
naxsi のロードモジュール作成
nginx バージョンに合わせて naxsi のロードモジュール作成したいと思います。当初は、モジュールのみコンパイルして適用してみましたが、実行時に core dump を吐いていたので、原因追求はしないで、nginx 本体もコンパイルすることにしました。
16 行以降の.configure のパラメータは、稼働中の nginx 環境からパラメータを取り出して利用しました。47 行以下が本番用の Image ファイルになります。
コンパイルした結果を alpine+nginx に上書きしています。
Dockerfile
環境は、alpine+nginx+naxsi を Docker(Podman)で、nginx-1.20.2、openssl-3.0、naxsi1.3 をコンパイルします。
その他環境ファイル
nginx のその他設定は、build 配下に必要な環境ファイルを作成し deploy しています。Dockerfile の 5 行目、COPY Build/ /etc/nginx/
各環境に合わせて nginx を設定ましす。なお naxsi を利用するため default.conf を以下のようにしました。
7 行目に backend の Web サーバを設定します。最初は、10 行目の LearningMode を設定してエラーリストの内容をみながらホワイトリストを作成していきます。
11 行目のファイルに許可したいホワイトリストを追加していくことになります。
エラーリストは、コンテナ内の/var/log/naxsi.log に出力します。今回は別のサーバに syslog を転送し、このログを監視するようにしています。
ログの監視は、nginx-waf->rsyslog->promtail->prometheus,loke,victoria->grafana となっています。
ホワイトリストの作成
Web にアクセスしながらエラーリストを確認していきます。そのエラーリストに合わせてホワイトリストを作成します。小規模な Web サーバなので一つ一つエラーを確認しながらホワイトリストを作成していきました。
エラーリストの詳細は、こちらを参照してください。ルールにマッチした idN をホワイトリスト化していきます。書き方はこちらのサンプルを見ながら設定しました。Web アクセス、エラーリスト確認、ホワイトリスト追加みたいに作業を進めました。一通り確認が終わったら、default.conf の LearningMode をコメントアウトし本番適用です。
Tip【alpine+nginxのリスタート】
ホワイトリスト作成は、トライアンドエラーでやること多いので、その都度nginxのホワイトリストを読み直す必要があります。ついつい、systemctl restart nginxとやりたいところですが、alpine+nginxしかいれてませんのでnginx -s reloadで環境設定を読み直し確認していきます。・・・ついつい忘れて毎回nginx -hで確認してしまう。
確認作業
Web にアクセスしてエラーが出ないことを確認します。試しにhttps://www.akiboi.net/param=<script>xxxx</script>
と実行すると弾いてくれました。
これで一通り WAF(naxsi)の導入が完了しました。rsyslog のログのサンプルを乗せておきます。こちらのログは、naxsi のログを rsyslog に転送して、ここで ip から GeoIP を利用して地域を付加しています。
OWA インジェクション、PHPUnit の脆弱性、ThinkPHP という中国ローカルのフレームワークの脆弱みたいな感じですかね。
Grafana+loki でログ見ていると色々な脆弱性をついているなぁと感じました。