fail2ban で "Shellshock" 狙いの Web アクセスをブロック

OpenSSL の件といい、今年はなんか広範に利用されているもので脆弱性が見つかってテンヤワンヤということが多いようなきがするんですけど、今度は Linux などでログインシェルとして利用される機会の多い bash にも脆弱性が見つかってテンヤワンヤになっている、と…。

GNU bash の環境変数の処理には脆弱性があります。外部からの入力が、GNU bash の環境変数に設定される環境において、遠隔の第三者によって任意のコードが実行される可能性があります。

[From GNU bash の脆弱性に関する注意喚起]

勿論、bash 自身を脆弱性対策の出来ているものに入れ替えるのは当然として、コレを悪用した Web アクセスが、行われているという話も出てきているので、そちらは fail2ban を使って対処できないかと調べてみたら、既に対応のための設定をしている例をいくつか見るけることが出来る。

いつくか見つかった中から、以下のものを参考に設定をしてみたので、書き出しておく。
CyberGuerrilla soApboX » Fail2ban for bash vulnerability (Shellshock)

ログを確認して、引っ掛けるためのパターンを考える

まず、どういう文字列がログに出てきたら Shellshock に対するアクセスなのかを考えるために、apache のログをチェック。
"(){" という文字列が含まれていたら、そのアクセスだというので、 grep でチェックしてみると、うちでは次のようなのが数件見つかった。

nexus01:~# grep "() {" /var/log/apache2/access.log
8.37.217.199 - - [12/Oct/2014:12:42:44 +0900] "GET / HTTP/1.1" 200 3543 "() { :;};echo;echo \"bba3\"'14d9'6cf56d45d06c7836d94e1ee8;echo;exit" "() { :;};echo;echo \"bba3\"'14d9'6cf56d45d06c7836d94e1ee8;echo;exit"
8.37.217.198 - - [12/Oct/2014:12:42:44 +0900] "GET / HTTP/1.1" 200 3543 "() { (a)=>\\' bash -c 'echo;echo \"bba3\"'14d9'6cf56d45d06c7836d94e1ee8;echo;exit" "() { (a)=>\\' bash -c 'echo;echo \"bba3\"'14d9'6cf56d45d06c7836d94e1ee8;echo;exit”
<< 以下略 >>

今のところ、 ”() { :;};” と ”() { (a)” の 2 パターンだけのようなので、この二つと念のため "bash -c" というのが含まれていた場合に、fail2ban によるアクセス制限を掛けるようにすることに。
アクセスのパターンが変われば、それに合わせて対処すればいいよね、ということで。


fail2ban の設定を変える

とりあえず、検知のパターンを決めたので、それに対応した設定を fail2ban に反映させます。

今回は、以下のように設定。

nexus01:~# more /etc/fail2ban/filter.d/bash.conf
[Definition]
bashfragments_01 = \(\) \{ :;\};|\(\) \{ \(a\)
bashfragments_02 = bash -c
failregex = ^<HOST> -.* "(?:%(bashfragments_01)s)|(?:%(bashfragments_02)s)
ignoreregex =
nexus01:~# more /etc/fail2ban/jail.local
[BASH]
enabled      = true
port      = http,https
filter      = bash
action      = iptables-allports[name=BASH]
        sendmail-whois-lines[name=BASH, dest=root@downtown.jp]
log path  = /var/log/apache2/access.log
maxretry = 1

/etc/fail2ban/filter.d/bash.conf に検知パターンを、/etc/fail2ban/jail.local に検知した際の挙動を記述。アクセス禁止期間とかは、サイトごとの事情とかお好みで調整しておけばいいでしょう。
その後、 fail2ban-regex を使って、正しく検知が出来るかを確認。

nexus01:~# fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/bash.conf
Running tests
=============
Use   failregex file : /etc/fail2ban/filter.d/bash.conf
Use         log file : /var/log/apache2/access.log
Results
=======
Failregex: 16 total
|-  #) [# of hits] regular expression
|   1) [16] ^<HOST> -.* "(?:\(\) \{ :;\};|\(\) \{ \(a\))|(?:bash -c)
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
|  [8720] Day/MONTH/Year:Hour:Minute:Second
`-
Lines: 8720 lines, 0 ignored, 16 matched, 8704 missed
Missed line(s): too many to print.  Use --print-all-missed to print all 8704 lines

想定通りの検知をしていることが確認できたら、 fail2ban を再起動して、完了。

半日ぐらい待って、想定通りの検知メールが届いていれば、動作は正常ということになります。

トラックバック(1)

fail2banを使い始めて暫く経ったのだけど、どうもアップデートをしたタイミン... 続きを読む

コメントする