本記事「Apacheのmod_dosdetectorでDoS対策」は3部で構成されています。
第1部:①選定
第2部:②インストールと設定
第3部:③パラメータとログ
CONTENTS
mod_dosdetectorのインストールと設定手順
①mod_dosdetectorダウンロード
下記サイトからmod_dosdetector-master.zipをダウンロード
https://github.com/stanaka/mod_dosdetector
Download ZIPをクリックする
mod_dosdetector-master.zipがダウンロードされる。
株式会社 ラクーン様が公開してくださっているパッチをテキストファイルにコピーして保存する
下記サイト最下部にパッチテキストページへのリンクがある
http://techblog.raccoon.ne.jp/archives/36202484.html
パッチテキスト
http://techblog.raccoon.ne.jp/misc/mod_dosdetector.patch
パッチテキストが表示されたら、全体を選択してテキストエディタに貼り付ける。
mod_dosdetector.patchとして保存する。
②zipファイルとパッチをアップロード
mod_dosdetector-master.zipとmod_dosdetector.patchをサーバにアップロードする。
ファイルを作業ディレクトリに移動し、解凍する。
作業ディレクトリ:/usr/local/src
とする。
# cd /usr/local/src # ll
mod_dosdetector-master.zip
と
mod_dosdetector.patch
があること。
ファイル解凍
# unzip mod_dosdetector-master.zip # ll mod_dosdetector-master -rw-r--r-- 1 root root 1066 Oct 27 2013 Makefile -rw-r--r-- 1 root root 17057 Oct 27 2013 mod_dosdetector.c -rw-r--r-- 1 root root 1415 Oct 27 2013 mod_dosdetector.spec -rw-r--r-- 1 root root 1963 Oct 27 2013 README.md
mod_dosdetector.patch
を
/usr/local/src/mod_dosdetector-master
に移動
# mv mod_dosdetector.patch /usr/local/src/mod_dosdetector-master # cd /usr/local/src/mod_dosdetector-master # ll -rw-r--r-- 1 root root 1066 Oct 27 2013 Makefile -rw-r--r-- 1 root root 17057 Oct 27 2013 mod_dosdetector.c -rw-r--r-- 1 root root 9691 Apr 2 17:21 mod_dosdetector.patch -rw-r--r-- 1 root root 1415 Oct 27 2013 mod_dosdetector.spec -rw-r--r-- 1 root root 1963 Oct 27 2013 README.md
③Apacheモジュール:mod_soがインストールされているか確認
Includeでmod_dosdetectorモジュールを動的に読み込んで使用するために
mod_soモジュールがインストールされていることを確認する。
mod_soはコンパイル時にしか組み込むことができない。
mod_soが入っていない場合、Apacheを再コンパイルしてmod_soモジュールを追加する。
configure時に「–enable-so」を付けること。
※mod_soについての詳細は下記「動的共有オブジェクト (DSO) サポート」を参照
https://httpd.apache.org/docs/2.2/ja/dso.html
# httpd -l core.c prefork.c http_core.c mod_so.c ←これがあること
もしくは
# httpd -M | grep so_module so_module (static) ←これが存在すること
④Apacheコンパイルコマンドapxsのインストール確認
コマンドの存在有無
# which apxs
「no apxs in ~」と出力された場合、パッケージ:httpd-develがインストールされているか確認する。
# yum list installed httpd-devel
「Error: No matching Packages to list」と出力される場合はインストールされていない。
httpd-develが出力される場合は⑤へ進む。
——
◇インストール手順
インストール可能なhttpd-develの確認
# yum list httpd-devel
インストール済みのパッケージは一番右に@マークがついているので、@マークがついていないことを確認しておく。
インストール
# yum install httpd-devel
インストールパッケージ一覧を確認し、yを入力
インストール完了確認
# yum list installed httpd-devel
httpd-develが出力されること。
コンパイルコマンド存在確認
# which apxs
apxsが出力されること。
——
⑤patchコマンドの存在確認
patch:差分をオリジナルファイルに適用するコマンド
コマンドの存在有無
# which patch
「no patch in ~」と出力された場合、パッケージ:patchがインストールされているか確認する。
# yum list installed patch
「Error: No matching Packages to list」と出力される場合はインストールされていない。
patchが出力される場合は⑥へ進む。
——
◇インストール手順インストール可能なpatchの確認
# yum list patch
インストール済みのパッケージは一番右に@マークがついているので、@マークがついていないことを確認しておく。
インストール
# yum install patch
インストールパッケージ一覧を確認し、yを入力
インストール完了確認
# yum list installed patch
patchが出力されること。
コンパイルコマンド存在確認
# which patch
patchが出力されること。
——
⑥コンパイラgccコマンドの存在確認
コマンドの存在有無
# which gcc
「no gcc in ~」と出力された場合、パッケージ:gccがインストールされているか確認する。
# yum list installed gcc
「Error: No matching Packages to list」と出力される場合はインストールされていない。
gccが出力される場合は⑦へ進む。
——
◇インストール手順インストール可能なgccの確認
# yum list gcc
インストール済みのパッケージは一番右に@マークがついているので、@マークがついていないことを確認しておく。
★gccインストール前に★
Cコンパイラ(gcc)とCライブラリ(glibc)は依存関係にあり、
gccをインストールしたりアップデートしたりすると、glibcも変更される。
glibcが変更されると、タイムゾーンが/etc/sysconfig/clockで指定されているものに変わる。
タイムゾーンが戻らないように設定を確認しておくこと
# cat /etc/sysconfig/clock
デフォルトは
ZONE="UTC" UTC=true
タイムゾーンを日本(JST)にしたい場合は
ZONE="Asia/Tokyo" UTC=false
設定されていない場合は変更する
# cp -rp /etc/sysconfig/clock /etc/sysconfig/clock.org # vi /etc/sysconfig/clock ZONE="Asia/Tokyo" UTC=false
インストール
# yum install gcc
インストールパッケージ一覧を確認し、yを入力
「Updating for dependencies:」にglibcがあるかどうか確認する。
※glibcが更新される場合はカーネルやほとんどのパッケージが依存関係を持つので
更新したあとは、OSやアプリの再起動テストをすること推奨。
★SELinuxが入っている場合★
デフォルトの設定ではkernel関連の更新が除外されており、gccが依存しているkernel-headersがインストールされない。
–disableexcludes=mainを付与する
# yum --disableexcludes=main install gcc
インストール完了確認
# yum list installed gcc
gccが出力されること。
コンパイルコマンド存在確認
# which gcc
gccが出力されること。
時刻確認
# date
★タイムゾーンがUTCに戻った場合、JSTにする
# cp -rp /etc/localtime /etc/localtime.日付 # cp -rp /usr/share/zoneinfo/Japan /etc/localtime
——
⑦パッチの適用
ソースファイル:mod_dosdetector.cにmod_dosdetector.patchを適用する。
ソースを解凍したディレクトリにパッチファイルを置いておくこと。
# cd /usr/local/src/mod_dosdetector-master
パッチ適用
# patch < mod_dosdetector.patch
「patching file mod_dosdetector.c」と出力されること
⑧コンパイルコマンド編集
apxsおよびapachectlのパスは環境によって異なる場合があるので、
Makefileのapxsおよびapachectlのパスを変更する
# cp -rp Makefile Makefile.org # vi Makefile
[変更箇所]
APXS=/usr/sbin/apxs APACHECTL=apachectl
それぞれwhichコマンドで変更する必要があるか確認する。
# which apxs
/usr/sbin/apxsと異なる場合は、whichコマンド出力内容に書き換える。
# which apachectl
Apacheのインストール先をデフォルトから変更してインストールしているときは要注意。
mod_dosdetectorを適用したいApacheのapachectlパスをAPACHECTL=に記載する。
デフォルトの場合は変更する必要なし。
⑨mod_dosdetectorコンパイル
# make
リターンコード確認
# echo $?
「0」ならば成功
warningは無視してよい。
errorが出た場合は出力に従う。
gccのバージョンが古い場合はエラーになるので、アップデートする。
手順⑥を参照。
⑩mod_dosdetectorインストール
インストール
# cd /usr/local/src/mod_dosdetector-master # make install
リターンコード確認
# echo $?
「0」ならば成功
# cd /etc/httpd/conf # less httpd.conf
下記が追加されていることを確認する
LoadModule dosdetector_module モジュールパス(*1)/mod_dosdetector.so
(*1)モジュールパスは環境によって異なる
make install実行時は接続影響はなし。
make install自体は2秒で完了する。
⑪閾値のカスタマイズ
・検知閾値
・検知ログ出力
・リダイレクト設定
・リダイレクトページ
・必要に応じてログ出力
を設定する。
# vi httpd.conf
設定例)
RewriteEngine On ############################### # Dos Detector ############################### RewriteCond %{ENV:SuspectHardDoS} =1 RewriteRule ^.*$ - [R=503,L] RewriteCond %{ENV:SuspectDoS} =1 RewriteRule ^.*$ - [R=503,L] DoSDetection on DoSPeriod 1 DoSThreshold 100 DoSHardThreshold 300 DoSBanPeriod 30 DoSShmemName dosshm DoSTableSize 500 DoSIgnoreContentType image|javascript|css|application/json DoSIgnoreIpRange 127.0.0.1 DoSIgnoreIpRange 自分のIPアドレス
# sudo service httpd configtest
「Syntax OK」と出力されることを確認する
反映して有効化
# sudo service httpd graceful
正常に有効化されるとApacheのerror_logに
「Create or Joining shmem. name: 共有メモリ名, size: サイズ(自動設定?)」
が出力される。
検出されるかログを監視してみよう!
# tail -f /var/log/httpd/error_log # tail -f /var/log/httpd/access_log
設定した閾値と検出結果については次回。
本記事「Apacheのmod_dosdetectorでDoS対策」は3部で構成されています。
第1部:①選定
第2部:②インストールと設定
第3部:③パラメータとログ