この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
iptables設定の再調整を行う
iptablesを設定して日本のIPだけを許可するでしばらく運用していましたが、日々監視を行っていて、都度気になるものは調整しており、そのやったことを纏めておこうと思います。
mod_evasiveをインストールしていたので、その条件にひっかかっていたIPアドレスが8個ありました。
# cd /var/log/mod_evasive
# ls -lrt
-rw-r--r-- 1 apache apache 5 Mar 29 05:51 dos-142.4.114.13
-rw-r--r-- 1 apache apache 5 Mar 29 07:37 dos-199.192.152.154
-rw-r--r-- 1 apache apache 5 Mar 29 07:58 dos-199.192.159.229
-rw-r--r-- 1 apache apache 5 Mar 29 09:58 dos-199.36.73.20
-rw-r--r-- 1 apache apache 5 Mar 29 11:10 dos-67.198.150.242
-rw-r--r-- 1 apache apache 5 Mar 29 11:32 dos-198.100.97.140
-rw-r--r-- 1 apache apache 5 Mar 29 16:37 dos-67.198.158.170
-rw-r--r-- 1 apache apache 5 Mar 29 16:44 dos-199.192.156.253
今立ち上げているサイトは特にサービスを提供している訳ではないので、そもそも不要なリクエストなのは確定です。よって明示的にアクセスを遮断するように上記IPをiptablesに追加しました。
この設定を追加した後は特にmod_evasiveの条件に合致したIPは増えていません。
日本のIPリストからも不正なリクエストが来ていましたのでそれも遮断。(下記IPからの不正リクエストは結構な数でした。)211.3.200.236をググってみるとSpamっぽい感じでした。
# iptables -I INPUT -s 61.198.216.135 -j DROP
# iptables -I INPUT -s 211.3.200.236 -j DROP
次にapacheのアクセスログを見てみると"GET /sprawdza.php HTTP/1.1"という不正なリクエストがありました。当然そんなファイルは存在しないので、404エラーとなっていますが気持ち悪いので特定文字列が含まれていた場合に遮断するように設定しておこうと思います。
特定の文字列を含むリクエストを遮断する
ということで、sprawdza.phpが含まれていた場合に遮断するようにiptablesを追加しました。(あともう1つ不正なものがあったので、それも合わせて遮断するようにしました。
/user/soapCaller.bsをググってみると、まぁ不正リクエスト確定ですねw
オープンソースCMSであるDrupalの脆弱性を狙ったと思われるアクセスっぽいです
# iptables -I INPUT -m string --to 60 --algo bm --string "/sprawdza.php" -j DROP
# iptables -I INPUT -m string --to 60 --algo bm --string "/user/soapCaller.bs" -j DROP
# iptables -nL | more
Chain INPUT (policy DROP)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/user/soapCaller.bs" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/sprawdza.php" ALGO name bm TO 60
遮断されているかを確認する
まずはiptables設定前の状態でアクセスすると当然404エラーが返ってきています。
次にiptablesを設定後に同じリクエストを出した場合
遮断できていますね。apacheのログにも当然残らないのでこれでいいかな。
ということで、取り急ぎ2つ設定してみましたが、下記のURLリクエスト文字列も遮断した方がよさそうだったので、ついでに遮断しておきました。
- /w00tw00t.at.
- /phpMyAdmin
- /azenz
- /admin/
- /websql/
- /myadmin/
- /xampp/
- /manager/
# iptables -I INPUT -m string --to 60 --algo bm --string "/phpMyAdmin" -j DROP
# iptables -I INPUT -m string --to 60 --algo bm --string "/w00tw00t.at." -j DROP
# iptables -I INPUT -m string --to 60 --algo bm --string "/admin/" -j DROP
# iptables -I INPUT -m string --to 60 --algo bm --string "/azenz" -j DROP
# iptables -I INPUT -m string --to 60 --algo bm --string "/websql/" -j DROP
# iptables -I INPUT -m string --to 60 --algo bm --string "/myadmin/" -j DROP
# iptables -I INPUT -m string --to 60 --algo bm --string "/xampp/" -j DROP
# iptables -I INPUT -m string --to 60 --algo bm --string "/manager/" -j DROP
# iptables -nL | more
Chain INPUT (policy DROP)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/manager/" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/xampp/" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/myadmin/" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/websql/" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/azenz" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/admin/" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/w00tw00t.at." ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/phpMyAdmin" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/user/soapCaller.bs" ALGO name bm TO 60
DROP all -- 0.0.0.0/0 0.0.0.0/0 STRING match "/sprawdza.php" ALGO name bm TO 60
iptablesのstringに関するオプションの意味はman iptablesで確認できます。(どうやらstringオプションはlinuxカーネルのバージョンが2.6.14以上である必要があるようです。)
# man iptables
string
This modules matches a given string by using some pattern matching strategy. It requires a linux ker-
nel >= 2.6.14.
--algo {bm|kmp}
Select the pattern matching strategy. (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)
--from offset
Set the offset from which it starts looking for any matching. If not passed, default is 0.
--to offset
Set the offset from which it starts looking for any matching. If not passed, default is the
packet size.
[!] --string pattern
Matches the given pattern.
[!] --hex-string pattern
Matches the given pattern in hex notation.
これでまたしばらく様子を見てみようと思います。