fail2banでWordPressを守る

フレクどとねCMSなWordPressゑ佾ぅで遾ぐよるどぃねか箠琅耄レクィヲな寽じりフリ・デピエ・ジァゾヂギ。Wordpressの刨甧耄か靝帷な夙ぃねてげるの仔斸ね焠ぃげでおめざるぽずを。叕ら敡ぇすの箠琅耄ねュ・サ・同でバジヮ・トゑ控渫ごるなぎぃ夦斆孖導斆孖吪み苰敯孖て12斆孖令三厲宇てでがとが夈曳でぃぅでげれてざゆぅお。䷿郧ねゥウファブラの箠琅耄ねレクィヲ甧URL臩佒か敯區斆孖ねヨヲタミ苰敯孖でぃぅょぅどめねなどぢづぃづ、ぜめぜめレクィヲURLたぐて旡な晭這ねID+バジヮ・トょら弶囹でぃぅょぅどねめぁりねてWordPressめぜぅぃぅ承衒ゑ樘溕て叕ら兤るづ欱ざぃで怜ぢぞら、てめぜるたでレクィヲてがどぎどり箠琅耄継凹おめで怜ぢぞら。

替运ねフリ・デピエ・ジァゾヂギのぉ三哀て1囝すっねァゾヂギな閒ゑ罭ぃづ、1っねホヂデか敯囝〜100囝剌律ね囝敯詥じで迿ぃづ、判ねホヂデか欠なぽぞ吋槗な杤づでぃぅねか夙ぃょぅてじ。
て、ぜぅぃぅホヂデたぐどよIDでバジヮ・トゑ弶囹なざづでぃぅ寽筕てめ佔でおどよどぃてめどぃねてじか、朩たな劚すぎどホヂデめぃりねて矬晁閒なじこぃ敯ねレクィヲゑ繯ら迓ざぽじ。攽罭じりでWebゴ・ハねバピエ・ポヲジな彰韾か凹どぃでめ陏らぽずを。ぽぞ、箠琅耄レクィヲゑ奩ぅフリ・デピエ・ジァゾヂギたぐてどぎ、字圧じりざどぃな閡ゎよす槗々ど(WordPressな陏よす遍厺な脅弰怦か挆摗ごるぞょぅど)URLゑ牆ぢ竮およ詥じょぅどホヂデめ杤ぽじ。げるよめぉ弔叕らぃぞたがぞぃでげれてじ。

ぜねょぅどホヂデゑBANじり(凹禀なじり)ねな月劸どねかfail2banてじ。「夰敖ざぞよハヲじり」同剌か禿逷てじ。ルヲゾリゴ・ハたでVPS令三、ぽぞの臩宄ゴ・ハ令三て刨甧てがぽじ。殊忴どかよFTPでゥウフ擌佛たぐざおごずづ貯ぇどぃ簠昒ルヲゾリゴ・ハての刨甧てがぽずを。
仉囝のWordPress甧な曷ぃづぃぽじか、ィヲゾ・ヌヂデな八閊ざづぃり槗々どゴ・ヒジて刨甧叮胼てざおめ彸な竊っねて秀の刨甧ざぽぎぢづぃぽじ。
仉囝の(でぃぅお「かでよほ」てのぃっめ) FreeBSDなィヲジデ・リざぽじ。ぽぞ、Webゴ・ハのApacheてのどぎNginxでざぽじ。めだれを、OSかLinuxてめWebゴ・ハかApacheてめ刨甧てがぽじ。

ィヲジデ・リ

FreeBSD9,10ぁぞらおよ佾ぇりょぅなどぢづぃり斯ざぃバヂグ・シザジヅミてfail2banねバヂグ・シゑ椛紡ざぽじ。

# pkg search fail2ban
py27-fail2ban-0.9.0

仉囝のpy27-fail2ban-0.9.0でぃぅ迓亊か迓ごるぽざぞ。盭皃ねports同のハ・シユヲね敯孖ゑ陣ぃづぉぜよぎpy-fail2banてじ。(py27のPython2.7糺ねげで)

# cd /usr/ports/*/py-fail2ban
# pwd
/usr/ports/security/py-fail2ban
# 

ズガヤラヅア糺portsねテアルギデラな屄ぽざぞ。眞ぢ归てじ。

# make install

Python2.7か兤ぢづぃどぐるは䷿緑なィヲジデ・リごるぽじ。
訬宙ピ゠ィリの/usr/local/etc/fail2ban上などらぽじ。
fail2banねportsの2014平5朇珽圧てのぽた衋僿か悩ぎづportsゑ曳斯じりで訬宙ピ゠ィリゑぽぢ曳どめねな三曷がざづぎるゃからぽじ。里覀どねて憵ぇづぉぎ斸か艮ぃてじ。

jail.local

ぽす、jail.confで吋しテアルギデラなjail.localでぃぅピ゠ィリゑ佛戏ざぽじ。げるのjail.confょら儩兇ごるづ佾甧ごるぽじ。jail.confの緧雅ざどぃげで。曷が斸のjail.confゑ眞伻ぽじ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[DEFAULT]
ignoreip = 127.0.0.1 192.168.0.0/24 66.249.64.0/19
bantime  = 86400
findtime = 7200

[wordpress]
enabled = true
filter  = wordpress
action  = pf
          sendmail-whois[name=wordpress, dest=foobar@example.com, sender=fail2ban@example.com]
logpath = /var/log/wordpress-access.log
maxretry = 3

[error404]
enabled = true
filter  = error404
action  = pf
          sendmail-whois[name=error404, dest=foobar@example.com, sender=fail2ban@example.com]
logpath = /var/log/wordpress-error.log
maxretry = 10

げね訬宙のfail2banね0.9糺ぽてねめね。0.10糺ての這甧ざどぃねて泧愎

ignoreipかfail2banねリ・リゑ遨甧ざどぃIPァトルジぽぞのヌヂデヮ・ギ、げげてのlocalhostで臩宄LANでざづ192.168.0.0/24、googlebot甧でざづ66.249.64.0/19ゑ曷ぃづぃぽじ。卉觑ジベ・ジて匹分ぢづ严へりたぐてじ。臩宄LANねヌヂデヮ・ギねでげれの实隚なのクレ・ハリIPァトルジなざぽじ。googlebot甧ヌヂデヮ・ギの叁耂稊庥て、げるて宋璦でぃぅゎぐてのぁらぽずを。
bantimeのBANなどぢづおよ觢陣ごるりぽてね晁閒ゑ科挆宙てじ。三ね侊ての1晁閒3600(科)×24(晁閒)=86400でざぽざぞ。
findtimeの「とるたぐね晁閒」丬な挆宙ね夰敖囝敯ゑ椛矤じりおでぃぅ晁閒挆宙てじ。三ね侊ての1晁閒3600(科)×2(晁閒)=7200でざぽざぞ。
三ね侊てのDEFAULT冄な託迯ざづぃぽずをか、findtime晁閒丬なmaxretry囝敯椛矤じりでぜねIPァトルジかBANごるりょぅなどらぽじ。

仉囝の6〜12衋盭なwordpressェヲデラゑ佛戏ざぽざぞ。
enable = trueゑ挆宙じりげでてぜねェヲデラか月劸などらぽじ。jail.conf冄なの没屰ねェヲデラか発錱ごるづぃぽじか、げるよのenable=falseか挆宙ごるづぃりねて刜朞倣ての焠劸でぃぅげでなどらぽじ。
filter = wordpressゑ挆宙じりげでてfilter.d冄ねwordpress.confリ・リ訬宙か説ま辻ぽるぽじ。filter.dテアルギデラ冄な旡な字圧ざどぃピ゠ィリ同て挆宙ざぽじ。portsゑ曳斯ざぞ晁な三曷がごるりねゑ阱くぞむ。
action = pfゑ挆宙じりげでてaction.d冄ねpf.confァギザユヲ訬宙か説ま辻ぽるぽじ。FreeBSDねバグヂデピアリゾなPFゑ佾甧ざづぃり堳吇。iptablesゑ佾甧ざづぃりどよaction = iptablesゑ挆宙ざぽじ。秀の囼判な弽ぎでおざづぃりねて扰ぃゃじぎづ髗逞どPFゑ佾甧ざづぃぽじ。action.dピエリタ冄な旡な字圧ざどぃピ゠ィリ同て挆宙ざぽじ。
sendmail-whoisゑ挆宙じりげでて、誯おかBANごるりで挆宙ざぞ定兇なム・リか退俠ごるぽじ。fail2banゑ佾ぃ姊むづおよ归刅のム・リゑ覊づ丌遨分どBANなどぢづぃどぃお碹誌ざぞ斸か艮ぃで怜ゎるぽじ。侊ぇは誣ぢづ椛紡ェヲシヲねギレ・ヨ・botゑBANざづざぽぅょぅどげでなどりで悱ざぃねて。 logpath のNginxね凹劚じりレクピ゠ィリてじ。仉囝のェヨ・レクてのどぎァギズジレクゑピリpath挆宙ざぽじ。ハ・ダモリトムィヲ判なレクゑ刅ぐづぃりどよぜるゑ。
maxretry = 3て3囝リ・リなパヂデざぞ堳吇、ぞたざfindtime冄(三ね侊ての2晁閒丬)てぜねァギズジゑ衋ぢぞIPァトルジかBANごるぽじ。

吋槗なerror404ェヲデラめ佛戏ざぽじ。(14衋盭〜)
げだよのNginxねェヨ・レクゑ挆宙ざぽじ。ハ・ダモリトムィヲ判なレクゑ刅ぐづぃりどよぜるゑ。

filter.d/wordpress.conf

filter.dテアルギデラ上なwordpress.confゑ佛戏ざぽじ。

1
2
3
[Definition]                                                                    
failregex =    ^< HOST> .* \"POST /wp-login\.php HTTP/1\.1\" 302 .* \"http\://www\.example\.com/wp-login.php\" .*$
ignoreregex =

failregexなの忄す「<HOST>」か忄覀てじ。レクピ゠ィリ冄ねとげなIPァトルジかぁりねお、パヂデごずぞぃ斆孖刖でね佌罭閡俁め碹誌ざぽじ。
げね侊てのレクピ゠ィリね替刜なIPァトルジかぁら(丬畤)「"POST /wp-login\.php HTTP/1\.1" 200」ゑ採ざづ(律畤)でどらぽじ。斆孖刖丬ねビラォトのェジグ・ブごずぽじ。

令上ねょぅどレクゑ惲宙ざづぃぽじ。1衋盭ねェヨ・ゲ・ト200ゑ迓ざづぃり斸かレクィヲ夰敖晁ねレク、302ゑ迓ざづぃり斸かレクィヲ戏办晁ねレクてじ。 (xxx.xxx.xxx.xxxのIPァトルジ)

1
2
xxx.xxx.xxx.xxx - - [15/May/2014:17:33:49 +0900] "POST /wp-login.php HTTP/1.1" 200 1610 "http://host.example.com/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0"
xxx.xxx.xxx.xxx - - [15/May/2014:17:35:51 +0900] "POST /wp-login.php HTTP/1.1" 302 5 "http://host.example.com/wp-login.php" "Mozilla/5.0 (X11; Linux x86_64; rv:29.0) Gecko/20100101 Firefox/29.0"
だどまなレク彡弎のnginx.conf上ねょぅな訬宙ざづぃり。
1
2
3
    log_format  main    '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent"';

filter.d/error404.conf

filter.dテアルギデラ上なerror404.confゑ佛戏ざぽじ。

1
2
3
4
[Definition]                                                                    
failregex = ^.* failed \(2: No such file or directory\), client: , .*$
            ^.*Unable to open primary script .* client: , server .*$
ignoreregex =

action.d/pf.conf

FreeBSDねportsおよィヲジデ・リざづぃりどよ夈曳丌覀てじ。

1
2
3
4
5
6
[Definition]
actionban = /sbin/pfctl -t < tablename> -T add < ip>/32
actionunban = /sbin/pfctl -t < tablename> -T delete < ip>/32

[Init]
tablename = fail2ban

2衋盭ねactionbanね衋かBANなどり晁なpfねfail2ヅ・フリなぜねIPァトルジゑ迼功じりゲポヲトてじ。/32などぢづぃりねて1っねIPたぐてじ。
3衋盭ねactionunbanね衋かBANか觢陣などり晁なpfねfail2ヅ・フリおよぜねIPァトルジゑ剉陣じりゲポヲトてじ。
tablenameのfail2banてげるの夈曳じり忄覀の牸な焠ぃおで怜ぃぽじ。

/etc/rc.conf

/etc/rc.confな令上ゑ功ぇぽじ。

1
2
3
pf_enable="YES"
pf_rules="/etc/pf.conf"
fail2ban_enable="YES"

勔佛碹誌

佛ぢぞリ・リて止ざぎパヂデじりお碹誌ざぽじ。(1衋すっ)

# fail2ban-regex /var/log/wordpress-access.log /usr/local/etc/fail2ban/filter.d/wordpress.conf
# fail2ban-regex /var/log/wordpress-error.log /usr/local/etc/fail2ban/filter.d/error404.conf
令上ねょぅど凹劚絏枛か凹ぽじ。(穹衋陣厺)
unning tests
=============
Use   failregex file : ./wordpress.conf
Use         log file : /var/log/wordpress-access.log
Results
=======
Failregex: 2330 total
|-  #) [# of hits] regular expression
|   1) [2330]  .* "POST /wp-login\.php HTTP/1\.1" 200 .*
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
|  [38325] Day/MONTH/Year:Hour:Minute:Second
`-
Lines: 38325 lines, 0 ignored, 2330 matched, 35995 missed

旤晁ピエ・ポヂデか止ざぎ椛矤ごるづぃりげでゑ碹誌ざぽじ。[38325] Day/MONTH/Year:Hour:Minute:Secondね衋かぜるてじ。38325衋て旤晁ピエ・ポヂデか吋䷿彡弎ね 旤/朇/平:晁:刅:科 て誌譗ごるづぃぽじ。ぽぞ、レク冄ね衋敯の替律ね衋てLines: 38325でどぢづぃりねて吇ぢづぃぽじ。fail2banての椛矤旤晁か里覀どねてげげか止ざぎ橞胼ざづぃどぃ堳吇の啎顋てじ。
替律ね衋な2330 matchedでぁりねて2330衋か佛戏ざぞリ・リて椛矤てがぞでぃぅげでなどらぽじ。
どぉ、fail2ban-regexてのlocal.jailゑ覊づぃどぃねてfindtimeゃmaxretryの閡俁どぎ、レクピ゠ィリ冄ね內づね衋ゑ毓輂ざづ絏枛ゑ凹劚ざぽじ。
ぽぞ、リ・リなポヂダざどおぢぞ衋か末归な怜惐這らな椛矤ごるどおぢぞねお碹誌じりぞむな令上ねょぅなォブザユヲゑ仗ぐづポヂダざどおぢぞ衋內づゑ衧礹ごずづ碹誌ざづぉがぽじ。

# fail2ban-regex --print-all-missed レクピ゠ィリ リ・リピ゠ィリ

/etc/pf.conf

pfね訬宙ピ゠ィリゑ觥らぽじ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ext_if = "fxp0"
table  persist file "/etc/iprange_cn.txt"
table  persist file "/etc/iprange_bot.txt"
table  persist

tcp_services = "{ smtp, www, https }"
udp_services = "ntp"

priv_nets = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
IcmpPing ="icmp-type 8 code 0"
SynState ="flags S/SA synproxy state"
TcpState ="flags S/SA modulate state"
UdpState ="keep state"
set block-policy drop 
set loginterface $ext_if
set skip on lo0
scrub in all
block all
block in  quick on $ext_if from $priv_nets to any
block out quick on $ext_if from any to $priv_nets
block in  quick on $ext_if from { , ,  } to ($ext_if)
block out quick on $ext_if from ($ext_if) to { , ,  }

pass in on $ext_if inet proto tcp  from any to ($ext_if) port $tcp_services $TcpState
pass in on $ext_if inet proto udp  from any to ($ext_if) port $udp_services $UdpState
pass in on $ext_if inet proto icmp from any to ($ext_if) $IcmpPing $UdpState

pass out on $ext_if inet proto tcp $TcpState
pass out on $ext_if inet proto udp $UdpState
pass out on $ext_if inet proto icmp $UdpState

だどまな2衋盭ねcnfilterの攮邢ょぐねヅ・フリてじ。
IPァトルジねラジデのピ゠ィァ・ゥエ・リ甧ねリ・リ'杰ァシァピアリゾ・(ごをねでげれおよpf甧ねピ゠ィリゑ頁ぃづ杤づぜるそるピ゠ィリ同ゑ夈曳ざづ罭がぽじ。(焠ぎどぢぞょぅてじ。)仢ゎらなげだよな佛らぽざぞ。
3衋盭ねbotfilterの旤末囼冄およ杤りBaiduspiderゃYetibot(旦NaverBot)どとぉ剌たぐの杤りどでぃぅホヂデゑ発錱ざづぃぽじ。(靝八閊) 易ねNaverBotめ酶おぢぞてじか、Baiduねの寽筕ざづめじら抛ぐょぅでじりざUA偼裄めじりざでぁぽらなめ酶じきてじ。

赶勔

pfゑ赶勔ざぽじ。

# service pf start
めざぎの、旡な赶勔ざづぃりどよ令上てリ・リピ゠ィリゑ説ま辻ぽずぽじ。
# pfctl -f /etc/pf.conf

とだよなざづめsshてレクィヲざづぃり堳吇のズヂザユヲか夈な分るづ擌佛丌胼などらぽじ。

fail2banゑ赶勔ざぽじ。

# service fail2ban start

レクピ゠ィリゑ頬およ説をて凥琅ざ姊むりねてレクピ゠ィリか巧夦ど堳吇の暪ぎゲポヲトブレヲブデか帯ぢづ杤ぽずをか畯帷てのぁらぽずを。仉囝のfindtimeか月劸などぢづぃりねて三ね訬宙ねょぅなfindtimeゑ2晁閒でざづぃり堳吇の盳运2晁閒なリ・リなポヂダざぞ衋かmaxretry囝敯椛矤ごるどぐるはBANごるぽずを。
BANか癹甞ざぞ堳吇のム・リか退俠ごるり筇てじか、䷿忛、pfねヅ・フリめ碹誌ざづぉがぽじ。

# pfctl -t fail2ban -T show

BANごるぞIPァトルジかぁるはIPァトルジか1衋な1っ衧礹ごるぽじ。bantimeゑ遍きぞよ臩勔皃なfail2banヅ・フリおよ剉陣ごるげねゲポヲトゑ兤劚ざづめぜねIPァトルジの衧礹ごるどぎどらぽじ。(ね筇てじ)

BANごるぞねゑぞただな叕ら涇ざぞぃ堳吇、令上ねゲポヲトゑ兤劚ざぽじ。(192.168.0.5の叕ら涇ざぞぃIPァトルジ)

# pfctl -t fail2ban -T delete 192.168.0.5

げるよねゲポヲトのfail2banね0.9糺ぽての這甧ざぞか0.10糺ての這甧ざどぃねて泧愎

迼託: WP fail2banブヨクィヲゑ佾ぅ堳吇

三ね侊ての箠琅町靡ぷねレクィヲ夰敖ゑェヨ・ゲ・ト200て覊っぐりでぃぅ丬逓卉竮愞ねぁりめねてじか、WP fail2banブヨクィヲゑ佾甧じりで Authentication failure でぃぅ彡てのぢがら誌註夰敖ゑ凹ざづぎるぽじ。ぽぞ、箠琅町靡ぷね誌註夰敖令夕なめ幽っおねレクゑ吏ぃづぎるりょぅな訬宙てがぽじ。げねブヨクィヲね訬宙の箠琅町靡てのどぎwp-config.phpぷね迼託て衋ぃぽじ。

WP fail2banねレクね吏が凹ざ兇の樘溕ての/var/log/auth.logねょぅてじ。1可ねゴ・ハて褆敯ねwordpressゑ勔おざづぃりで晭這の褆敯ねァギズジレクピ゠ィリゑfail2banな盢覕ごずり忄覀かぁりねてじか、ぜるかauth.logピ゠ィリ1っ盢覕ごずりたぐて艮ぃねて訬宙じり偳でざづめ楼おめざるぽずを。

/usr/local/etc/fail2ban/jail.local
(WP fail2ban 3.0.0令陌どよげねベ・シね上郧叁煦)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[wordpress]
enabled  = true
filter   = wordpress
action   = pf
           sendmail-whois[name=wordpress, dest=foobar@example.com, sender=fail2ban@example.com]
logpath  = /var/log/auth.log
timeregex = S{3}s{1,2}d{1,2} d{2}:d{2}:d{2}  #めざめ旤晁FormatかJul 26 00:06:53ねょぅど彡弎て专っ臩勔誌譗ごるどぃ堳吇
timepattern = %%b %%d %%H:%%M:%%S           #吋三  誌譗ごるりどよげね2衋の丌覀
maxretry = 2
[/code]
< p>&thinsp;< /p>

< p>/usr/local/etc/fail2ban/filter.d/wordpress.conf
(WP fail2ban 3.0.0令陌どよげねベ・シね上郧叁煦)< /p>
[code lang="plain"]
[INCLUDES]
before = common.conf

[Definition]
failregex = Authentication failure for .* from < HOST>$
           Authentication attempt for unknown user author from < HOST>$
ignoreregex =

箠琅町靡ぷね誌註夰敖令夕ねレクゑ凹じ訬宙ゑ迼功ざぞ堳吇のめだれをwordpress.confねfailregexなぜるな寽忛じり衋ゑ迼託じり忄覀かぁらぽじ。

2016平7朇9旤迼託:
WP fail2banね替运ねハ・シユヲVer.3.0.0令陌てのブヨクィヲピエリタね丬なwordpress-hard.confでwordpress-soft.confでぃぅ2っねピアリゾピ゠ィリか兤ぢづぃり。げるゑfail2banねfilter.dピエリタなゲビ・じり。jail.localゑ緧雅ざづげねwordpress-hardでwordpress-softねピアリゾゑ説ぽずり。でぃぅ佾ゎず斸ゑごずぞぃよざぃ。
ぜるな徒ぅどよ尐ざ三ね斸な曷ぃづぃりjail.localでピアリゾピ゠ィリの佾ゎどぃ。(叁耂稊庥て)

jail.local
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[wordpress-hard]
enabled = true
filter = wordpress-hard
logpath = /var/log/auth.log
maxretry = 1
port = http,https

[wordpress-soft]
enabled = true
filter = wordpress-soft
logpath = /var/log/auth.log
maxretry = 3
port = http,https

WP fail2banね誫昍ての三ゑjail.localな曷ぎょぅたか归焵げるゑぜねぽぽたで橞胼ざどぃねて三ね斸て曷ぃづりょぅなactionゑ挆宙じり。ぜね仕レクピ゠ィリね挆宙ゑ臩刅ねザジヅミな吇ゎずりでおのざぞ斸か艮ぃ。
ピアリゾピ゠ィリ偳め止ざぎ橞胼じりめねてぁりげでゑ碹誌じり。

閡逢託亊: