一、Squid及ACL简介
代理服务器是介于浏览器和Web服务器之间的另一台服务器。有了该服务器之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,信息会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给客户的浏览器。
现代企业应用代理服务器,除了提高访问速度外,同时,它在实际的应用过程中又通常被企业作为“安全网关”,可以根据企业设定的代理规则来过滤和屏蔽一些用户的非法请求和信息,从而达到保护企业网的目的。在企业开源系统的代理服务中,可以通过设置安全访问控制规则、配置带认证的代理服务以及反向代理服务来确保企业网络安全,本文将详细对这些防护手段进行介绍。
开源代理服务器Squid简介
Squid可以工作在很多的操作系统中,如AIX、Digital、UNIX、FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等。对于Web用户来说,Squid是一个高性能的代理缓存服务器,和一般的代理缓存软件不同、Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。Squid由一个主要的服务程序Squid,一个DNS查询程序DNS server,几个重写请求和执行认证的程序,以及几个管理工具组成。当Squid启动以后,它可以派生出预先指定数目的DNS server进程,而每一个DNS server进程都可以执行单独的DNS查询,这样就大大减少了服务器等待DNS查询的时间。
用户可以从Red Hat Enterprise Linux发行套件中获取该软件的RPM包进行安装并使用#/etc/rc.d/init.d/squid start或者使用#service squid start命令进行服务开启。
使用安全访问控制限制企业用户上网行为
使用访问控制特性,可以控制在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。Squid访问控制有两个要素:ACL元素和访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。下面分别介绍ACL元素以及访问列表的使用方法。
ACL元素
该元素定义的语法如下:
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-php">acl aclname acltype string1…
acl aclname acltype “file”…
当使用文件时,该文件的格式为每行包含一个条目。
其中,acltype可以是src、dst、srcdomain、dstdomain、url_regex、urlpath_regex、time、port、proto、method中的一任意一种。
src:指明源地址。可以用以下的方法指定:
acl aclname src ip<span style="color:#9a6e3a">-</span>address<span style="color:#9a6e3a">/</span>netmask <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span> 客户ip地址
acl aclname src addr1<span style="color:#9a6e3a">-</span>addr2<span style="color:#9a6e3a">/</span>netmask <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span> 地址范围
dst:指明目标地址,即客户请求的服务器的<span style="color:#990055">IP</span>地址。语法为:
acl aclname dst ip<span style="color:#9a6e3a">-</span>address<span style="color:#9a6e3a">/</span>netmask <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
srcdomain:指明客户所属的域,Squid将根据客户<span style="color:#990055">IP</span>反向查询<span style="color:#990055">DNS</span>。语法为:
acl aclname srcdomain foo<span style="color:#999999">.</span>com <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
dstdomain:指明请求服务器所属的域,由客户请求的<span style="color:#990055">URL</span>决定。语法为:
acl aclname dstdomain foo<span style="color:#999999">.</span>com <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
time:指明访问时间。语法如下:
acl aclname time <span style="color:#999999">[</span>day<span style="color:#9a6e3a">-</span>abbrevs<span style="color:#999999">]</span> <span style="color:#999999">[</span>h1<span style="color:#999999">:</span>m1<span style="color:#9a6e3a">-</span>h2<span style="color:#999999">:</span>m2<span style="color:#999999">]</span><span style="color:#999999">[</span>hh<span style="color:#999999">:</span>mm<span style="color:#9a6e3a">-</span>hh<span style="color:#999999">:</span>mm<span style="color:#999999">]</span>
日期的缩写指代关系如下:
S:指代Sunday
M:指代Monday
T:指代Tuesday
W:指代Wednesday
H:指代Thursday
F:指代Friday
A:指代Saturday
另外,h1:m1必须小于h2:m2,表达式为<span style="color:#999999">[</span>hh:mm<span style="color:#9a6e3a">-</span>hh:mm<span style="color:#999999">]</span>。
port:指定访问端口。可以指定多个端口,比如:
acl aclname port <span style="color:#990055">80</span> <span style="color:#990055">70</span> <span style="color:#990055">21</span> <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
acl aclname port <span style="color:#990055">0</span><span style="color:#9a6e3a">-</span><span style="color:#990055">1024</span> <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span> 指定一个端口范围
proto:指定使用协议。可以指定多个协议:
acl aclname proto <span style="color:#990055">HTTP</span> <span style="color:#990055">FTP</span> <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
method:指定请求方法。比如:
acl aclname method <span style="color:#990055">GET</span> <span style="color:#990055">POST</span> <span style="color:#999999">.</span><span style="color:#999999">.</span><span style="color:#999999">.</span>
url_regex:<span style="color:#990055">URL</span>规则表达式匹配,语法为:
acl aclname url_regex<span style="color:#999999">[</span><span style="color:#9a6e3a">-</span>i<span style="color:#999999">]</span> pattern
urlpath_regex:<span style="color:#990055">URL</span><span style="color:#9a6e3a">-</span>path规则表达式匹配,略去协议和主机名。其语法为:
acl aclname urlpath_regex<span style="color:#999999">[</span><span style="color:#9a6e3a">-</span>i<span style="color:#999999">]</span> pattern</code></span></span>
在使用上述ACL元素的过程中,要注意如下几点:
acltype可以是任一个在ACL中定义的名称。
任何两个ACL元素不能用相同的名字。
每个ACL由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换句话说,任一ACL元素的值被匹配,则这个ACL元素即被匹配。
并不是所有的ACL元素都能使用访问列表中的全部类型。
不同的ACL元素写在不同行中,Squid将这些元素组合在一个列表中。
http_access访问控制列表
根据访问控制列表允许或禁止某一类用户访问。如果某个访问没有相符合的项目,则默认为应用最后一条项目的“非”。比如最后一条为允许,则默认就是禁止。通常应该把最后的条目设为“deny all”或“allow all”来避免安全性隐患。
使用该访问控制列表要注意如下问题:
这些规则按照它们的排列顺序进行匹配检测,一旦检测到匹配的规则,匹配检测就立即结束。
访问列表可以由多条规则组成。
如果没有任何规则与访问请求匹配,默认动作将与列表中最后一条规则对应。
一个访问条目中的所有元素将用逻辑与运算连接(如下所示):
http_access Action声明1 AND 声明2 AND
多个http_access声明间用或运算连接,但每个访问条目的元素间用与运算连接。
列表中的规则总是遵循由上而下的顺序。
二、ACL实战案例
声明:以下所有的访问控制配置必须添加在acl all src 0.0.0.0/0.0.0.0和http_acess deny all或http_access allow all 的前面。因为进程squid是按顺序读取配置文件的。
列表类型 | 列表内容示例 | 含义、用途 |
---|---|---|
src(源地址) | 192.168.100.1、192.168.100.0/24 | 源IP地址、网段 |
dst(目标地址) | 192.168.234.5、192.168.234.0/24、www.baidu.com | 目标IP地址、网段、主机名 |
port(目标端口) | 80、443、 8080、20 | 目标端口 |
dstdomain(目标域) | .qq.com | 目标域,匹配域内的所有站点 |
time(访问时间) | 12:00-13:00、AS | 使用代理服务器的时间段 |
maxconn(最大并发连接) | 30 | 每个客户机的最大并发连接数 |
url_regex(目标url地址) | url_regex -i ^rtsp:// | 目标资源的URL地址,-i表示忽略大小写 |
urlpath_regex(整个目标url路径) | urlpath_regex -i sex adult | 目标资源的整个URL路径,-i表示忽略大小写 |
(1)允许网段61.0.3.188/24以及172.190.96.33/24内的所有客户机访问代理服务器,并且允许在文件/etc/squid/guest列出的客户机访问代理服务器,除此之外的客户机将拒绝访问本地代理服务器:
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-bash">acl clients src 61.0.3.188/24 172.190.96.33/24
acl guests src “/etc/squid/guest”
acl all src 0.0.0.0/0.0.0.0
http_access allow clients
http_access allow guests
http_access deny all</code></span></span>
其中,文件“/etc/squid/guest”中的内容为:
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-bash">172.168.10.3/24
210.113.24.8/16
10.0.1.24/25</code></span></span>
(2)允许域名为job.net、gdfq.edu.cn的两个域访问本地代理服务器,其他的域都将拒绝访问本地代理服务器:
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-bash">acl permitted_domain src job.net gdfq.edu.cn
acl all src 0.0.0.0/0.0.0.0
http_access allow permitted_domain
http_access deny all</code></span></span>
(3)使用正则表达式,拒绝客户机通过代理服务器访问包含有诸如“sexy”等关键字的网站:
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-bash">acl deny_url url_regex –i sexy
http_access deny deny_url</code></span></span>
(4)拒绝客户机通过代理服务器访问文件中指定IP或者域名的网站,其中文件/etc/squid/ deny_ip中存放有拒绝访问的IP地址,文件/etc/squid/deny_dns中存放有拒绝访问的域名:
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-bash">acl deny_ip dst “etc/squid/deny_ip”
acl deny_dns dst “etc/squid/deny_dns”
http_access deny deny_ip
http_access deny deny_dns</code></span></span>
(5)允许和拒绝指定的用户访问指定的网站,其中,允许客户1访问网站http://www.sina. com.cn,而拒绝客户2访问网站http://www.163.com:
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-bash">acl client1 src 192.168.0.118
acl client1_url url_regex ^http://www.sina.com.cn
acl client2 src 192.168.0.119
acl client2_url url_regex ^http://www.163.com
http_access allow client1 client1_url
http_access deny client2 client2_url</code></span></span>
(6)允许所有的用户在规定的时间内(周一至周四的8:30到20:30)访问代理服务器,只允许特定的用户(系统管理员,其网段为:192.168.10.0/24)在周五下午访问代理服务器,其他的在周五下午一点至六点一律拒绝访问代理服务器:
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-bash">acl allclient src 0.0.0.0/0.0.0.0
acl administrator 192.168.10.0/24
acl common_time <span style="color:#dd4a68">time</span> MTWH 8:30-20:30
acl manage_time <span style="color:#dd4a68">time</span> F 13:00-18:00
http_access allow allclient common_time
http_access allow administrator manage_time
http_access deny manage_time</code></span></span>
(7)/etc/squid.conf,系统软件包提供、推荐的最小化配置如下,用户可以根据实际情况来进行定制
<span style="color:#333333"><span style="color:black"><code style="margin-left:0px" class="language-bash">acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 192.168.10.3/255.255.255.255
acl SSL_ports port 443 563
acl Safe_ports port 80 <span style="color:#708090"># http</span>
acl Safe_ports port 21 <span style="color:#708090"># ftp</span>
acl Safe_ports port 443 563 <span style="color:#708090"># https, snews</span>
acl Safe_ports port 70 <span style="color:#708090"># gopher</span>
acl Safe_ports port 210 <span style="color:#708090"># wais</span>
acl Safe_ports port 1025-65535 <span style="color:#708090"># unregistered ports</span>
acl Safe_ports port 280 <span style="color:#708090"># http-mgmt</span>
acl Safe_ports port 488 <span style="color:#708090"># gss-http</span>
acl Safe_ports port 591 <span style="color:#708090"># filemaker</span>
acl Safe_ports port 777 <span style="color:#708090"># multiling http</span>
acl Safe_ports port 901 <span style="color:#708090"># SWAT</span>
acl purge method PURGE
acl CONNECT method CONNECT
(<span style="color:#999999">..</span>.)
<span style="color:#708090"># Only allow cachemgr access from localhost</span>
http_access allow manager localhost
http_access deny manager
<span style="color:#708090"># Only allow purge requests from localhost</span>
http_access allow purge localhost
http_access deny purge
<span style="color:#708090"># Deny requests to unknown ports</span>
http_access deny <span style="color:#9a6e3a">!</span>Safe_ports
<span style="color:#708090"># Deny CONNECT to other than SSL ports</span>
http_access deny CONNECT <span style="color:#9a6e3a">!</span>SSL_ports
<span style="color:#708090">#</span>
<span style="color:#708090"># INSERT YOUR OWN RULE(S)HERE TO ALLOW ACCESS FROM YOUR CLIENTS</span>
<span style="color:#708090">#</span>
http_access allow localhost
<span style="color:#708090"># And finally deny all other access to this proxy</span>
http_access deny all
<span style="color:#708090">#Default:</span>
<span style="color:#708090"># icp_access deny all</span>
<span style="color:#708090">#</span>
<span style="color:#708090">#Allow ICP queries from eveyone</span>
icp_access allow all</code></span></span>
下面是对一些简单的访问控制,其中acl后面的名字可以自己随意定义
1:禁止局域网内ip 192.168.1.101访问Internet
acl client_101 src 192.168.1.101
http_access deny client_101
2:禁止局域网ip网段 192.168.1.0/24访问internet
acl client_0/24 src 192.168.1.0/24
http_access deny client_0/24
3:只允许访问baidu.com域名
acl goodsite domain –i .baidu.com
http_access allow goodsite
4:允许访问.com .net .org .cn 域名
acl goodsite domain –i .com .cn .net .org
http_access allow goodsite
5:禁止客户端下载包含.exe .mp3 .avi的文件类型。
acl badfiletype urlpath_regex .mp3 .exe .avi
http_access deny badfiletype
6:只允许客户端192.168.1.101最大并发连接数位3个
acl client_101 src 192.168.1.101
acl maxconnect maxconn 3
http_access deny client_101 maxconnect
配置带认证的代理服务抑制非法用户使用代理服务
默认时,Squid本身不带任何认证程序,但是可以通过外部认证程序来实现用户认证。一般有以下的认证程序:LDAP认证、SMB认证、基于mysql的认证、基于sock5的密码认证和基于Radius的认证。
下面介绍常用的ncsa实现的认证,ncsa是Squid源代码包自带的认证程序之一,从squid 2.5开始都包含了ncsa的模块。在Red Hat Enterprise Linux 发行套件的/usr/lib/squid目录下可以找到ncsa_auth文件。
要使用该认证服务,首先需要创建认证用户和密码:
#htpasswd -c /usr/local/squid/etc/ps_file guest
如果是以后添加用户的话就把-c的参数去掉。
然后,再更改/etc/squid/squid.conf主配置文件,添加如下:
//配置认证文件和用户文件
auth_param basic program /usr/lib/squid/ncsa_auth /usr/local/squid/etc/ ps_file
//指定认证程序的进程数
auth_param basic children 5
//代理服务器的名称
auth_param basic realm Squid proxy-caching web server
//认证有效时间为2小时
auth_param basic credentialsttl 2 hours
//只有认证用户才能访问
acl normal proxy_auth REQUIRED
http_Access allow normal
最后,重启squid服务即可。在浏览器里配上这个代理,打开任意网站,如果弹出了输入用户名和密码的对话框,就证明配置成功了。
文章来自互联网,如有版权问题,请留言。