iptables設定後の調整

2013.04.04

この記事は公開されてから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_etc1

次にiptablesを設定後に同じリクエストを出した場合

iptables_etc2

遮断できていますね。apacheのログにも当然残らないのでこれでいいかな。

ということで、取り急ぎ2つ設定してみましたが、下記のURLリクエスト文字列も遮断した方がよさそうだったので、ついでに遮断しておきました。

  1. /w00tw00t.at.
  2. /phpMyAdmin
  3. /azenz
  4. /admin/
  5. /websql/
  6. /myadmin/
  7. /xampp/
  8. /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.

これでまたしばらく様子を見てみようと思います。