$7.49 .com domain with free InstantPage Website Builder$1.99 Web Hosting   捷飞网络官方淘宝店   Godaddy 优惠码
返回列表 发帖
分享到:




[安全] 如何用PortSentry 防止恶意扫描 保护Linux服务器

在遭遇Linux服务器被外部IP恶意扫描端口的时候,一般系统管理员会部署一些防入侵的环境,比如snort,不过snort部署起来比较复杂,而有时候我们只是需要防止恶意扫描而已。这个时候,可以用PortSentry这个工具来进行非常简单的实现。虽然PortSentry被Cisco收购后不再开发,但丝毫不影响此软件的强大功能。
  R+ u; f- ]- b    我在检查一台CentOS5.5服务器安全环境时,发现很多IP在恶意扫描此服务器的端口。本来想部署snort防入侵环境的,后来发现snort环境部署非常复杂,而以上的恶意扫描完全可以用PortSentry来实现。PortSentry是入侵检测工具中配置最简单、效果最直接的工具之一。PortSentry是Abacus工程的一个组成部分。Abacus工程的目标是建立一个基于主机的网络入侵检测系统,可以从http://www.psonic.com得到关于Abacus工程更为详细的信息。虽然PortSentry被Cisco收购后不再开发,但丝毫不影响此软件的强大功能。PortSentry可以实时检测几乎所有类型的网络扫描,并对扫描行为做出反应。一旦发现可疑的行为,PortSentry可以采取如下一些特定措施来加强防范:
  z) m5 m- c' u% ^- D/ J. m7 E9 w    ◆给出虚假的路由信息,把所有的信息流都重定向到一个不存在的主机;. }  \2 J7 Q- a7 O3 C
    ◆自动将对服务器进行端口扫描的主机加到TCP-Wrappers的/etc/hosts.deny文件中去,我个人比较喜欢这种方式,因为线上许多环境并非都能打开iptables,这个选项也是PortSentry默认的功能;
2 l. O0 j; r6 q( o; f+ S    ◆利用Netfilter机制,用包过滤程序,比如iptables和ipchain等,把所有非法数据包(来自对服务器进行端口扫描的主机)都过滤掉;
' X( c4 }) a$ o" m7 `7 w    ◆通过syslog()函数给出一个目志消息,甚至可以返回给扫描者一段警告信息。
! I5 T/ z! w! ?5 |2 [" @( d' |. g    一、PortSentry的安装+ g$ D) {7 S% G+ h: u
    下面详细介绍PortSentry工具的安装和配置方法。/ h& R8 C) J! M5 O; ^1 |  }: j
    1.从http://sourceforge.net/projects/sentrytools/下载软件的最新版portsentry-1.2.tar.gz,用root用户执行如下命令进行安装:
& M( B. U1 r5 E9 o) R+ n    #tarzxvfportsentry-1.2.tar.gz! ?9 A% |* t# ?: Q
    #cdportsentry-1.2_beta; f' |8 A1 k0 |4 @. P6 S, W
    #make7 W' N3 k8 M5 ~5 O0 N' L% z
    #makeinstall  c) K1 g( y' ]+ r5 W! l
    进行到这步时发现报错,系统生成不了protsentry执行文件,我们查看Makefile文件时发现,make后面根据操作系统的不同有许多选项。; x3 |2 s! S1 L! W- u& Y
    所以我们重新执行此步操作,将目录删除重新解压缩9 y( P8 d: K( J4 O( K
    然后我们执行makelinux,发现系统仍然报错,如下:
# Q6 U/ Z1 ]* y) t! Z2 u* ~    SYSTYPE=linux
4 `7 Q' q2 {( v( |    Making./portsentry.c:1585:error:missingterminating"character
6 {, V$ @+ ?" Y4 i/ A% x/ P) X: m    ./portsentry.c:1595:error:expected?.?.before?.?.token
! d. X" U" ~6 ]0 ?) i! e    make:***[linux]Error1解决方法:* m* p+ r- `. [: O
    我们打开portsentry.c文件,在1590行左右,我们将带有Copyright1997-2003字样的那行调整为一行即可,文字有白线标记的那行代码应调整为一行$ {! q/ U7 c/ K7 ~$ G! b- z
    调整后我们再执行makelinux&&makeinstall后,PortSentry顺利安装成功,其安装路径为/usr/local/psionic/portsentry,如下所示表示成功安装此软件:+ [5 n& S3 N$ a5 D
    Edit/usr/local/psionic/portsentry/portsentry.confandchange* `, k9 H  e1 v3 V0 o: E
    yoursettingsifyouhaven'talready.(route,etc)
7 z3 y4 A4 _6 s8 c# _    WARNING:Thisversionandabovenowuseanew8 u7 y$ z! X& X5 D
    directorystructureforstoringtheprogram; \1 T! G" V8 S7 R8 X4 f  K
    andconfigfiles(/usr/local/psionic/portsentry)。' Q  o5 z3 Y! f/ p: d: C: ^+ S1 Y( A, T
    Pleasemakesureyoudeletetheoldfileswhen! I9 x& }7 ]# f& o+ f
    thetestingofthisinstalliscomplete.2 V% I2 K8 ]4 v" R
    cc-O-Wall-DLINUX-DSUPPORT_STEALTH-o./portsentry./portsentry.c\
9 o0 n8 p- }; h8 k8 i! m    ./portsentry_io.c./portsentry_util.c
3 m. T- [2 |  e4 K    ./portsentry.c:Infunction?.ortSentryModeTCP?.$ b/ N$ _9 M2 h, c
    ./portsentry.c:1187:warning:pointertargetsinpassingargument3of?.ccept?.differinsignedness5 |  }3 D/ {5 L* G- x
    ./portsentry.c:Infunction?.ortSentryModeUDP?.
' z# ?7 w( I& D- u7 w& Q    ./portsentry.c:1384:warning:pointertargetsinpassingargument6of?.ecvfrom?.differinsignedness" k0 \- ~/ ^1 @. \9 m
    ./portsentry.c:Infunction?.sage?.. Q2 R$ u& X. v+ q6 M) h
    ./portsentry.c:1584:error:missingterminating"character7 c4 L9 r7 ^0 k4 w* Z
    ./portsentry.c:1585:error:?.ourceforget?.undeclared(firstuseinthisfunction)
4 ~. k, ]& ^1 D. `6 k6 _8 h    ./portsentry.c:1585:error:(Eachundeclaredidentifierisreportedonlyonce) A! \+ I9 ?% ~* Q/ D  S
    ./portsentry.c:1585:error:foreachfunctionitappearsin.)7 T4 R& n$ {1 h% T7 i/ Q
    ./portsentry.c:1585:error:expected?.?.before?.ot?$ b6 z& G8 \; g5 g6 P) A6 J) n
    ./portsentry.c:1585:error:stray?.?.inprogram9 @, }' ?; m  s1 Q+ [4 H& r+ ~6 C
    二、PortSentry的配置
3 ~- x: L1 \! u+ k9 H' u5 b    1.修改配置文件portsentry.conf
, n* k# A+ o* }    通过PortSentry进行入侵检测,首先需要为它定制一份需要监视的端口清单,以及相应的阻止对策。然后启动后台进程对这些端口进行检测,一旦发现有人扫描这些端口,就启动相应的对策进行阻拦。
0 l+ j2 {$ ^9 I4 X% q8 N, U. O    (1)设置端口清单
8 h' w7 L( L. f/ a6 z6 z    下面给出portsentry.conf中关于端口的默认配置情况:1 x, E" J: @  e) E
    #Un-commenttheseifyouarereallyanal;
1 `6 C" E7 u& R& S* T    #TCP_PORTS="1,7,9,11,15,70,79,80,109,110,111,119,138,139,143,512,513,514,515,540,636,1080,1424,2000,2001,[]3 E- a9 f6 b, x  e8 B0 o3 d
    #UDP_PORTS="1,7,9,66,67,68,69,111,137,138,161,162,474,513,517,518,635,640,641,666,700,2049,31335,27444,34555,[]
! |; v0 _: D& F. t- Q; N5 ^- d0 a  J7 v- U    #Usetheseifyoujustwanttobeaware:" p  L" r4 q  P: K% t1 W5 M* e
    TCP_PORTS="1,11,15,79,111,119,143,540,635,1080,1524,2000,5742,6667,12345,12346,20034,27665,31337,32771,32772,[]0 L, ^' `! L1 I0 ^% N
    UDP_PORTS="1,7,9,69,161,162,513,635,640,641,700,37444,34555,31335,32770,32771,32772,32773,32774,31337,54321"' p  l; Q6 ^2 q5 q! y6 l. q) o
    #Usetheseforjusebare-bones
& U& E% `7 N/ c" r. A) g    #TCP_PORTS="1,11,15,110,111,143,540,635,180,1524,2000,12345,12346,20034,32771,32772,32773,32774,49724,54320"
. Y$ E, z- N; Y    #UDP_PORTS="1,7,9,69,161,162,513,640,700,32770,32771,32772,32773,32774,31337,54321": Z( @' w4 B- H. |  s! L
    可以有选择地去掉前面的注释来启用默认配置,也可以根据自己的实际情况定制一份新的清单,格式和原来的一样即可。端口列表要根据具体情况而定,假如服务器为Web服务器,那么Web端口就不需要监视。反之,如果是FTP服务器,那么监视Web端口也是有必要的。
' C( z1 @+ I# c$ m    (2)portsentry.conf里的相关文件) Y2 C, G9 {& K( l: z! c, J
    在portsentry.conf中自动配置了许多文件,我们看下它们有哪些用途:* @  C6 B6 h. x( x* \. S# A4 d; }
    #此文件记录允许合法扫描服务器的主机地址7 u3 ?% V! S, R7 G
    IGNORE_FILE="/usr/local/psionic/portsentry/portsentry.ignore"
7 C9 E: f/ p' F$ L& P  I    #此文件中保留了以往所有入侵主机的IP历史记录
! K) [& w" G' [+ P    HISTROY_FILE="/usr/lcal/psionic/portsentry/portsentry.history"
* X* u) p2 m) @( d# L+ P    #此文件中是已经被阻止连接的主机IP记录; S# j2 A' j" j; U9 l$ w
    BLOCKED_FILE="/usr/local/psionic/portsentry/portsentry.blocked"
2 {2 C2 _; z  C1 C, _0 n6 G( j    (3)设置路由重定向
; }" @! O* a- j* S: q+ E    通过配置portsentry.conf文件,可以设置一条虚拟路由记录,把数据包重定向到一个未知的主机。使之无法获取信息。相应配置代码如下:
! F' c/ H$ A- ]1 x6 s4 I+ R3 B    #Generic8 ?( S0 T  S: I. ^
    #KILL_ROUTE="/sbin/routeadd$TARGET跭。444.555.666"
( E8 i5 L( ~3 z' \" |; V    #GenericLinux
' B) d# [5 e) A  N# l# ^    KILL_ROUTE="/sbin/routeadd-host$TARGET$gw333.444.555.6667 a- L! N5 X5 G& ^1 E
    针对不同的平台有不同的路由命令,在配置文件中选择适台自己平台的命令即可。我的服务器是CentOS5.5x86_64,以上语法适合Linux平台的机器;PortSentry非常人性化,下面都有系统对应的配置文件,我们只需要依样操作即可。
* _& F; G. v, X$ r    (4)我们还可以利用Linux中的iptables命令,可以切断攻击主机的连接:
( x5 D) ~$ D. u7 o3 k    KILL_ROUTE="/usr/local/sbin/iptables-IINPUT-s$TARGET$-jDROP"
# q( ~0 r3 ~4 q9 v+ q4 l( f    也可以直接把攻击者的IP记录到/etc/hosts.deny文件中,利用TCP_Wrappers保护机制来防止攻击:
! \& z% O" z5 F/ J    KILL_HOSTS_DENY="ALLTARGET$#Portsentryblocked"
$ s, A8 \9 g% b( h+ ~6 Y( S+ O    系统默认是利用TCP_Wrappers来切断与主机之间的连接.$ P6 b# z/ `9 G& C# G
(5)定制警告信息# Y4 p; h! ]) d3 e$ z: l# j
    我们也可以定制一条警告信息,警告攻击者。不过,手册上建议不要使用该选项,因为这样做可能会暴露主机的IDS系统。8 y7 b- _+ l* W1 N+ P% T
    PORT_BANNER="**UNAUTHORIZEDACCESSPROHIBITED***YOURCONNECTIONATTEMPTHASBEENLOGGED.GOAWAY."
: J4 J3 \$ }8 y7 \( \0 r    修改完毕后,改变文件的权限。以保证其安全性:
$ I4 h0 d3 K) h. E6 K    chmod600/usr/local/psionic/portsentry/portsentry.conf
) F: h: ?3 n6 m/ r9 ]    2.配置portsentry.ignore文件
  T$ i# x; m3 a' e    /usr/psionic/portsentry/portsentry.ignore文件中设置了希望PortSentry忽略的主机IP,即允许合法扫描的主机地址下面是配置情况:
6 x6 x% B) G3 Q( f    #Puthostsinhereyouneverwantblocked,ThisincludestheIPaddresses
  @) q! w1 S% C& o    #ofalllocalinterfacesontheprotectedhost(i.evirtualhost,mult-home)
& E' R$ s. O" u; d0 ^4 n8 V5 L    #keep127.0.0.1and0.0.0.0tokeeppeoplefromplayinggames." j8 @" {  H& l4 Z4 R' o$ k
    127.0.0.1/328 F% k" K, C* Z8 }( K& c
    0.0.0.0
7 C7 E$ o% Q& s* T    #Excludealllocalinterfaces/ }6 A" a9 _2 f: }$ e& s
    192.168.1.1035 F! z/ Z; S% m- M
    192.168.1.1029 `+ X. n) X* n) P3 j
    127.0.0.1
+ _9 r0 A  x$ f8 y' j9 V    记得带上本机地址,以防万一。
. N% c8 \0 ~2 M2 {: ^    修改完成后同样需要改变文件默认的权限:
# I) t9 H! l9 X) X& }+ h    chmod600/usr/local/psionic/portsentry/portsentry.ignore
3 p7 i  c/ t0 f    三、启动检测模式
% [/ C* T( g% X# D5 T  _5 \    最后介绍一下PortSentry的启动检测模式。对应TCP和UDF两种协议方式,PortSentry分别有三种启动模式,即基本、秘密和高级秘密扫描检测模式,合计6个模式。
# B8 @9 Q  [+ w: F8 J% t7 q9 q    ◆portsentry-tcp,TCP的基本端口绑定模式;
1 P* y: z  E4 f: K1 j9 A    ◆portsentry-udp,UDP的基本端口绑定模式;0 n, n2 X& F5 P5 p, }
    ◆portsentry-stcp,TCP的秘密扫描检测模式;
% y+ K! }- l5 p9 n. q9 `    ◆portsentry-sudp,UDP的秘密扫描检测模式;
  X3 L% R0 k# v+ C# w( Y  m6 F2 m    ◆portsentry-atcp,TCP的高级秘密扫描检测模式;
0 e. Q% n2 f# E    ◆portsentry-audp,UDP的高级秘密扫描检测模式。
" t0 C1 H, i" ]0 w8 v    一般情况下,建议使用秘密扫描检测模式或高级秘密扫描检测模式。
, l" X1 W6 ^. E' G' C3 i    使用高级秘密扫描检测模式(AdvancedStealthScanDetectionMode),PortSentry会自动检查服务器上正在运行的端口,然后把这些端口从配置文件中移去,只监控其它的端口。这样会加快对端口扫描的反应速度,并且只占用很少的CPU时间,这种模式非常智能,我比较喜欢用* H1 R1 g. @- F5 N* s: ~* b# w
    启动PortSentry的命令如下:* p: h0 ]8 ~6 ~3 D
    #/usr/psionic/portsentry/portsentry-atcp( R( M7 a' r: ?( T
    可以把启动命令加到“/etc/rc.d/rc.local”脚本文件中,果想让它和其它后台进程一样可以随时启动、停止并查看进程状态,可以去这样当重新启动计算机的时候PortSentry就会自动运行。4 T. `- C+ s: c0 z( @
    四、测试
8 K, a& }9 u- I0 E, j    我们在192.168.1.102上启动PortSentry后,先暂时清掉portsentry.ignore里的文件,然后在另一台192.168.1.104的机器上启动扫描命令nmap-sS192.168.1.102。稍等片刻,就会发现/etc/hosts.deny里会出现ALL:192.168.1.104的字样,证明此软件配置都是生效的。
8 m$ ?' w) V8 H  b% g6 _    为了证明其有效性,我拿自己的线上的一台LVS机器布署了portsentry1.2,查看日志发现
! A1 R1 Z2 z+ w* J& y    [root@localhostportsentry_beta]#tail/var/log/messages: \# W1 t8 Q2 L
    Jun613:11:07localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89toTCPport:80* S, p4 \- h7 H
    Jun613:11:07localhostportsentry[2555]:attackalert:Host65.9.251.89hasbeenblockedviawrapperswithstring:"ALL:65.9.251.89"; _. T( H; i8 `( }8 i* D
    Jun613:11:07localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89toTCPport:80/ m3 @1 @7 P) N
    Jun613:11:07localhostportsentry[2555]:attackalert:Host:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89isalreadyblockedIgnoring, ~# L* a: \  ^
    Jun613:11:08localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89toTCPport:80% {* G/ H, f* a* x4 H! n
    Jun613:11:08localhostportsentry[2555]:attackalert:Host:adsl-65-9-251-89.mia.bellsouth.net/65.9.251.89isalreadyblockedIgnoring
0 t( z! V; P4 c7 _- z    Jun613:19:57localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:ns38534.ovh.net/91.121.14.153toTCPport:80
1 `, \  [0 {, h* N    Jun613:19:57localhostportsentry[2555]:attackalert:Host91.121.14.153hasbeenblockedviawrapperswithstring:"ALL:91.121.14.153"  g9 B& G1 d  Z3 H. o
    Jun613:35:44localhostportsentry[2555]:attackalert:TCPSYN/Normalscanfromhost:61.156.31.43/61.156.31.43toTCPport:80; N: y; f# s& M" B. n. h5 Y. w% Y
    Jun613:35:44localhostportsentry[2555]:attackalert:Host61.156.31.43hasbeenblockedviawrapperswithstring:"ALL:61.156.31.43"
; P' W- i/ I. R4 N    检查了下/etc/hosts.deny,发现如下恶意IP:" H+ {3 }( ?' |3 E; q- n8 O' h! u
    ALL:113.57.224.3
" k+ n1 R! s$ `% J    ALL:124.238.249.246: i6 K  X" ~3 }$ M- H
    ALL:65.9.251.89, h' t. Q2 R# F( ^7 |5 m* I
    ALL:91.121.14.153
. d) }: a$ L4 N( ]) z( h9 d    ALL:61.156.31.43
7 p+ j$ K* a4 U
  }' A; F: G% l3 H1 i6 t本文参考: http://linux.chinaitlab.com/server/858720.html

返回列表
Namecheap
Namecheap.com - Cheap domain name registration, renewal and transfers - Free SSL Certificates - Web Hosting
互联网安全