Apacheのmod_dosdetectorでDoS対策~導入までの道のり ②インストールと設定

無断転載禁止 Apacheのmod_dosdetectorでDoS対策~導入までの道のり ②インストールと設定
pic by pixabay

本記事「Apacheのmod_dosdetectorでDoS対策」は3部で構成されています。
第1部:①選定
第2部:②インストールと設定
第3部:③パラメータとログ

mod_dosdetectorのインストールと設定手順

①mod_dosdetectorダウンロード

下記サイトからmod_dosdetector-master.zipをダウンロード
https://github.com/stanaka/mod_dosdetector

Download ZIPをクリックする

dos_download-1

 

 

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部:③パラメータとログ