xiaosuo 发表于 2011-12-21 08:43

自动封堵暴力破解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>
&nbsp;&nbsp;def Daemon<span style="color:#0000CC;">.</span>start<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;exit!(0<span style="color:#0000CC;">)</span> <span style="color:#0000FF;">if</span> fork<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;Process<span style="color:#0000CC;">:</span><span style="color:#0000CC;">:</span>setsid<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;exit!(0<span style="color:#0000CC;">)</span> <span style="color:#0000FF;">if</span> fork<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;&nbsp;yield <span style="color:#0000FF;">if</span> block_given<span style="color:#0000CC;">?</span><br></li><li>
&nbsp;&nbsp;<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>
&nbsp;&nbsp;cmd <span style="color:#0000CC;">=</span> <span style="color:#FF00FF;">"iptables -A block_ip -s #{ip} -j DROP"</span><br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;block_limit <span style="color:#0000CC;">=</span> 10<br></li><li>
<br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;ips <span style="color:#0000CC;">=</span> Hash<span style="color:#0000CC;">.</span>new<br></li><li>
&nbsp;&nbsp;blocked_ips <span style="color:#0000CC;">=</span> Hash<span style="color:#0000CC;">.</span>new<br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;&nbsp;field <span style="color:#0000CC;">=</span> line<span style="color:#0000CC;">.</span><span style="color:#FF0000;">split</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">else</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ips<span style="color:#0000CC;">[</span>ip<span style="color:#0000CC;">]</span> <span style="color:#0000CC;">=</span> 1<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">end</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">if</span> ips<span style="color:#0000CC;">[</span>ip<span style="color:#0000CC;">]</span> <span style="color:#0000CC;">&gt;</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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;blocked_ips<span style="color:#0000CC;">[</span>ip<span style="color:#0000CC;">]</span> <span style="color:#0000CC;">=</span> 1<br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block_ip<span style="color:#0000CC;">(</span>ip<span style="color:#0000CC;">)</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">end</span><br></li><li>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#0000FF;">end</span><br></li><li>
&nbsp;&nbsp;<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 &amp;&gt;/dev/null"</span><span style="color:#0000CC;">)</span><br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;system<span style="color:#0000CC;">(</span><span style="color:#FF00FF;">"iptables -N block_ip"</span><span style="color:#0000CC;">)</span><br></li><li>
&nbsp;&nbsp;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>
&nbsp;&nbsp;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]
查看完整版本: 自动封堵暴力破解ssh账号的入侵者