質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Q&A

解決済

2回答

4164閲覧

Amazon Linux で mod_evasive が効かない。。。

退会済みユーザー

退会済みユーザー

総合スコア0

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

0グッド

0クリップ

投稿2016/01/09 04:10

編集2016/01/09 08:35

・Amazon Linux に mod_evasive を導入したい!
趣味で運営しているサーバが、何度か落ちてしまい、原因を調査しているが、妙な連続アクセス以外に不審な点が見当たらないため、mod_evasiveを導入し連続アクセスを制御したいと考えました。

・導入にあたって
yumを使うやり方とソースから導入するやり方があるようですが、yumを使うやり方を選択。

*参考にしたサイト:
Apache DoS攻撃にそなえる

AmazonLinuxはEPELリポジトリの追加は特に必要ないようなので、

yum --enablerepo=epel install mod_evasive mkdir /var/lock/mod_evasive chown apache:apache /var/lock/mod_evasive

/etc/httpd/conf.d/mod_evasive.conf を編集

#DOSLogDir "/var/lock/mod_evasive" → DOSLogDir "/var/lock/mod_evasive"

httpdリスタート
sudo /etc/init.d/httpd restart
mod_evasiveが効かない。。。

リスタートまでできたものの、以下の導入テストがいつまでたっても200のまま。。。

perl /usr/share/doc/mod_evasive-1.10.1/test.pl HTTP/1.1 200 OK HTTP/1.1 200 OK HTTP/1.1 200 OK ・ ・ ・ HTTP/1.1 200 OK HTTP/1.1 200 OK

apachectl -M で見るとevasive20_module (shared)の表示あり。
apache は
yum groupinstall -y "Web Server" "MySQL Database" "PHP Support"
で導入
Server version: Apache/2.2.31 (Unix)
Server built: Aug 13 2015 23:45:37
切り分け方法や対処方法をどなたかアドバイスいただけないでしょうか。
よろしくお願いします。

追記:httpd.confに関して
抜粋となりますが、以下で設定しています。
*ご質問頂いた対象箇所がわからなかったため、必要と思われる箇所をこちらで判断しました。確認箇所を追加でご指示いただけると幸いです。

/etc/httpd/conf/httpd.conf ・ ・ ・ Include conf.d/*.conf ・ ・ ・
/etc/httpd/conf.d/mod_evasive.conf LoadModule evasive20_module modules/mod_evasive20.so <IfModule mod_evasive20.c> # The hash table size defines the number of top-level nodes for each # child's hash table. Increasing this number will provide faster # performance by decreasing the number of iterations required to get to the # record, but consume more memory for table space. You should increase # this if you have a busy web server. The value you specify will # automatically be tiered up to the next prime number in the primes list # (see mod_evasive.c for a list of primes used). DOSHashTableSize 3097 # This is the threshhold for the number of requests for the same page (or # URI) per page interval. Once the threshhold for that interval has been # exceeded, the IP address of the client will be added to the blocking # list. DOSPageCount 2 # This is the threshhold for the total number of requests for any object by # the same client on the same listener per site interval. Once the # threshhold for that interval has been exceeded, the IP address of the # client will be added to the blocking list. DOSSiteCount 50 # The interval for the page count threshhold; defaults to 1 second # intervals. DOSPageInterval 1 # The interval for the site count threshhold; defaults to 1 second # intervals. DOSSiteInterval 1 # The blocking period is the amount of time (in seconds) that a client will # be blocked for if they are added to the blocking list. During this time, # all subsequent requests from the client will result in a 403 (Forbidden) # and the timer being reset (e.g. another 10 seconds). Since the timer is # reset for every subsequent request, it is not necessary to have a long # blocking period; in the event of a DoS attack, this timer will keep # getting reset. DOSBlockingPeriod 10 # If this value is set, an email will be sent to the address specified # whenever an IP address becomes blacklisted. A locking mechanism using # /tmp prevents continuous emails from being sent. # # NOTE: Requires /bin/mail (provided by mailx) #DOSEmailNotify you@yourdomain.com # If this value is set, the system command specified will be executed # whenever an IP address becomes blacklisted. This is designed to enable # system calls to ip filter or other tools. A locking mechanism using /tmp # prevents continuous system calls. Use %s to denote the IP address of the # blacklisted IP. #DOSSystemCommand "su - someuser -c '/sbin/... %s ...'" # Choose an alternative temp directory By default "/tmp" will be used for # locking mechanism, which opens some security issues if your system is # open to shell users. # # http://security.lss.hr/index.php?page=details&ID=LSS-2005-01-01 # # In the event you have nonprivileged shell users, you'll want to create a # directory writable only to the user Apache is running as (usually root), # then set this in your httpd.conf. DOSLogDir "/var/lock/mod_evasive" # You can use whitelists to disable the module for certain ranges of # IPs. Wildcards can be used on up to the last 3 octets if necessary. # Multiple DOSWhitelist commands may be used in the configuration. #DOSWhitelist 127.0.0.1 #DOSWhitelist 192.168.0.* </IfModule>

追記2:access_log
access_logは全て200で返ってきています。
*しきい値を超えている付近を抜粋。

127.0.0.1 - - [09/Jan/2016:08:14:17 +0000] "GET /?38 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:17 +0000] "GET /?39 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:18 +0000] "GET /?40 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:18 +0000] "GET /?41 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:18 +0000] "GET /?42 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:19 +0000] "GET /?43 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:19 +0000] "GET /?44 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:19 +0000] "GET /?45 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:20 +0000] "GET /?46 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:20 +0000] "GET /?47 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:21 +0000] "GET /?48 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [09/Jan/2016:08:14:21 +0000] "GET /?49 HTTP/1.0" 200 2926 "-" "-"

念のため、外部サーバからab -n 50 -c 10 http://サーバ名/も実施しましたがこちらも200で返ってきてます。
*しきい値を超えている付近を抜粋。ソースアドレスをXXX.XXX.XXX.XXXで置き換え

XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:07 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:07 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:08 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:09 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:11 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:11 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:11 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:11 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:11 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:11 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:11 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:11 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:12 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:14 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:15 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:15 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:15 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:15 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:15 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:15 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:15 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:16 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:16 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:18 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:19 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:19 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:19 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:19 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:19 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:19 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3" XXX.XXX.XXX.XXX - - [09/Jan/2016:08:12:19 +0000] "GET / HTTP/1.0" 200 2948 "-" "ApacheBench/2.3"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pi-chan

2016/01/09 04:48

Apache側の設定(httpd.conf)はどうなっていますか?
TaichiYanagiya

2016/01/09 07:17

インストール、設定は問題ないと思います。 /var/log/httpd/access_log に「"GET /?0 HTTP/1.0" 200 ...」、「"GET /?100 HTTP/1.0" 403 ...」といったログが出力されると思いますが、すべて 200 なのでしょうか。
退会済みユーザー

退会済みユーザー

2016/01/09 08:36

全て200で返ってきてます。ネットで検索しても皆さんすんなり導入できているようなので、トラブル箇所がわからず。。。
guest

回答2

0

ベストアンサー

Apacheが prefork モードで起動されていることを前提に話します。

確認方法は以下です。

$ apachectl -V : Server version: Apache/2.2.15 (Unix) : Server MPM: Prefork

mod_evasiveは、Apacheの子プロセス単位でチェックします。

設定を見ると、同一ページ2アクセス/秒で弾く。としているので
MaxClients 256 なら、秒間512のアクセスでやっと遮断のような気がします。

単純に MaxClientsを減らすと、リソースがまだまだ耐えられるにも関わらず
正常なリクエストも受け付けられなくなるのでダメですね。

では、MPM を event や worker に変更すれば?となりますが、
こちらはマルチスレッド動作するのでもろもろの動作検証が必要です。
(というか、動作しないケースが多いです)

prefoek モードでフリーのDoS制御であれば、
dosdetector が有名です。

こちらは複数プロセスでも、
共有メモリでカウントしてくれるので希望どおりの振る舞いが期待できるかと思います。

ここからは宣伝です。

なお、単体のウェブサーバなら共有メモリ方式で良いのですが、複数のウェブサーバが拡張・縮退するようなシステムでは、都度 閾値の再設定・再起動が必要となり運用が大変です。

よって、外部にKVSを配置してDoSチェックするようなモジュールを自作しています。
将来的に分散化をご検討であれば、こちらも利用してみてください。
doshelper

投稿2016/01/17 09:01

kurosawa

総合スコア780

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/01/17 11:01

確認方法も含め、ご提示頂いた情報、大変助かりました。 現在テストしているサーバはPreforkで動作しています。 小規模サイトに簡単に対策できそうに紹介されていたので、単純に秒間2アクセスだと思ってました。あまり期待した効果が得られないようなので、ご紹介いただいたdosdetector と doshelper を試してみます。ありがとうございました。
kurosawa

2016/01/17 11:28

yumで簡単導入とはいきませんが、mod_dosdetector でググると インストール方法や設定方法が出てくるのでそちらを参考にしてくださいませ。 単体サーバであれば、こちらで問題なく動作するはずです!
guest

0

おそらく、prefork MPM で StartServers, MaxSpareServers を大きめにしているのではないでしょうか。
mod_evasive 内部のハッシュテーブル(IPアドレス, URI, カウンタ)がメモリ上に保持されているとすると、prefork MPM の各 httpd プロセスごとにハッシュテーブルを持ち、それぞれカウントアップしていきます。

(例) StartServers 3 MaxSpareServers 3 の場合、 "GET /?0 HTTP/1.0" 200 ... (プロセス1 に新規登録, count=0) "GET /?1 HTTP/1.0" 200 ... (プロセス2 に新規登録, count=0) "GET /?2 HTTP/1.0" 200 ... (プロセス3 に新規登録, count=0) "GET /?3 HTTP/1.0" 200 ... (プロセス1 count++, count=1) "GET /?4 HTTP/1.0" 200 ... (プロセス2 count++, count=1) "GET /?5 HTTP/1.0" 200 ... (プロセス3 count++, count=1) "GET /?6 HTTP/1.0" 200 ... (プロセス1 count++, count=2) "GET /?7 HTTP/1.0" 200 ... (プロセス2 count++, count=2) "GET /?8 HTTP/1.0" 200 ... (プロセス3 count++, count=2) "GET /?9 HTTP/1.0" 403 ... (プロセス1 count>=page_count) "GET /?10 HTTP/1.0" 403 ... (プロセス2 count>=page_count) "GET /?11 HTTP/1.0" 403 ... (プロセス3 count>=page_count)

test.pl では 0〜100 (101回)までしかアクセスしないので、例えば StartServers 34 だとカウンタがしきい値を越えるまえに終了してしまいます。

投稿2016/01/10 07:54

TaichiYanagiya

総合スコア12146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/01/10 09:19

ご回答、ありがとうございます。 切り分けの手がかりもつかめなかったため、大変嬉しいです。 httpd.confの該当と思われる箇所は以下のようになっておりました。 ``` <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> ``` 動作がよくわかっていないため、34が鍵になるのだと思いますが、状況に合致するのかどうかの判断がつきません。 test.plの回数は増やせたので1000回で実施してみましたが、200で返る結果は変わりませんでした。 ご意見いただけると幸いです。
TaichiYanagiya

2016/01/10 16:09

StartServers はハズレでしたね。 access_log を見ると、1回のアクセスで 1秒ほどかかっているので、カウンタがしきい値に達する前に DOSPageInterval, DOSSiteInterval に達してカウンタがリセットされるのだと思います。 DOSPageInterval, DOSSiteInterval を、例えば 10 秒とか、それ以上にするとどうでしょうか。
退会済みユーザー

退会済みユーザー

2016/01/17 10:11

双方10秒にしてみましたが現象変わらずです。 条件としてはしきい値に届いていると思いますので、このモジュールが動作していないのでは無いかと疑っているのですが、切り分け方法が私のスキル内では無かった為、進められませんでした。なにかよい方法があればご教授ください。 127.0.0.1 - - [17/Jan/2016:10:04:26 +0000] "GET /?0 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:27 +0000] "GET /?1 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:27 +0000] "GET /?2 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:27 +0000] "GET /?3 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:28 +0000] "GET /?4 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:28 +0000] "GET /?5 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:29 +0000] "GET /?6 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:29 +0000] "GET /?7 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:30 +0000] "GET /?8 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:30 +0000] "GET /?9 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:30 +0000] "GET /?10 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:31 +0000] "GET /?11 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:31 +0000] "GET /?12 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:32 +0000] "GET /?13 HTTP/1.0" 200 2926 "-" "-" 127.0.0.1 - - [17/Jan/2016:10:04:32 +0000] "GET /?14 HTTP/1.0" 200 2926 "-" "-"
TaichiYanagiya

2016/01/17 11:38

restart 直後であれば、25回目で 403 になると思いますが、なりませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問