作者 主題: [分享]根據 log 自動封鎖特定 ftp 登入失敗者的IP  (閱讀 3288 次)

0 會員 與 1 訪客 正在閱讀本文。

joe0120

  • 活潑的大學生
  • ***
  • 文章數: 241
    • 檢視個人資料
1、小弟在此分享自己根據 log  自動封鎖特定 ftp 登入失敗者的IP
2、我知道自己寫的不是很好,也不知怎麼做是否有效果,還是多餘,但不管如何,但是還是分享一下,聽取大大們有什麼建言
3、此script 是應用有安裝 vsftpd 服務的主機上
4、檔案使用說明:
denyFtpFailurer.sh  --- 主要執行封鎖程式
deleteDenyIP.sh     --- 解除已經封鎖IP
將兩個檔案根據狀況,加入排程中
5、主要用在 ftp 服務沒有提供輸入幾次錯誤就禁止或client 人數眾多,不可能一一輸入允許清單中

denyFtpFailurer.sh


#
# 目的:將登入 ftp 使用者超過10次以上,進行封鎖動作
# 設定說明:
#       1、有些 log 記錄方式不同,故引用時,必須確定 log 格式
#
#! /bin/bash

includesPath='/script/includes'
today=$(date "+%Y-%m-%d")
securePath='/var/log/secure'
denyIPList="$includesPath/$today"
hosts_deny='/etc/hosts.deny'

#取的失敗次數
loginCounter=$(cat  $securePath |grep vsftpd |grep 'authentication failure'|cut -d' ' -f 14 |cut -d'=' -f 2  |uniq -c |grep ^[^$] |sort -r |awk '{if ($1 > 5) print $1}' )
loginCounterAry=($loginCounter)


#取的 IP
iPString=$(cat $securePath |grep vsftpd|grep 'authentication failure'|cut -d' ' -f 14 |cut -d'=' -f 2  |uniq -c |grep ^[^$] |sort -r |awk '{if ($1 > 5) print $2}')
iPStringAry=($iPString)


#取的筆數
#aryIndex=$(cat  $securePath |grep vsftpd |grep 'authentication failure'|cut -d' ' -f 14 |cut -d'=' -f 2  |uniq -c |grep ^[^$] |sort -r |awk '{if ($1 > 5) print $1, $2}' | wc -l)

#取的已經封鎖清單
if [  -e "/etc/hosts.deny" ];then
        oldDenyList=$( grep ^vsftpd /etc/hosts.deny | cut -d':' -f2 | sort -r  | uniq -c | awk '{print $2}')
        oldDenyListAry=($oldDenyList)

        # 根據比較,找出新的 IP 後加入封鎖
        for v in "${iPStringAry}"

        do
                bo='0'
                for v2 in "${oldDenyListAry}"

                do
                        if [[ "$v" = ""$v2""  ]]; then
                                bo='1';

                                break;
                        fi
                done
                if [[ "$bo" = '0'  ]]; then
                        echo "vsftpd:$v"  >>  "$includesPath/$today"
                        echo $v         >>  "$includesPath/$today.bak"
                        bo2='yes'
                fi
        done
        if [[ "$bo2" = 'yes' ]]; then
                denyList=($(cat $includesPath/$today))
                for v3 in "${denyList}"

                do
                        echo $v3 >> $hosts_deny
                done
                rm -f $includesPath/$today
                cat $hosts_deny
        else
                echo "沒有新的IP清單..."
        fi
fi
exit 0


deleteDenyIP.sh


#
# 目的:將被禁止使用 FTP 解除
#

#! /bin/bash
beforeDay=$(date "+%Y-%m-%d")
deleteIPListFile="/script/includes/$beforeDay.bak"
hosts_deny='/etc/hosts.deny'

for v in $(cat $deleteIPListFile);
 do
        sed -i "s,^vsftpd:$v,,g" $hosts_deny
        sed -i '/^$/d'   $hosts_deny
done

rm -f $deleteIPListFile
cat $hosts_deny
« 上次編輯: 2011-07-13 22:04 由 joe0120 »

kiang

  • 活潑的大學生
  • ***
  • 文章數: 310
    • 檢視個人資料
    • 就這間電腦工作室
****************************************************
Finjon Kiang / 江明宗
Just This Computer Studio / 就這間電腦工作室
Website: http://olc.tw
****************************************************

joe0120

  • 活潑的大學生
  • ***
  • 文章數: 241
    • 檢視個人資料

hikohan

  • 俺是博士!
  • *****
  • 文章數: 1288
    • 檢視個人資料
我也來分享一下

ssh部份,個人推薦 knockd ,沒敲門就不給進入,敲門,還要根據你的指定 port 順序敲才可以進去。

至於 ftp 部份,個人推薦 ftpproxy ,這個很像 socks / pop3 的proxy服務認證,在閘道上,經由 ftpproxy 代理,登入必須使用
特定格式

使用者名稱: username@serverip
登入密碼: 維持原有密碼

將主機上的 ftp server 更改埠號與聆聽位置,例如 local dmz ip ,或者另外架設 ftp server 於 DMZ 區段上。

當然,同時可以存在多個實體不同位址的 ftp server ,同經由 ftpproxy 代理存取。

ref:
http://www.ftpproxy.org/
lifeIsFunWithPHP.