进一步完善对服务器数据的保护??ACL执行顺序再探讨
在服务器网段中的数据库服务器中存放有大量的市场信息,市场部门的人员不希望研发部门访问到数据库服务器,经过协商,同意研发部门的领导的机器(IP地址为10.1.6.33)可以访问到数据库服务器。这样,我们的服务器网段的的访问权限部分如下表所示:
协议 源地址 源端口 目的地址 目的端口 操作
TCP 10.1/16 所有 10.1.2.20/32 80 允许访问
TCP 10.1/16 所有 10.1.2.22/32 21 允许访问
TCP 10.1/16 所有 10.1.2.21/32 1521 允许访问
TCP 10.1.6/24 所有 10.1.2.21/32 1521 禁止访问
TCP 10.1.6.33/32 所有 10.1.2.21/32 1521 允许访问
IP 10.1/16 N/A 所有 N/A 禁止访问
于是,网管就在server-protect后面顺序加了两条语句进去,整个ACL变成了如下形式:
ip access-list extend server-protect
permit tcp 10.1.0.0 0.0.255.255 host 10.1.2.20 eq www
permit tcp 10.1.0.0 0.0.255.255 host 10.1.2.21 eq 1521
permit tcp 10.1.0.0 0.0.255.255 host 10.1.2.22 eq ftp
deny tcp 10.1.6.0 0.0.0.255 host 10.1.2.21 eq 1521
permit tcp host 10.1.6.33 host 10.1.2.21 eq 1521
做完之后发现根本没起到应有的作用,研发部门的所有机器还是可以访问到数据库服务器。这是为什么呢?
前面我们提到过,ACL的执行顺序是从上往下执行,一个包只要遇到一条匹配的ACL语句后就会停止后续语句的执行,在我们的这个ACL中,因为前面已经有了一条permit tcp 10.1.0.0 0.0.255.255 host 10.1.2.21 eq 1521语句。内部网上所有访问10.1.2.21的1521端口的在这儿就全部通过了,跟本不会到后面两句去比较。所以导致达不到我们的目的。应该把server-protect这个ACL按如下形式进行修改才能满足我们的要求:
ip access-list extend server-protect
permit tcp host 10.1.6.33 host 10.1.2.21 eq 1521
deny tcp 10.1.6.0 0.0.0.255 host 10.1.2.21 eq 1521
permit tcp 10.1.0.0 0.0.255.255 host 10.1.2.21 eq 1521
permit tcp 10.1.0.0 0.0.255.255 host 10.1.2.20 eq www
permit tcp 10.1.0.0 0.0.255.255 host 10.1.2.22 eq ftp
这个例子告诉我们在写ACL时,一定要遵循最为精确匹配的ACL语句一定要写在最前面的原则,只有这样才能保证不会出现无用的ACL语句。
基于时间的ACL
在保证了服务器的数据安全性后,领导又准备对内部员工上网进行控制。要求在上班时间内(9:00-18:00)禁止内部员工浏览internet,禁止使用QQ、MSN。而且在2003年6月1号到2号的所有时间内都不允许进行上述操作。但在任何时间都可以允许以其它方式访问Internet。天哪,这可叫人怎么活呀,但领导既然这样安排,也只好按指示做了。
首先,让我们来分析一下这个需求,浏览internet现在基本上都是使用http或https进行访问,标准端口是TCP/80端口和TCP/443,MSN使用TCP/1863端口,QQ登录会使用到TCP/UDP8000这两个端口,还有可能使用到udp/4000进行通讯。而且这些软件都能支持代理服务器,目前的代理服务器主要布署在TCP 8080、TCP 3128(HTTP代理)和TCP1080(socks)这三个端口上。这个需求如下表所示:
应用 协议 源地址 源端口 目的地址 目的端口 操作
IE TCP 10.1/16 所有 所有 80 限制访问
IE TCP 10.1/16 所有 所有 443 限制访问
MSN TCP 10.1/16 所有 所有 1863 限制访问
QQ TCP 10.1/16 所有 所有 8000 限制访问
QQ UDP 10.1/16 所有 所有 8000 限制访问
QQ UDP 10.1/16 所有 所有 4000 限制访问
HTTP代理 TCP 10.1/16 所有 所有 8080 限制访问
HTTP代理 TCP 10.1/16 所有 所有 3128 限制访问
Socks TCP 10.1/16 所有 所有 1080 限制访问
All other IP 10.1/16 N/A 所有 N/A 允许访问
然后,让我们看看ACL应该在哪个位置配置比较好呢?由于是对访问Internet进行控制,涉及到的是公司内部所有的网段,这们这次把ACL就放到公司的Internet出口处。在RTA上进行如下的配置,就能够满足领导的要求了:
time-range TR1
absolute start 00:00 1 June 2003 end 00:00 3 June 2003
periodic weekdays start 9:00 18:00
exit
ip access-list extend internet_limit
deny tcp 10.1.0.0 0.0.255.255 any eq 80 time-range TR1
deny tcp 10.1.0.0 0.0.255.255 any eq 443 time-range TR1
deny tcp 10.1.0.0 0.0.255.255 any eq 1863 time-range TR1
deny tcp 10.1.0.0 0.0.255.255 any eq 8000 time-range TR1
deny udp 10.1.0.0 0.0.255.255 any eq 8000 time-range TR1
deny udp 10.1.0.0 0.0.255.255 any eq 4000 time-range TR1
deny tcp 10.1.0.0 0.0.255.255 any eq 3128 time-range TR1
deny tcp 10.1.0.0 0.0.255.255 any eq 8080 time-range TR1
deny tcp 10.1.0.0 0.0.255.255 any eq 1080 time-range TR1
permit ip any any
int s0/0
ip access-group internet_limit out
或int fa0/0
ip access-group internet_limit in
或者将ACL配置在SWA上,并
int vlan 3
ip access-group internet_limit out
呵呵,现在让我们来看看在基于时间的访问列表中都有哪些新内容吧:
time-range TR1:定义一个新的时间范围,其中的TR1是为该时间范围取的一个名字。
absolute:为绝对时间。只使用一次。可以定义为1993-2035年内的任意一个时点。具体的用法请使用?命令查看。
Periodic:为周期性重复使用的时间范围的定义。完整格式为periodic 日期关键字 开始时间 结束时间。其中日期关键字的定义如下所示:
Monday 星期一
Tuesday 星期二
Wednesday 星期三
Thursday 星期四
Friday 星期五
Saturday 星期六
Sunday 星期天
daily 每天
weekdays 周一至五
weekend 周末
access-list 101 deny ip 10.1.0.0 0.0.255.255 any time-range TR1:注意这一句最后的time-range TR1,使这条ACL语句与time-range TR1相关联,表明这条语句在time-range TR1所定义的时间范围内才起作用。
注意:给出三种配置位置是帮助大家深刻理解关于in/out的区别的。acl是对从一个接上流入(in)或流出(out)路由器的包进行过滤的。
网管发问了,“你是怎么找到这些应用的所使用的端口的?”。呵呵,在如下文件中可以找到大多数应用的端口的定义:
Win9x:%windir%\services
WinNT/2000/XP:%windir%\system32\drivers\etc\services
Linux:/etc/services
对于在services文件中找不到端口的应用,可以在运行程序的前后,运行netstat ?ap来找出应用所使用的端口号。
单向访问控制
使用IP ACL实现单向访问控制
A公司准备实行薪资的不透明化管理,由于目前的薪资收入数据还放在财务部门的Vlan中,所以公司不希望市场和研发部门能访问到财务部Vlan中的数据,另一方面,财务部门做为公司的核心管理部门,又希望能访问到市场和研发部门Vlan内的数据。我们的网管在接到这个需求后就在SWA上做了如下的配置:
ip access-list extend fi-access-limit
deny ip any 10.1.4.0 0.0.0.255
permit ip any any
int vlan 5
ip access-group fi-access-limit in
int vlan 6
ip access-group fi-access-limit in
配置做完后,测试了一下,市场和研发部门确实访问不到财务部了,刚准备休息一下,财务部打电话过来说为访问不到市场与研发部门的数据了。这是怎么回事呢?
让我们回忆一下,在两台主机A与B之间要实现通讯,需要些什么条件呢?答案是既需要A能向B发包,也需要B能向A发包,任何一个方向的包被阻断,通讯都不能成功,在我们的例子中就存在这样的问题,财务部访问市场或研发部门时,包到到市场或研发部门的主机,由这些主机返回的包在到达路由器SWA时,由于普通的ACL均不具备检测会话状态的能力,就被deny ip any 10.1.4.0 0.0.0.255这条ACL给阻断了,所以访问不能成功。
要想实现真正意义上的单向访问控制应该怎么办呢?我们希望在财务部门访问市场和研发部门时,能在市场和研发部门的ACL中临时生成一个反向的ACL条目,这样就能实现单向访问了。这里就需要使用到反向ACL技术。我们可以按照如下配置实例就可以满足刚才的那个单向访问需求:
ip access-list extend fi-main
permit tcp any 10.1.0.0 0.0.255.255 reflect r-main timeout 120
permit udp any 10.1.0.0 0.0.255.255 reflect r-main timeout 200
permit icmp any 10.1.0.0 0.0.255.255 reflect r-main timeout 10
permit ip any any
int vlan 4
ip access-group fi-main in
ip access-list extend fi-access-limit
evaluate r-main
deny ip any 10.1.4.0 0.0.0.255