自动封堵暴力破解ssh账号的入侵者
无限发现他的ssh服务器有人企图暴力破解账号,我也自查了一下,发现我也一样受到了此类攻击,ssh中的相关log如下:<div><br></div><div><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li>May 10 23:20:21 localhost sshd: Invalid user x from x.x.x.x</li></ol></div></div>明显x.x.x.x在进行账号猜测。随即写了个ruby脚本,监控sshd的此类日志,并对连续输错用户名十次以上的IP用iptables进行封堵。<div><br></div><div><div id="codeText" class="codeText"><ol style="margin:0 1px 0 0;padding:5px 0;" start="1" class="dp-css"><li><span style="color:#000000;">#<span style="color:#0000CC;">!</span><span style="color:#0000CC;">/</span>usr<span style="color:#0000CC;">/</span>bin<span style="color:#0000CC;">/</span>ruby<br></span></li><li>#<br></li><li>
<br></li><li>
<span style="color:#0000FF;">class</span> Daemon<br></li><li>
def Daemon<span style="color:#0000CC;">.</span>start<br></li><li>
exit!(0<span style="color:#0000CC;">)</span> <span style="color:#0000FF;">if</span> fork<br></li><li>
Process<span style="color:#0000CC;">:</span><span style="color:#0000CC;">:</span>setsid<br></li><li>
exit!(0<span style="color:#0000CC;">)</span> <span style="color:#0000FF;">if</span> fork<br></li><li>
Dir<span style="color:#0000CC;">:</span><span style="color:#0000CC;">:</span>chdir<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"/"</span><span style="color:#0000CC;">)</span><br></li><li>
File<span style="color:#0000CC;">:</span><span style="color:#0000CC;">:</span>umask<span style="color:#0000CC;">(</span>0<span style="color:#0000CC;">)</span><br></li><li>
STDIN<span style="color:#0000CC;">.</span>reopen<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"/dev/null"</span><span style="color:#0000CC;">)</span><br></li><li>
STDOUT<span style="color:#0000CC;">.</span>reopen<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"/dev/null"</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">"w"</span><span style="color:#0000CC;">)</span><br></li><li>
STDERR<span style="color:#0000CC;">.</span>reopen<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"/dev/null"</span><span style="color:#0000CC;">,</span> <span style="color:#FF00FF;">"w"</span><span style="color:#0000CC;">)</span><br></li><li>
yield <span style="color:#0000FF;">if</span> block_given<span style="color:#0000CC;">?</span><br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<br></li><li>
def block_ip<span style="color:#0000CC;">(</span>ip<span style="color:#0000CC;">)</span><br></li><li>
cmd <span style="color:#0000CC;">=</span> <span style="color:#FF00FF;">"iptables -A block_ip -s #{ip} -j DROP"</span><br></li><li>
system<span style="color:#0000CC;">(</span>cmd<span style="color:#0000CC;">)</span><br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<br></li><li>
def block_invalid<span style="color:#0000CC;">(</span>filename<span style="color:#0000CC;">)</span><br></li><li>
block_limit <span style="color:#0000CC;">=</span> 10<br></li><li>
<br></li><li>
log_file <span style="color:#0000CC;">=</span> File<span style="color:#0000CC;">.</span>new<span style="color:#0000CC;">(</span>filename<span style="color:#0000CC;">)</span><br></li><li>
ips <span style="color:#0000CC;">=</span> Hash<span style="color:#0000CC;">.</span>new<br></li><li>
blocked_ips <span style="color:#0000CC;">=</span> Hash<span style="color:#0000CC;">.</span>new<br></li><li>
log_file<span style="color:#0000CC;">.</span><span style="color:#0000FF;">each</span> <span style="color:#0000FF;">do</span> <span style="color:#0000CC;">|</span>line<span style="color:#0000CC;">|</span><br></li><li>
field <span style="color:#0000CC;">=</span> line<span style="color:#0000CC;">.</span><span style="color:#FF0000;">split</span><br></li><li>
<span style="color:#0000FF;">if</span> field<span style="color:#0000CC;">[</span>5<span style="color:#0000CC;">]</span> <span style="color:#0000CC;">=</span><span style="color:#0000CC;">=</span> <span style="color:#FF00FF;">"Invalid"</span><br></li><li>
ip <span style="color:#0000CC;">=</span> field<span style="color:#0000CC;">[</span>field<span style="color:#0000CC;">.</span>length <span style="color:#0000CC;">-</span> 1<span style="color:#0000CC;">]</span><br></li><li>
<span style="color:#0000FF;">if</span> ips<span style="color:#0000CC;">.</span>key<span style="color:#0000CC;">?</span><span style="color:#0000CC;">(</span>ip<span style="color:#0000CC;">)</span><br></li><li>
ips<span style="color:#0000CC;">[</span>ip<span style="color:#0000CC;">]</span> <span style="color:#0000CC;">+</span><span style="color:#0000CC;">=</span> 1<br></li><li>
<span style="color:#0000FF;">else</span><br></li><li>
ips<span style="color:#0000CC;">[</span>ip<span style="color:#0000CC;">]</span> <span style="color:#0000CC;">=</span> 1<br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<span style="color:#0000FF;">if</span> ips<span style="color:#0000CC;">[</span>ip<span style="color:#0000CC;">]</span> <span style="color:#0000CC;">></span> block_limit <span style="color:#0000FF;">and</span> <span style="color:#0000FF;">not</span> blocked_ips<span style="color:#0000CC;">.</span>key<span style="color:#0000CC;">?</span><span style="color:#0000CC;">(</span>ip<span style="color:#0000CC;">)</span><br></li><li>
blocked_ips<span style="color:#0000CC;">[</span>ip<span style="color:#0000CC;">]</span> <span style="color:#0000CC;">=</span> 1<br></li><li>
block_ip<span style="color:#0000CC;">(</span>ip<span style="color:#0000CC;">)</span><br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<br></li><li>
<span style="color:#0000FF;">if</span> system<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"iptables -nvL block_ip &>/dev/null"</span><span style="color:#0000CC;">)</span><br></li><li>
system<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"iptables -F block_ip"</span><span style="color:#0000CC;">)</span><br></li><li>
<span style="color:#0000FF;">else</span><br></li><li>
system<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"iptables -N block_ip"</span><span style="color:#0000CC;">)</span><br></li><li>
system<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"iptables -I INPUT -j block_ip"</span><span style="color:#0000CC;">)</span><br></li><li>
<span style="color:#0000FF;">end</span><br></li><li>
<br></li><li>
Daemon<span style="color:#0000CC;">.</span>start <span style="color:#0000FF;">do</span><br></li><li>
block_invalid<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"/var/lib/myips.fifo"</span><span style="color:#0000CC;">)</span><br></li><li>
<span style="color:#0000FF;">end</span></li></ol></div></div>
本质上,这就是一个简单的LIPS--基于日志的入侵防护系统。
页:
[1]