Blog
ブログ

2024年12月07日

NGINXでのセキュリティー設定・安全なサーバー構築のためのベストプラクティス ー SOHOBB AI/BI Advent Calendar 2024

はじめに

こんにちは!AI/BI部のK.です。

 

インターネット上の脅威が日々進化する中、Webサーバーのセキュリティを確保することは、もはや選択肢ではなく必須の要件となっています。特にNginxを使用するUbuntuサーバーの場合、効果的なセキュリティ対策が重要です。本記事では、ModSecurityとCrowdsecという2つの強力なセキュリティツールを使用して、Nginxサーバーの防御力を高める具体的な手順を解説します。これらのツールを適切に設定することで、一般的なWeb攻撃からサーバーを保護し、システムの安全性を大幅に向上させることができます。

 

*この記事では、概念については詳しく説明せず、簡単に説明します。この記事では、サーバーの安全性を高めるためのセットアップと構築の手順に焦点を当てます。

nginxとは

nginx(エンジンエックス・engine-Xという読み方)は、高速なWebサーバーソフトウェアです。多くのWebサイトで利用されており、リバースプロキシ機能や負荷分散機能を持っているため、効率的にリソースを管理できます。

WAF(Web Application Firewall)とは

WAF(ワフ:Webアプリケーションファイアウォール)は、Webアプリケーションの脆弱性を悪用した「個人情報の窃取」や「Webサイト改ざん」などの攻撃からWebサイトを保護するツールです。

ModSecurityとは

ModSecurityは、Apache ServerやNginx、Microsoft IISのモジュールで、Webサーバーのモジュールとしてインストールするホスト型WAFです。ApacheやNginx、IISを運用しているエンジニアにとっては、インストールの手順も難しくありません。

CrowdSecとは

CrowdSecは、IP動作解析とIPレピュテーションの両方に依存する無料のオープンソースの大規模マルチプレイヤー・ファイアウォールです。CrowdSecは訪問者の行動を分析し、あらゆる種類の攻撃に対して適応した対応を提供します。このソリューションを使用すると、ユーザー同士で相互に保護することができます。インターネット・プロトコル (IP) がブロックされるたびにコミュニティメンバーに通知が送信されるため、各自でIPをブロックすることができます。このソリューションは、6大陸100か国以上の顧客に使用されています。

現状(前提/背景)

  • – パブリックIPを持って、ポートを開いて、ウェブサービスなどを公開している
  • – nginxを使って、すでにHTTPS、ドメイン証明書設定してあり
  • – 対象OS:Ubuntu 22.0.5 LTS(Jammy)

 

ModSecurityインストール

 

Ubuntuに必要なdependenciesをインストール:

sudo apt update && sudo apt upgrade
sudo apt install gcc make build-essential autoconf automake libtool \
libcurl4-openssl-dev liblua5.3-dev libfuzzy-dev ssdeep gettext pkg-config \
libgeoip-dev libyajl-dev doxygen libpcre++-dev libpcre2-16-0 libpcre2-dev \
libpcre2-posix3 zlib1g zlib1g-dev pkgconf libxslt1-dev libgd-dev liblmdb-dev \
libpcre3-dev libssl-dev libxml2-dev -y

 

現在インストールされているnginxバージョン:

nginx -V
nginx version: nginx/1.27.1
                    ^^^^^^^^

上記だと、バージョンは 1.27.1 となります。

 

nginxとModSecurityのソースコードをダウンロードする:
cd /usr/local/src
git clone --recursive https://github.com/owasp-modsecurity/ModSecurity ModSecurity
git clone https://github.com/SpiderLabs/ModSecurity-nginx
wget http://nginx.org/download/nginx-1.27.1.tar.gz
#                                    ^^^^^^
#                                    バージョンを変えてください

 

ModSecurityをコンパイルとインストール

cd ModSecurity
chmod a+x ./build.sh
./build.sh
./configure
make
sudo make install

 

nginxモジュールをコンパイル

tar -xvzf nginx-1.27.1.tar.gz
cd nginx-1.27.1
./configure \
--with-compat \
--with-openssl=/usr/include/openssl/ \
--add-dynamic-module=/usr/local/src/ModSecurity-nginx
make modules

 

ModSecurityのnginxモジュールをインストール

cp objs/ngx_http_modsecurity_module.so /usr/share/nginx/modules/
sudo cp /opt/ModSecurity/modsecurity.conf-recommended /etc/nginx/modsecurity.conf
sudo cp /opt/ModSecurity/unicode.mapping /etc/nginx/unicode.mapping
sudo touch /etc/nginx/modules-enabled/50-mod-http-modsecurity.conf
sudo nano /etc/nginx/modules-enabled/50-mod-http-modsecurity.conf
# 以下のラインを貼り付け
load_module /usr/share/nginx/modules/ngx_http_modsecurity_module.so;
# 保存する(ESC:wq)

 

nginx設定:

sudo vi /etc/nginx/nginx.conf

http { の直下に以下のラインを追加する:

modsecurity on;
modsecurity_rules_file /etc/nginx/modsecurity.conf;

 

保存する。

CORE RULE SET(CRS)の設定

git clone https://github.com/coreruleset/coreruleset.git /etc/nginx/owasp-crs
sudo cp /etc/nginx/owasp-crs/crs-setup.conf{.example,}
sudo vi /etc/nginx/modsecurity.conf

ファイルの一番下に以下を追記する

Include owasp-crs/crs-setup.conf
Include owasp-crs/rules/*.conf

 

BONUS/EXAMPLE CRS設定(/etc/nginx/modsecurity.conf):

# これを検索
SecRuleEngine DetectionOnly
# 以下のように編集する
SecRuleEngine On

SecRuleEngineはOn|Off|DetectionOnlyを設定することができ、ModSecurityのON/OFFとログ記録のみのモードに設定できます。

 

# これを検索
SecAuditLogParts ABIJDEFHZ
# 以下のように編集する
SecAuditLogParts ABCEFHJKZ

SecAuditLogPartsは監査ログにどのパートの情報をロギングするかをアルファベットで指定します。
パートは以下の通りです。
A AuditLogヘッダー
B リクエストヘッダー
C リクエストボディ
D Reserved
E レスポンスボディ
F レスポンスヘッダー
G Reserved
H 追加情報。パターンにマッチしたアクセスだとここにタグが付与される。
I ファイルを除外した、コンパクトなリクエストボディ
J Reserved
K トランザクションにマッチした全てのルール
Z 最後の境界線

 

# これを検索
SecResponseBodyAccess Off
# 以下のように編集する
SecResponseBodyAccess On

 

レスポンスボディをバッファするかどうかをON|OFFで設定します。 レスポンスボディに監査対象が存在する場合、SecAuditLogPartsで「C リクエストボディ」を指定する場合はONがいいのだと思います。

 

他の設定ルールはこちらで参考する。

最後に、nginxを再起動
sudo systemctl restart nginx

 

XSS test

curl 'http://www.example.com/?q="><script>alert(1)</script>'

 

SQL injection test

curl "http://www.example.com/?q='1 OR 1=1"

CrowdSecをインストール

公式ドキュメントインストールガイド:Installation Linux

sudo apt update
sudo apt install -y curl gnupg apt-transport-https

 

Security Engineをインストール

mkdir -p /etc/apt/keyrings/
curl -fsSL https://packagecloud.io/crowdsec/crowdsec/gpgkey | gpg --dearmor > /etc/apt/keyrings/crowdsec_crowdsec-archive-keyring.gpg
sudo vi /etc/apt/sources.list.d/crowdsec_crowdsec.list

 

以下の行を追記:
deb [signed-by=/etc/apt/keyrings/crowdsec_crowdsec-archive-keyring.gpg] https://packagecloud.io/crowdsec/crowdsec/any any main
deb-src [signed-by=/etc/apt/keyrings/crowdsec_crowdsec-archive-keyring.gpg] https://packagecloud.io/crowdsec/crowdsec/any any main

保存する。

sudo apt update && sudo apt install -y crowdsec

Security Engine自体は検出エンジンであり、何もブロックしません。決定を強制するにはRemediation Componentをインストールする必要があります。

 

Remediation Componentをインストール:

sudo apt install crowdsec-firewall-bouncer-iptables

 

nginx bouncer(nginx remediation component)をインストール:

sudo apt install nginx lua5.1 libnginx-mod-http-lua luarocks gettext-base lua-cjson
sudo apt install crowdsec-nginx-bouncer

 

パブリックIPを禁止リスト (決定) に追加することでテストできます。

cscli decisions add --ip xxx.xxx.xxx.xxx

 

サーバーから以下のようにメッセージ表示するはずです。

 

そうしたら、設定するのが完了しました。

 

最後に、IPを禁止解除したかったら、以下のcliコマンドを使います。

cscli decisions delete --ip xxx.xxx.xxx.xxx

結論

ModSecurityとCrowdsecの導入により、Ubuntuサーバー上のNginxの安全性を大幅に向上させることができます。これらのセキュリティツールは、リアルタイムの脅威検出、トラフィックフィルタリング、攻撃の緩和において強力な防御層を提供します。ただし、セキュリティは継続的なプロセスであることを忘れてはいけません。定期的な設定の見直し、ルールの更新、システムの監視は、常に最新の脅威から保護するために不可欠です。また、これらのツールは万能ではないため、他のセキュリティ対策と組み合わせて使用することが重要です。サーバーのセキュリティを維持するには、継続的な学習、更新、そして警戒を怠らない姿勢が求められます。

このページの先頭へ