【備忘録】mod_dosdetector をAlmaLinux9へインストールしてみた

こんにちは
今回は 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設定できるのはかなりありがたいと思いました。
また設定自体もそこまで複雑でなく、運用面でも助かりそうなので、業務でも使っていきたいツールとなりました。
それではまた

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA