返回列表 回覆 發帖

[轉貼] 以 Fail2ban 封鎖嘗試侵入的 IP

原文
. I; `: u6 ?9 |
3 _& ~! G; i" e' H0 a3 J0 A基本運作原理: fail2ban (daemon) → 監視 log file → 連續出現多次錯誤訊息 → 封鎖來源 IP1 x- \6 B, }7 {' m9 a3 G2 M- W

9 H2 Y6 C, h: c! h: f" y( V以下是在 Fedora 7 (python-2.5 & fail2ban 0.8) 針對 sshd 與 proftpd 的防護設置4 \7 q7 q! D6 F+ v
: p+ O6 e& p( K5 b' c$ w
環境
/ K4 t5 g0 a$ CFedora 7
5 C) r1 b% @. a2 _: f: e& {0 ypython-2.5
' v5 }8 a6 [& u1 Mfail2ban 0.8 (required: python >= 2.4)
% Z3 B- Q6 s! e  _安裝 fail2ban 0.8
" x1 f) [8 I7 h7 W) K& M* l1 q0 q4 J+ e
另言9 ~8 w# h% n) B  D9 a2 p, B) Q
Fedora似乎也把它列為更新套件,所以在系統上使用5 a  u1 V# R+ p1 W+ s& v
# rpm -qa fail2ban
( a9 G- {! u5 [' J; W查詢之後,發現在系統已經安裝了 fail2ban-0.8.0-8.fc6。因此接下來的動作便是設定好,然後啟動它就大功告成了。. X8 X" s. I7 z) Y6 Z3 A
+ P8 \* y0 G3 Z; }
這裡只針對 ssh 的部分,fail2ban 可以阻擋的服務,在 filter.d 目錄可以看到所有的部分: q  [4 A+ j2 f! A0 N7 X! R+ Y
# ls /etc/fail2ban/filter.d/
/ a4 @) p' `/ t2 f. H% J2 Xapache-auth.conf      couriersmtp.conf  pure-ftpd.conf  sshd-ddos.conf- ]# P4 C$ T+ s" x6 i2 Y4 j
apache-badbots.conf   exim.conf         qmail.conf      vsftpd.conf' `5 Y! |7 ]9 L& [; Z# H
apache-noscript.conf  postfix.conf      sasl.conf       wuftpd.conf& [3 m% a1 K4 W; [; ?' h& v" E0 [. V
courierlogin.conf     proftpd.conf      sshd.conf
$ Y6 f' w* W$ s! e2 n2 i! m8 V: d1 ]' r7 s% q
download page
# r7 e% E& j9 R+ q7 j
- g: S& I+ f9 b8 e0 m! J! Iyum install python-devel$ v& y! h! K9 s! _
6 `* c) R2 @( t+ P
wget http://nchc.dl.sourceforge.net/s ... l2ban-0.8.0.tar.bz2
7 _" i0 g! S# H# n5 e& H5 }2 U  J4 n6 o8 F4 P! l3 F
tar jxf fail2ban-0.8.0.tar.bz27 U2 s2 U5 d; M7 I0 c3 {
& T* p' G& ~/ X( Y9 |4 s0 p
cd fail2ban-0.8.0
2 C$ M( u: H1 C# n! m3 S0 ?0 [) P
$ w# J0 T. e( @. P9 |python setup.py install" O& ^( U& `$ ^; a0 i" s0 {
. Z# u$ t, w" F. W  o
啟用 fail2ban! g9 ?0 T8 _, I" X" |  _* t

* \/ n, q$ G3 Z4 lcd /etc/fail2ban
! A; J( p+ t. Z. M% R4 p. H/ y; X+ l7 P; X$ h/ B- q( H
vi jail.conf
  1. #全域設置
  2. [DEFAULT]

  3. #排除 IP 範圍, 以空白隔開
  4. ignoreip = 127.0.0.1 192.168.0.0/24

  5. #觸發 maxretry 之後的封鎖時間(秒); 設為 -1 表示永遠封鎖
  6. bantime = 600

  7. #以 findtime (秒) 時間內的錯誤記錄作為 maxretry 的計數基準
  8. findtime = 600

  9. #允許嘗試次數
  10. maxretry = 3

  11. #以 iptables 阻擋嚐試登入 sshd 的來源 ip
  12. [ssh-iptables]

  13. enabled = true
  14. filter = sshd #對應 /etc/fail2ban/filter.d
  15. action = iptables[name=SSH, port=ssh, portocol=tcp] #對應 /etc/fail2ban/action.d
  16. logpath = /var/log/secure #這是 Fedora 的 sshd log file
  17. maxretry = 5 #取代全域設定值 (maxretry = 3)

  18. [proftpd-iptables]

  19. enabled = true
  20. filter = proftpd
  21. action = iptables[name=ProFTPD, port=ftp, protocol=tcp]
  22. logpath = /var/log/proftpd/proftpd.log
  23. maxretry = 6
複製代碼
fail2ban-client start
0 Z& b! x9 q1 M: N! t, ~* g& R! b, t9 p: d% w& F

: h5 l0 F1 C3 ~0 Q! u' hProFTPD 補充6 L8 Q6 D' R7 f1 _6 e

" z' K/ P* _7 G* K產生 log 檔:
% X& W$ H0 ?, m9 |; m編輯 proftpd.conf 加入:
  1. SystemLog /var/log/proftpd/proftpd.log
複製代碼
若要連密碼錯誤也一併計入 "maxretry":' i: U; ?. d" Y. U% z1 L: p, \2 X# _
編輯 /etc/fail2ban/filter.d/proftpd.conf 9 C- q0 s/ T- L! |- X8 {2 Y: B/ @
於 failregex 加入一行:
  1. Incorrect password
複製代碼
參考資料
7 Q6 ?+ M$ l( hFail2ban 官方網頁 . \5 ?; S3 V& z" h
Armor SSH and Block Brute Force Attacks" by Carla Schroder
附件: 您需要登錄才可以下載或查看附件。沒有帳號?註冊

查詢並禁止apache中異常訪問量的用戶

授權方式:署名,非商業用途,保持一致,轉載時請務必以超鏈接(http://www.fwolf.com/blog/post/331)的形式標明文章原始出處和作者信息及本聲明。! o3 Y* {5 i/ C% c$ N' E
* K9 P$ Q+ T, [4 T6 u
Apache中的異常訪問,通常指的是頻繁、大量訪問的用戶,通過apache的log,結合linux下的幾個命令,可以分析這些用戶,並通過apache的配置文件來禁止他們訪問。
1 L7 X- x) P' T! N% w7 U0 \' e# W) b6 e( k5 V# k* f4 k  t4 z
首先,更改apache的log方式,不記錄一些圖像、css等文件,這樣在log中每一行基本上都能對應一次訪問,如果不去除圖像等文件的記錄,正常用戶訪問一個頁面,同時也會下載頁面上的圖像、css等文件,會產生多條log記錄,影響計數的結果。在apache的conf文件中增加如下配置:9 [+ a, j4 u8 C9 m+ i
SetEnvIfNoCase Request_URI \.css$ useless-file: n# c# G& u/ Q0 o4 q! Y
SetEnvIfNoCase Request_URI \.gif$ useless-file7 ~% b6 y2 a/ j  h& Q, o
SetEnvIfNoCase Request_URI \.ico$ useless-file
0 _; k9 {( c, A+ h3 z$ cSetEnvIfNoCase Request_URI \.jpg$ useless-file
. k! D) v" K; nSetEnvIfNoCase Request_URI \.js$ useless-file
0 i0 E# e9 D7 J) ~CustomLog logs/hebgc.com/access.log combined env=!useless-file# A4 h( c- f( t: O1 P/ ^

+ I  L3 b0 K6 O* R3 }7 x  V# y! ^這樣就可以了,關於SetEnvIf的其他用法,可以參見Apache文檔中SetEnvIf和Environment Variables in Apache部分。3 }6 @1 C, k8 p. v/ o, L/ e' n

8 I6 C4 K4 d* {  Q8 Z3 q& N接下來,經過一段時間的運行,我們就可以分析log文件中訪問量最大的用戶了,只需要一條命令:
, s6 P3 b' X5 h  y6 G, a8 m0 D* P7 ocat access.log |awk '{print $1}'| sort | uniq -c |sort -n
' S) [9 ]2 S+ h2 l! c) s6 g0 C0 ^* T: P+ |, Z+ [
一點點的來看:
; n; ]* p6 U3 n& n* i
) ]5 B" E3 V8 v$ P. d% O1 x9 ]    * cat就不用說了;/ x' _7 _& w2 s
    * awk的作用,就是把第一列,也就是客戶端ip地址分揀出來;# Y" R+ |& g0 E. Z# V* P
    * 第一個sort,是把分揀出來的ip地址排序,這樣相同的ip地址會排在一起
5 ]4 t) e- I- o; [. v    * uniq是一個去除重複值的工具,但是帶上-c參數,就可以統計出每個值出現了多少次2 _5 l! A/ Z0 g' K
    * 最後的sort,把uniq產生的結果進行排序,按照-n這個參數的默認設置,最大的排在最下面。
5 {1 ?# @! W; T
$ [: L+ l% _2 _3 z所以,我們得到的結果應該是這樣的:1 x: S* y8 w3 u3 G5 W
...* y2 S% A  P1 o+ U! Y
2040 219.148.106.198
9 T- g5 O" g5 S; h% a# t2047 218.12.78.14
4 t: j0 O4 k+ H7 D) {. v2149 218.12.26.2333 [9 L; {1 {1 A# m
2205 121.28.4.34
/ w% y' _0 D$ b' O) W  ?3 P) @
% _# Z! W" F% J% h' V( Q7 B: _第一列就是訪問次數,第二列是ip地址,再回去對照log文件中的詳細內容,如果發現哪個訪問量大戶是某某機器人的話,就可以禁止掉了,還是修改apache的conf文件:
; ^: _! \9 Y! i<Directory />6 v1 n# j& L6 `7 B) D- H# Z+ O
    Order Deny,Allow
( s* S( E+ D4 O    Deny from 219.143.69.2
8 G' O9 `1 S9 f    Deny from 218.12.26.2330 O, [4 \/ p. ?2 _# I% U9 ^  w
    Deny from 61.135.162.51
% Y( r) e$ u: W% _1 L0 E7 I    Allow from all+ f0 l8 p! R/ j% i, c0 @" D' A( q
</Directory>4 u4 p& A, ^4 n7 z+ a* G( f
0 B1 Y$ S. P6 ?1 d: N( h
如此反覆監測、設置,直到沒有人搗亂為止。
! x" o$ D9 j& x* u4 C: K/ m: R' e0 a
同理,如果想查看反覆刷新查看某一頁面的用戶,可以用如下命令:' r! z2 ^! j" a
grep "GET /url/to/some/file" access.log |awk '{print $1}' |sort |uniq -c |sort -n
返回列表