fire the inspiration

剑气凌人

雷斯林的网络随想

1月 3rd, 2006 by 剑气凌人, 1,455Views

原贴地址
不好意思.最近忙着带队做年末的安全巡检.忙的要死.
但是看到有朋友支持.还是在深夜继续写下去吧.谢谢.

==================================

今天清闲.没上WOW.没有事情.公司发呆.
群里面开始发经典的URL.跟着上来看看.

首发经典论坛.Blueidea.com 转载请保留作者信息.

[WWW.REISTLIN.CN]

随便写写吧.谢谢.

1.希望各位朋友把 “路由器” 与 “带路由功能的ADSL设备” 与 “支持路由协议的宿主” 之间的差异与概念弄清楚.不要上来就一句: “我的路由器怎么怎么了?” 你可以说我挑剔和无聊.但是我仅仅是为你考虑.因为你发在技术区.证明你是搞技术的.所以请不要以后让别人觉得.技术不值钱.

路由器的功能很容易实现.无论是单片机还是X86架构的设备或者ASIC芯片级的设备.
一般来说非单接口支持OSI三层数据包转发的设备都可以称为路由设备.
我们习惯性的路由器我个人认为是CISCO为代表的.至于如今的ADSL终端带路由功能的设备.
请说清楚.不要让入门的菜鸟误解.比如:网管一词.请说清楚.到底是网络管理员WEBMASTER或者NETMASTER.还是网吧管理人员.谢谢.

2.希望明确防火墙的概念.如硬件.软件之分.
不要跟我谈什么硬件防火墙与软件防火墙.有个铁BOX盒子就是硬件的?装个SOFT就是软件的?
醒醒吧.各位.不要想当然.国内N多所谓的企业级硬件千M防火墙在我看来就是一个X86的板.
PIII的CPU.256M内存装个REDHAT LINUX企业版本.重新编译下内核.整个工控的INTEL的网口.
卖给你.说是硬件的.你觉得呢?(抱歉我不想说厂家名,但是我是亲眼所见.)

这个星球上最优秀最高端的防火墙.我很遗憾的告诉你.是软件.
同样很遗憾的告诉你.你通过网络访问的每一个数据都会通过它.
而这个名为CheckPoint的软件防火墙可以支持包括WINDOWS.LINUX.SUN.UNIX几乎所有的操作系统.
请把你的眼睛从无聊的OSI 1-3层模型脱离出来.不要认为数据包是独立的.一个一个没有逻辑关系的.
不要认为数据包的行为只有IN和OUT.不要认为数据包只涉及到IP和MAC.还有很多4-7层的应用是你无法想象的.

真正从物理上属于硬件的防火墙恰恰是最最弱智最不够AI的.因为你不能指望ASIC芯片能具有智能的CPU的运算能力.ASIC芯片只会做你告诉他做过的事情.重复的重复.快速的重复.而不能像CPU一样可以运算和逻辑分析.(业内的硬件防火墙我所知道的是NetScreen与Fortigate).

硬件防火墙的优势就是快速.快到什么程度.说白了就是接近线速.行话叫跑背板.
最大的缺点是.不够智能.防火墙存在的目的是做访问控制与安全.不是交换机.
所以一款没有安全性只有速度的防火墙是愚蠢的.非常非常的愚蠢.

而软件防火墙的优势我就不说了.主要的问题是要通过CPU处理4-7层的应用攻击.比如SQL攻击.
或者恶意的入侵等.这些攻击其实数据量很小的.对于此类防御来说.AI是最重要的.
当然了.也要讲究算法.具体什么算法我下面继续说.

3.状态检测入门.数据的流向.
明确这些就不会问: “啊?封了我的80那我们不是都不能上网!” 这种可笑的问题.
人人似乎都知道三次握手.人人都知道OSI.但是真正理解的有多少?

A访问主机B.是由A来主动发起访问请求.并且B回应A的请求.并且A与B会维持一个正常的网络会话.
这个过程是从OSI的1-7层的一系列过程.我们不能只到3层就放弃继续理解了.
在第3层的时候我们都知道会Routeing.然后呢?就是建立整个会话.协商窗口.这个属于4到7层的范围.

如果在A和B之间有一台4-7层的网络设备.比如.代理也好.防火墙也好.他必然会有A和B所有的通讯的状态与会话的列表.这个列表你一旦拥有.你就可以做访问控制也好.做欺骗也好.随便你.

OK.现在知道了访问是双向的.并且是需要2者同步维护的.端口虽然是一样的.比如80.
但是访问却不是简单的从A到B或者从B到A.需要说明的是.如果你是个3层设备.
那非常遗憾的告诉你.你只能做的事情就是:要么全部拒绝80端口的流量.要么全部允许.
三层设备是无法知道你到底是由A发起到B的访问还是由B到A发起的访问.
他只知道.这个数据包.流过我.要去80.那我就砍掉.或者放行.
在三层设备看来.所有的数据包都是一个一个独立的.一个接一个的流过自己.

但是实际呢?我们的通讯不是一个包就可以OVER的.要很多个包.每个包有自己的状态和特征.
到目标地址后重新逻辑的组合.然后在解开.这一切的逻辑.三层设备根本就不知道的.
包与包之间维系的状态的检测与智能的分析.就叫做状态检测.

访问的发起.决定了会话的流向与访问的方式.

4. NAT.PNAT.包过滤与状态检测的区别.

上面已经说过了.包过滤工作在OSI的第三层.
看到的只有源的MAC和IP以及目标地址的MAC和IP.
因为只有满足了上面的4点数据包才能在网络上传输.

讲包过滤之前我们先看NAT.

同样的.我们大家熟悉的NAT技术.就是工作在这一层.
NAT的原理简单的描述就是:替换数据报的源IP地址与源MAC地址.目标地址保持不变.
同时在宿主上增加一条三层会话表.将此会话与原始的内部源做一一对应的关系.
等待目标返回的数据包.当收到目标返回的数据包的时候做反操作然后路由到对内接口.

智商正常的应该已经发现了.关键的问题是一一对应.
换句话说.你有3个私有地址.就必须有对应的3个公网地址才能一一对应!
但是这显然是不可能的.否则干吗还要多对一的节约地址呢?干吗还要NAT呢?

回答是这样的.NAT技术是为了保护内部DMZ的服务器的真实IP地址.
一一对应的NAT现在更多用在双向通讯上.也就是说.内部主机既可以上网出站访问.
外部的用户也可以访问到内部的主机.虽然内部主机是私有地址.
这种NAT的模式叫做Static NAT.Cisco称为静态NAT.
在网络内的主机Cisco称为堡垒主机.而网络安全业界更喜欢叫做DMZ主机.

对于多内部私有地址共享上网.实现的技术叫PNAT.也叫HIDE NAT.
NAT必须要建立一个会话表来对应数据包与内部真实主机的对应关系.
如何使用一个公共IP地址来对应多个主机呢?其实很简单.就是用端口.

你可以这么想象.地址202.96.128.86这个地址给A和B和C同时使用.

当A发起对外访问的请求的时候.A将使用202.96.128.86这个地址做为转换后的地址.
端口呢?可以选择任意一个.比如1024.即对应关系表是:

202.96.128.86:1024 A

那么B访问的时候我们使用1025.C用1026.则:

202.96.128.86:1024 A
202.96.128.86:1025 B
202.96.128.86:1026 C

现在大家看到的.就不是刚才所说的三层会话表.因为设计到端口了就进入到了第四层.
所以我们可以看到.四层会话表比三层的多了一个端口的状态.所以四层会话表会相对庞大一点.当然了.端口是有限的.当同时超过65535-的用户同时访问网络的时候.你们会发现.肯定是丢包严重无法上网.因为公共IP只有一个.并且端口只有65535-这么多.显然不够用了.

不要怀疑会不会出现这种情况.一个大学很容易就会有这种局面.

怎么解决.对了.我们可以做一个地址范围: 202.96.128.86 - 202.96.128.166 之间.
这一段来作为转换的POOL.我们叫地址池.这样应该就够了吧.恩.差不多够了.呵呵.

需要特别说明的是.这个池里的地址是随机选择的.不是顺序的.
我的顺序的意思是.当第一个地址的端口用完以后顺着用第二个.其实不是这样的.
都是随机的.不相信的朋友可以通过DUMP抓包看看就知道了.

看到这里.希望有人会有个初步的印象.看不懂没关系.
如果真看的明白了.那么恭喜你.远离了无聊的IT考试制度.

进入了第四层.很高兴的通知你.你不是一个拉线的.不是一个维护.不是一个”网管”了.

包过滤.数据包的过滤.一样的道理.原始的包过滤工作在第三层.
与工作在第四层的包过滤有什么区别?如果你回答不上来.
我奉劝你节约社会与网络资源.转行吧.去广州开个粥粉面的档口.挺不错的.真的.
我老总他老婆一天毛利7K多.比你现在有前途多了.

答案是: 第三层包过滤只能按照IP地址来过滤.
无法区分是哪个端口的信息.比如80端口.比如21端口的通讯.
在三层设备看来: 1.1.1.1:21 的数据包 与 1.1.1.1:80 的数据包是一种类型.没区别.
而实际呢.前者是访问FTP服务的应用.而后者是访问WEB的应用.

按照这个思路.如果在第四层来做包的过滤与访问的控制不就完美了?
因为可以看到具体是通过哪个端口传输的?

基本没错.我只能说.基本.

有没人注意到.我上面说的.一直都是用”具体是哪个端口”的”端口”这个词.
而没有说”具体是哪个服务.比如FTP”.为什么?

人人都知道21端口是FTP.80端口是WEB.
但是我告诉你.并不是21端口就绝对等于FTP服务.80端口就绝对是WEB的访问.

没错.人们可以修改端口.同样可以访问.就比如窗户就是可以打开的.
但是具体打开窗户将进来的是垃圾还是阳光.你不见得是可以随时知道的.

所以.指望通过第四层的IP+端口来判断数据包的真实目的是比较愚蠢的.
因为我完全可以把FTP的端口改成22.同样可以访问.
但是人人都知道.22端口是SSH.但这并不影响我把21改成22当成FTP来用.

这个致命的问题.让无数的攻击者兴奋.
普通的防火墙根本无法区分端口上到底跑的是什么应用?
或许一个攻击者在你的服务器上种植了木马使用了你原来没有使用的21端口.
而你的防火墙确认为21端口是FTP的通讯.默认保持放行.那实在是太悲哀了.
我仅仅是举个例子.实际中我遇到的是将木马设置为RTSP的端口或者NETMEETING.

怎么办?

— 状态检测!

防火墙需要应用CheckPoint的状态检测专利技术.
必须要深入的了解到整个会话的状态.通讯的协议规范.
很显然.RFC对于FTP的通讯协议规范肯定与SSH的不同.
否则这2个协议不是可以互连互通.那还不如就当做一种协议了.

真正的状态检测的防火墙会严格检测你端口与其上应用的连接和会话状态.
只要不符合RFC的标准.不符合TCP/IP的规范.一律给你DROP掉.
比如我防火墙上的策略规定允许21端口也就是FTP入站访问.
假如你的数据包通过防火墙的时候.虽然端口是21.但是请求与特征不符合RFC里对FTP特征的定义.那么对不起.你还是靠边站吧.

基本了解了吧?恩.好样的.不过.状态检测在如今仍然也不算太AI的技术.
是不是觉得有点受不了了.那什么才叫更安全更AI的呢?

恩.我说到哪里了?

对了.状态检测也不是最智能的.那什么是最智能的呢?
能防御人的攻击就是最智能的.这是基本思想.

记得在Radware的一次安全研讨会上.他们的工程师说过.
攻击一般分为2种.一种是Infiltration.一种是DoS.
DoS不用多说了.比资源.没什么好说的.(排除一种叫ShiZai攻击的例外.后详.)
DoS只要是个交换机都可以发现.因为无非就是流量嘛.
但是渗透往往是很小很小的流量.如果你不深入检测数据根本发现不了.
如何深入检测?当然是4-7层的检测.行话叫:应用层的攻击检测.

什么是应用层的攻击.一个例子.SQL注射就是代表.
你光靠封端口去保护服务器在如今作用已经不大了.
不可能你为了防御SQL注射把80也给关了吧?我们必须承认:

安全性与可用性之间的矛盾.是不可调和的.
同样的.安全性与性能.也是互相侵蚀的.

不可能你装了防病毒你的机器不会慢.为什么会慢?
你提高了安全性.没错.但是你牺牲了性能.牺牲了可用性.

如何去防御应用层的攻击.如何去防御人的攻击?
我们换个角度想一下.入侵.攻击.最终的目的是什么?

其实.无论入侵如何掩盖.攻击如何变化.代码如何调优.目的其实都是一样.
比如一个木马.再怎么隐蔽.再怎么小巧.再怎么怎么怎么怎么怎么怎么…
仍然无法逃脱2个特征: 1.收集信息 2.传递信息

又比如一个SQL注入攻击.或者一个SHELL的获得.
目的是要获得自己需要的.比如返回的信息或者是开放端口.对外操作.
虽然有无数的方法和策略.无数的软件和特征.目的几乎都是一样的.

所以针对这一点.某安全公司(不想在说了.免得让人觉得是广告.而我只是说事实.)
建立一套安全系统.针对攻击不仅仅使用业内经常使用的如下手段:

1. 建立攻击和入侵的特征库.比对数据包特征与会话的状态.
2. 严格检测不同区域之间的访问情况与协议规范性.
3. 记录并学习正常数据与请求的波动范围与阈值.

而是使用了针对我刚开始提到的”最终目的”的检测方法.
名为: 可疑代码模拟器 Malicious Code Protecto
原理很简单.就是在获得了你所有数据与请求的同时.
将访问请求COPY一份到一个虚拟出来的真实WEB环境中去运行一次.
看看这个请求是否会破坏这个虚拟的WEB环境.

毫无疑问.这是最可靠的检测方式.没有人会怀疑.
因为MCP只关心最终结果.而不在乎你怎么掩盖与变化.
正如我们说.如果我没有了RPC漏洞.无论什么冲击波.震荡波.或者其他波的变种.
都对我不会造成困扰.无论怎么个变种怎么个传播.都与我没有关系.
为什么?因为我根本就没有RPC的漏洞.一切的攻击核心是因为RPC漏洞而起.
我直接扼杀根本.任你怎么耍都没有用.所以我们说.一旦修补了漏洞.严格比对RFC规范.
我们可以防御已知和未知的攻击.防御ZERO DAY.防御一切非正常访问的侵蚀.
这将比常规的依靠病毒库.攻击特征库来被动防御的方法要聪明的多了.

恩.有人已经忍不住了.要开始说了.这样是很好.但是你每个访问每个请求都要检测.
每个会话状态都要跟踪.并且还要COPY一份来模拟运行.这一切将会是多么的慢啊?

是啊.会影响整体的吞吐性能.没错.但是实际上影响并不大.
因为可以使用一个聪明的办法.这个办法.很遗憾.国内几乎所有的产品竟然都没有采用.

办法是: Ignore Request. Responses Action.
啊哦.都已经转钟了.简单点说吧: 请求我将忽略掉.回应的时候进行操作活动.
我们都知道.一个正常的会话要三次握手.对吧?说简单点.
首先是一个请求过去.然后是一个回应.然后同步完成一个会话.

我们可以想象.如果A与B之间有个C作为保护设备.

A –> C –> B

当A发起向B的请求的时候.这个请求经过了C.
如果C这个时候将这个请求抓到自己怀里检测一遍.
发现没问题了就放过去继续丢给B.这一切在A看来.是不是无法忍受的?

可以肯定.C在检测A发给B的请求的时候浪费了太多时间.
以导致B接受到A的请求的真实时间要慢的多.同样的.B回应给A的回复.在A看来.
也当然是慢的无法忍受了.

这就是为什么.代理型网关.代理型防火墙.一接入到网络主干上.
网络速度利马慢下来的根本原因.很容易理解了吧?

再次遗憾一次.几乎大多数安全厂家的产品.都是这样的.
据我所知道的.只有Symantec和CheckPoint不是这样.

那是哪样呢?我们来看一次完整的会话.

A –> B (A发起请求到B)
B –> A (B响应请求回A)
A B (同步.协商窗口.等等)

我们只探讨前2个步骤.简单.一是A到B.二是B回应A.
不能使用愚蠢的在第一个步骤来做拦截检测.
那我们怎么做?注意!是这样的.

A –> C ==> B

1. 当A发起请求到B的时候.经过了C.
2. C将直接放行A对B的请求.同时复制这个请求.
3. 将复制的这个请求进行检测.比如.特征匹配.状态检测.协议异常检测.MCP等等.
4. 如果这个由A请求到B的会话没有发现任何异常.那么.后续B回应到A的包将忽略.
B的包将正常回应到A.C将不作任何操作与干涉.回话0时间损耗的完成.
5. 如果这个由A请求到B的会话有异常.那么.C将过滤到B回应到A的数据包.
导致这个由A发起的会话无法建立.导致会话失败.防御这次A发起到B的攻击.

恩.我不太会做FLASH.否则更容易理解.
不管理解不理解了.累了.要睡觉了.呵呵.

Filed under 系统 having

One Response

  1. seno Says:

    写的不错

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.