天天看點

用SHELL腳本來防SSH和vsftpd暴力破解(第②版)

新近剛上的FTP備份伺服器,例行檢查/var/log/secure日志時,發現不少sshd和vsftpd失敗認證資訊,很明顯有人想用暴力破解工具竊取密碼,是以需要編寫一個安全腳本防止。

腳本需求如下:此SHELL腳本放在crontab計劃任務裡,每隔6小時(此時間根據實際情況來定義)就去讀取/var/log/secure腳本,取出裡面惡意猜測IP,如果機關時間内(一星期)的連接配接數是高于一個閥值,例如100(此閥值也可以根據實際情況來定義),則将其加進/etc/hosts.deny黑名單裡,如果低于此閥值,則無視此IP。

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

<code>/var/log/secure</code><code>裡認證失敗資訊如下:</code>

<code>Nov 28 10:18:08 centos2 sshd[7556]: Connection closed by 222.216.30.109</code>

<code>Nov 28 10:18:08 centos2 sshd[7557]: pam_unix(sshd:auth): authentication failure; </code><code>logname</code><code>= uid=0 euid=0 </code><code>tty</code><code>=</code><code>ssh</code> <code>ruser= rhost=222.216.30.109 user=root</code>

<code>Nov 28 10:18:09 centos2 sshd[7559]: pam_unix(sshd:auth): authentication failure; </code><code>logname</code><code>= uid=0 euid=0 </code><code>tty</code><code>=</code><code>ssh</code> <code>ruser= rhost=222.216.30.109 user=root</code>

<code>Nov 28 10:18:10 centos2 sshd[7551]: Failed password </code><code>for</code> <code>root from 222.216.30.109 port 2391 ssh2</code>

<code>Nov 28 10:18:10 centos2 sshd[7552]: Connection closed by 222.216.30.109</code>

<code>Nov 28 10:18:10 centos2 sshd[7553]: Failed password </code><code>for</code> <code>root from 222.216.30.109 port 2397 ssh2</code>

<code>Nov 28 10:18:10 centos2 sshd[7554]: Connection closed by 222.216.30.109</code>

<code>Nov 28 10:18:11 centos2 sshd[7557]: Failed password </code><code>for</code> <code>root from 222.216.30.109 port 2401 ssh2</code>

<code>Nov 28 10:18:11 centos2 sshd[7558]: Connection closed by 222.216.30.109</code>

<code>Nov 28 10:18:11 centos2 sshd[7559]: Failed password </code><code>for</code> <code>root from 222.216.30.109 port 2403 ssh2</code>

<code>Nov 28 10:18:11 centos2 sshd[7560]: Connection closed by 222.216.30.109</code>

<code>Nov 28 10:37:01 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown</code>

<code>Nov 28 10:37:01 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; </code><code>logname</code><code>= uid=0 euid=0 </code><code>tty</code><code>=</code><code>ftp</code> <code>ruser=hello rhost=centos1.cn7788.com</code>

<code>Nov 28 10:37:01 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user hello</code>

<code>Nov 28 10:37:19 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown</code>

<code>Nov 28 10:37:19 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; </code><code>logname</code><code>= uid=0 euid=0 </code><code>tty</code><code>=</code><code>ftp</code> <code>ruser=yhc rhost=centos1.cn7788.com</code>

<code>Nov 28 10:37:19 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user yhc</code>

<code>Nov 28 10:37:36 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown</code>

<code>Nov 28 10:37:36 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; </code><code>logname</code><code>= uid=0 euid=0 </code><code>tty</code><code>=</code><code>ftp</code> <code>ruser=yuhongchun rhost=centos1.cn7788.com</code>

<code>Nov 28 10:37:36 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user yuhongchun</code>

<code>Nov 28 10:42:44 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown</code>

<code>Nov 28 10:42:44 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; </code><code>logname</code><code>= uid=0 euid=0 </code><code>tty</code><code>=</code><code>ftp</code> <code>ruser=yuhongchun rhost=114.112.169.70</code>

<code>Nov 28 10:42:44 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user yuhongchun</code>

<code>Nov 28 10:42:56 centos2 vsftpd: pam_unix(vsftpd:auth): check pass; user unknown</code>

<code>Nov 28 10:42:56 centos2 vsftpd: pam_unix(vsftpd:auth): authentication failure; </code><code>logname</code><code>= uid=0 euid=0 </code><code>tty</code><code>=</code><code>ftp</code> <code>ruser=andrewyu rhost=114.112.169.70</code>

<code>Nov 28 10:42:56 centos2 vsftpd: pam_succeed_if(vsftpd:auth): error retrieving information about user andrewyu</code>

我們觀察下/var/log/secure檔案輪詢特征,如下所示:

<code>ls</code> <code>-lsart secure.*</code>

<code>512 -rw------- 1 root root 516379 11-04 01:31 secure.4</code>

<code>660 -rw------- 1 root root 668192 11-11 00:05 secure.3</code>

<code>304 -rw------- 1 root root 306589 11-17 10:33 secure.2</code>

<code>484 -rw------- 1 root root 488620 11-25 02:33 secure.1</code>

基本上,/var/log/secure檔案是以星期為輪詢周期的,如果對安全要求嚴格的朋友還可以本着“一個不放過”的原則來抓取上面的舊secure的惡意IP,然後扔進/etc/hosts.deny檔案裡。下面我們就們就要想辦法高效的來抓取這些惡意IP,如果參考原始版本的SHELL腳本寫法,,我們這裡要抓取secure日志中的偵測vsftpd及sshd

服務的IP位址,我們可以用如下指令,指令如下所示:

<code>cat</code> <code>/var/log/secure</code> <code>| </code><code>awk</code> <code>'/Failed/{print $(NF-3)}'</code><code>| </code><code>sort</code><code>| </code><code>uniq</code> <code>-c| </code><code>awk</code> <code>'{print $2"="$1;}'</code>

很明顯,這樣是取不到vsftpd失敗的IP值的,sshd日志失敗資訊跟vsftpd日志失敗資訊不一樣,我寫了幾種awk混合sed的方法,測試了效率,感覺用awk腳本速度是最快的,大家也可以寫幾種,用time指令測試下;最後精簡了下代碼,完成了整個腳本,腳

本内容如下所示:

<code>#!/bin/bash</code>

<code>awk</code> <code>'{for(i=1;i&lt;=NF;i++){if($i ~ /rhost/)print substr($i,7)}}'</code> <code>/var/log/secure</code> <code>| </code><code>sort</code> <code>| </code><code>uniq</code>    <code>-c&gt;</code><code>/root/black</code><code>.txt</code>

<code>DEFINE=</code><code>"100"</code>

<code>cat</code>     <code>/root/black</code><code>.txt |    </code><code>while</code> <code>read</code> <code>LINE</code>

<code>do</code>

<code>               </code><code>NUM=`</code><code>echo</code> <code>$LINE |</code><code>awk</code> <code>'{print $1}'</code><code>`</code>

<code>               </code><code>host=`</code><code>echo</code> <code>$LINE    |</code><code>awk</code> <code>'{print $2}'</code><code>`</code>

<code>               </code><code>if</code> <code>[ $NUM -gt $DEFINE ];</code>

<code>               </code><code>then</code>

<code>                </code><code>grep</code> <code>$host    </code><code>/etc/hosts</code><code>.deny &gt; </code><code>/dev/null</code>

<code>                   </code><code>if</code> <code>[ $? -gt 0 ];</code>

<code>                   </code><code>then</code>

<code>                   </code><code>echo</code> <code>"sshd:$host"</code>     <code>&gt;&gt; </code><code>/etc/hosts</code><code>.deny</code>

<code>                   </code><code>echo</code> <code>"vsftpd:$host"</code> <code>&gt;&gt; </code><code>/etc/hosts</code><code>.deny</code>

<code>                   </code><code>fi</code>

<code>               </code><code>fi</code>

<code>done</code>

腳本運作一段時間後,我們可以觀察此腳本涉及到的一些檔案,如/root/black.txt,結果如下所示:

<code>cat</code> <code>/root/black</code><code>.txt</code>

<code>               </code><code>2 113.17.144.156</code>

<code>               </code><code>4 114.112.51.208</code>

<code>               </code><code>4 114.112.69.170</code>

<code>           </code><code>169 118-163-227-50.hinet-ip.hinet.net</code>

<code>               </code><code>8 119.188.7.200</code>

<code>               </code><code>8 122.70.130.11</code>

<code>            </code><code>61 124.248.32.246</code>

<code>            </code><code>12 183.203.14.121</code>

<code>               </code><code>3 189.26.255.11</code>

<code>            </code><code>56 199.204.237.60</code>

<code>               </code><code>3 199.30.53.220</code>

<code>               </code><code>5 201.236.80.4</code>

<code>               </code><code>6 220.172.191.31</code>

<code>            </code><code>30 222.216.30.109</code>

<code>            </code><code>60 222.253.159.111</code>

<code>            </code><code>58 223.4.180.23</code>

<code>           </code><code>166 58.221.42.178</code>

<code>               </code><code>1 61.132.4.85</code>

<code>           </code><code>152 61.142.106.34</code>

<code>            </code><code>22 61.167.33.222</code>

<code>               </code><code>7 85.126.166.83</code>

<code>           </code><code>166 www.b-nets.com</code>

/etc/hosts.deny腳本内容如下:

<code>sshd:124.248.32.246</code>

<code>vsftpd:124.248.32.246</code>

<code>sshd:199.204.237.60</code>

<code>vsftpd:199.204.237.60</code>

<code>sshd:222.253.159.111</code>

<code>vsftpd:222.253.159.111</code>

<code>sshd:223.4.180.23</code>

<code>vsftpd:223.4.180.23</code>

<code>sshd:58.221.42.178</code>

<code>vsftpd:58.221.42.178</code>

<code>sshd:61.142.106.34</code>

<code>vsftpd:61.142.106.34</code>

<code>sshd:118-163-227-50.hinet-ip.hinet.net</code>

<code>vsftpd:118-163-227-50.hinet-ip.hinet.net</code>

<code>sshd:www.b-nets.com</code>

<code>vsftpd:www.b-nets.com</code>

最後,我們将此shell腳本放進crontab 裡,每間隔六小時就運作一次,指令如下:

<code>* *</code><code>/6</code> <code>* * * root </code><code>/bin/bash</code> <code>/root/hostsdeny</code><code>.sh &gt;&gt; </code><code>/dev/null</code> <code>2&gt;&amp;1</code>

由于/var/log/secure日志是以星期為輪詢的,此腳本執行頻率可自行設定,如果感覺伺服器被頻繁偵測,執行頻率間隔可設定短些,反之,可設定長些。附注:如果僅僅隻是要防止SSH暴力破解,這個腳本就沒必要更新了,可以采納我原先的SHELL腳本(即原始版本),此更新腳本适合部署在有FTP的公網機器上面,目前測試比較穩定,但感覺還是有不完美的地方,歡迎大家來信交流,撫琴煮酒([email protected])。

本文轉自 撫琴煮酒 51CTO部落格,原文連結:http://blog.51cto.com/yuhongchun/1074650,如需轉載請自行聯系原作者