こんにちは
今回は AlmaLinux9 のサーバーに mod_dosdetector をインストールして動かしてみたので、それの自分用備忘録となります。
▼mod_dosdetector とは
Apacheモジュールの1つであり、DoS攻撃を検出してくれます。
なお、あくまで検出をしてくれるまでなので、実際のブロック対応はApacheのconfなどで設定する必要があります。
(今回はそこも併せて対応してみます)
▼環境
OS:AlmaLinux9
ミドルウェア:Apache 2.4
▼手順
※事前にApache側のvhostなどの設定は済ませておいてください
1. 必要なパッケージのインストール
最終的には Make インストールを実施するため、諸々必要なパッケージをインストールします
dnf install git gcc gcc-c++ make
→ Complete! が表示されればOKです
2. mod_dosdetectorのソースコードのインストール
gitから直接引っ張ってきて、Makeでインストールします
まずはsrcディレクトリまで移動します
cd /usr/local/src
git clone でソースコードを持ってきます
git clone https://github.com/stanaka/mod_dosdetector.git
ls -la
→ カレントディレクトリ直下に mod_dosdetector のディレクトリが存在すればOKです
Make インストールを実行するのでは、apxsのパスを確認します
もしここのパスとMakefile内のapxsのパスが異なると実行が失敗するので注意してください
※もしapxs自体がインストールされいない場合は、httpd-devel パッケージをdnfで入れてください
cd mod_dosdetector
パスの確認
which apxs
/usr/bin/apxs
Makefile内のapxsパスを確認します
cat Makefile | grep apxs APXS=/usr/sbin/apxs
→ sbin になっているので、binへ書き換えます
APXS=/usr/sbin/apxs
↓
APXS=/usr/bin/apxs
それではMakeインストールしてみます
make install
/usr/bin/apxs -c mod_dosdetector.c /usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -Wall -DLINUX -D_REENTRANT -D_GNU_SOURCE -I/usr/include/httpd -I/usr/includ ouch mod_dosdetector.slo /usr/lib64/apr-1/build/libtool --silent --mode=link gcc -Wl,-z,relro,-z,now -o mod_dosdetector.la -rpath /usr/lib64/httpd/modules -module -avoid-version gcc: fatal error: cannot read spec file '/usr/lib/rpm/redhat/redhat-hardened-ld': No such file or directory compilation terminated. apxs:Error: Command failed with rc=65536 . make: *** [Makefile:20: mod_dosdetector.so] Error 1
→ なるほど、gcc側で rpm-build のパッケージが足りてなさそうなので、インストールしましょう
諸々検索してみた結果下記を実行すればいけそうなのでやってみました
dnf install redhat-rpm-config
Installed: annobin-12.98-1.el9.x86_64 dwz-0.16-1.el9.x86_64 efi-srpm-macros-6-4.el9.noarch fonts-srpm-macros-1:2.0.5-7.el9.1.noarch gcc-plugin-annobin-11.5.0-11.el9.alma.1.x86_64 ghc-srpm-macros-1.5.0-6.el9.noarch go-srpm-macros-3.6.0-13.el9_7.noarch kernel-srpm-macros-1.0-14.el9.noarch llvm-filesystem-20.1.8-3.el9.x86_64 llvm-libs-20.1.8-3.el9.x86_64 lua-srpm-macros-1-6.el9.noarch ocaml-srpm-macros-6-6.el9.noarch openblas-srpm-macros-2-11.el9.noarch perl-srpm-macros-1-41.el9.noarch pyproject-srpm-macros-1.16.2-1.el9.noarch python-srpm-macros-3.9-54.el9.noarch qt5-srpm-macros-5.15.9-1.el9.noarch redhat-rpm-config-210-1.el9.alma.1.noarch rust-srpm-macros-17-4.el9.noarch
→ 最終的にこの辺りがインストールされればいけそうです
気を取り直してもう一度Makeインストールしてみます
make install
/usr/bin/apxs -c mod_dosdetector.c
/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -Wall -DLINUX -D_REENTRANT -D_GNU_SOURCE -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/include/apr-1 -c -o mod_dosdetector.lo mod_dosdetector.c && touch mod_dosdetector.slo
/usr/lib64/apr-1/build/libtool --silent --mode=link gcc -Wl,-z,relro,-z,now -o mod_dosdetector.la -rpath /usr/lib64/httpd/modules -module -avoid-version mod_dosdetector.lo
/usr/bin/ld: .libs/mod_dosdetector.o: in function `register_hooks':
/usr/local/src/mod_dosdetector/mod_dosdetector.c:514: warning: the use of `tmpnam' is dangerous, better use `mkstemp'
/usr/bin/apxs -c -i -a -n 'dosdetector' mod_dosdetector.c
/usr/lib64/apr-1/build/libtool --silent --mode=compile gcc -prefer-pic -O2 -g -Wall -DLINUX -D_REENTRANT -D_GNU_SOURCE -I/usr/include/httpd -I/usr/include/apr-1 -I/usr/include/apr-1 -c -o mod_dosdetector.lo mod_dosdetector.c && touch mod_dosdetector.slo
/usr/lib64/apr-1/build/libtool --silent --mode=link gcc -Wl,-z,relro,-z,now -o mod_dosdetector.la -rpath /usr/lib64/httpd/modules -module -avoid-version mod_dosdetector.lo
/usr/bin/ld: .libs/mod_dosdetector.o: in function `register_hooks':
/usr/local/src/mod_dosdetector/mod_dosdetector.c:514: warning: the use of `tmpnam' is dangerous, better use `mkstemp'
/usr/lib64/httpd/build/instdso.sh SH_LIBTOOL='/usr/lib64/apr-1/build/libtool' mod_dosdetector.la /usr/lib64/httpd/modules
/usr/lib64/apr-1/build/libtool --mode=install install mod_dosdetector.la /usr/lib64/httpd/modules/
libtool: install: install .libs/mod_dosdetector.so /usr/lib64/httpd/modules/mod_dosdetector.so
libtool: install: install .libs/mod_dosdetector.lai /usr/lib64/httpd/modules/mod_dosdetector.la
libtool: finish: PATH="/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin" ldconfig -n /usr/lib64/httpd/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib64/httpd/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the 'LD_RUN_PATH' environment variable
during linking
- use the '-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to '/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib64/httpd/modules/mod_dosdetector.so
[activating module `dosdetector' in /etc/httpd/conf/httpd.conf]
→ エラーが発生しておらず、mod_dosdetector.so の有効化 + Apache のconfも読み込まれてそうです
3. mod_dosdetector の設定変更
まずは mod_dosdetector 用の設定ファイルを個別に作成します
vi /etc/httpd/conf.modules.d/dosdetector.conf
<IfModule dosdetector_module> DoSDetection on DoSPeriod 5 DoSThreshold 10 DoSBanPeriod 30 DoSTableSize 600 DoSIgnoreContentType ^(image/|application/|text/javascript|text/css) </IfModule>
→ 各種設定値についてはこちらのgithubを参照していただけますと幸いです
なお、やりたいこととしては、10秒間に5回以上アクセスがあれば、「SuspectDoS」に判定する(SuspectDoSの判定は20秒で解除されます)
また、画像系はブラウザからアクセスするたびに大量に読み込まれるので、検査対象外にします
confファイルを新規作成したので、設定反映のためApacheを再起動します
httpd -t
systemctl restart httpd
4. Apache側でのブロック設定
まずは試しにF5連打でApacheへリクエストを送信し、エラーログに記録される確認します
[:notice] [pid 4074410:tid 4074445] dosdetector: 'xxxx.xxxx.xxxx.xxxx' is suspected as DoS attack! (counter: 11)
→Apacheのエラーログへこのように出力されれば、OKです
次にApacheのconfファイルにて「SuspectDoS」判定されたものを 403 へリダイレクトする設定を追加します
<VirtualHost *:443>
~省略~
RewriteEngine On
RewriteCond %{ENV:SuspectDoS} =1
RewriteCond %{REMOTE_ADDR} !127.0.0.1
RewriteRule .* - [R=403,L]
</VirtualHost>
Apacheを再起動します
httpd -t
systemctl restart httpd
最後にもう一度F5を連打し、今度はブラウザ上に403のエラー画面が表示されればOKです
▼おわりに
いかがでしたでしょうか?
私的には、通常はSaaSのWAF製品などを利用してDDoS対策をしますが、OSSでここまで簡単にDDoS設定できるのはかなりありがたいと思いました。
また設定自体もそこまで複雑でなく、運用面でも助かりそうなので、業務でも使っていきたいツールとなりました。
それではまた