php文件系统攻击向导
Posted in 安全相关, 搬家之前 on 4月 12th, 2009 by 飘(piao2010) – Be the first to comment
一.php文件系统路径正常化攻击
在路径中使用/和/.会使/etc/passwd/或者/etc/passwd/.作为一个文件被打开.
二.php文件系统过程路径截断攻击
PHP有一个路径截断的问题(一个非常邪恶的手段snprintf())只允许使用MAX_PATH被作为打开文件或者目录的鉴定.
一.php文件系统路径正常化攻击
在路径中使用/和/.会使/etc/passwd/或者/etc/passwd/.作为一个文件被打开.
二.php文件系统过程路径截断攻击
PHP有一个路径截断的问题(一个非常邪恶的手段snprintf())只允许使用MAX_PATH被作为打开文件或者目录的鉴定.
之前接触的是FreeBSD,最近想学习一下Linux,朋友推荐centOS,于是就打算在服务器上装一个跑跑。
下载安装就不说了,都挺简单的。设置好网络,配置好SSH,基本上和BSD下一致。然后准备安装软件,yum命令听说特别好用,哈哈!首先设置一下,这里采用的是科大的 http://centos.ustc.edu.cn/
步骤一:
cd /etc/yum.repos.d
mv CentOS-Base.repo CentOS-Base.repo.save
wget http://centos.ustc.edu.cn/CentOS-Base.repo.5
mv CentOS-Base.repo.5 CentOS-Base.repo
步骤二:
rpm –import http://centos.ustc.edu.cn/centos/RPM-GPG-KEY-CentOS-5
然后yum update一下。
接下来安装软件就爽了。yum install XXX
配置软件的过程和BSD下基本一致,但是yum命令比BSD的ports更快更简单。
官方的文件通俗易懂,相信有需要的朋友们一看就能明白。
#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
* Sniffit V.0.3.7 Beta *
# By Brecht Claerhout #
* *
# This program is intended to demonstrate the unsafeness of TCP (currently) #
* No illegal activities are encouraged! *
# Please read the LICENSE file #
* *
# Sniffit grew a little upon its original intentions and is now #
* extended for network debugging (UDP, ICMP, netload, etc.) *
#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
* Libpcap library *
# This product includes software developed by the Computer Systems #
* Engineering Group at Lawrence Berkeley Laboratory. *
#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
0. Introduction, and some stuff you should know.
0.1 Credits and contact
0.2 Compiling
0.3 License
1. Programmers notes
excuses for my incompetence
2. Use of the program
flags and examples
3. Extra info on use
3.1 Running interactive mode
3.2 Forcing network devices (*READ*)
3.3 Format of the config file
3.4 Loglevels
4. The output
4.1 Normal
4.2 Logfile
5. IMPORTANT NOTES, READ!
this also!
——————————————————————————
0. Introduction, and some stuff you should know.
————————————————
0.3.7 (Beta). It has been a while I know. But this year has been a hell, last
year of uni, projects, thesis, …. it didn’t stop. Well that is behind us
now, the most important thing, is that I’m back working on the program again,
and intend to keep on doing it.
I hope you enjoy this beta version. Like always, I removed some bugs. There
is a new ‘logging’ feature. It is now possible to record traffic with
Sniffit and process it later! (it is completely different from the logging
done in the 0.3.6 version, that is known to some hardcore Sniffit users)
Please take a minute to skim through the text and read the passages marked
with a ‘*’, these are the new features.
(Please read BETA-TESTING)
I use the libpcap library developed at Berkeley Laboratory, for easy
porting (Read the licence).
0.1 Credits and contact
———————–
Credits go to (in order of appearance on the Sniffit scene):
Wim Vandeputte <wvdputte@reptile.rug.ac.be>,
best friend and UNIX guru, for support, testing and
providing me with a WWW site.
Godmar Back, for fixing that kernel 1.2.X bug (Sniffit 0.1.X).
Peter Kooiman, of Paradigm Systems Technology for providing read more »
Pureftpd基础:安装、配置、实现匿名登录
一、安装
我是以FreeBSD为平台的,其它Unix/Linux平台请参考相关shell命令。在shell提示符下输入:
# cd /usr/ports/ftp/pure-ftpd
# make install clean
# rehash
FreeBSD会以ports方式安装pureftpd。其它平台的安装方法参看相关文章。
二、启动
将pureftpd配置文件的样例文件复制为配置文件:
# /usr/local/sbin/pure-config.pl /usr/local/etc/pure-ftpd.conf
用配置文件启动 PureFTPd :
# cp /usr/local/etc/pure-ftpd.conf.sample /usr/local/etc/pure-ftpd.conf
注意:如果是其它平台,或者采用编译方式安装,路径可能与上面的不同。
三、匿名登录
经过上面的步骤,pureftpd已经启动。用 flashfxp 连接,只能系统用户连接(用“/etc/passwd”文本文件中的用户认证)。 这是因为默认的配置文件中是允许匿名用户和系统用户(根帐号 root 除外)都可以访问的。但这时匿名用户还无法访问,出现“421 无法建立安全匿名 FTP”错误。还需要几个步骤才能实现匿名登录。
pureftpd 的官方文件(http://download.pureftpd.org/pub/pure-ftpd/doc/README)说:
———————— SETTING UP AN ANONYMOUS FTP ————————
If a ‘ftp’ user exists and its home directory is reachable, Pure-FTPd will
accept anonymous login, as ‘ftp’ or ‘anonymous’. Files have to be located in
the home FTP directory. There’s no need for ‘bin’, ‘lib’, ‘etc’ and ‘dev’
directories, nor any external program. Don’t chown the public files to
’ftp’, just writable directories (’incoming’) .
就是说需要存在一个名称必须为“ftp”的系统用户,并且它的主目录可用。就可以实现匿名用户登录了。
心得:很多人在问为什么不能匿名登录,原因就在于没有“ftp”系统帐号,以及没有创建主目录()这里。
1、为匿名用户添加系统帐号和组。
增加一个“ftp”组:
# pw groupadd ftp
如果组存在,直接添加用户即可。
添加“ftp”系统用户:
# pw useradd ftp -g 14 -d /var/ftp -s /sbin/nologin
其中的 “/var/ftp”就是匿名用户的主目录,你可以指定为其它目录,比如“/home/ftp”等。
14是“ftp”组的组id 。其它的,比如 www 系统用户的 uid/gid 是:“80/80”,等等(见 /etc/passwd )。
如果发现帐号是存在的,那么请检查帐号的主目录是否存在,如果不存在,也会提示上述错误。
2、建立匿名用户的主目录。
# mkdir /var/ftp
# mkdir /var/ftp/readme
其中“mkdir /var/ftp/readme”是给个参照,因为“/var/ftp”是空的。
3、测试。
马上用 flashfxp 匿名登录,见到 readme 文件夹了,成功,激动!但是上传、下载、建目录什么的都不允许,要实现这些功能需要进一步修改配置文件,这个在我后续文章中有详细讲解。
用shell用户或虚拟用户登录pureftpd
一、系统真实(shell)用户登录
默认配置文件允许匿名用户登录,同时允许系统真实用户登录。经过上面的步骤后(详情见我的前一篇文章《pureftpd基础:安装、配置、实现匿名登录》),这时我们用系统用户登录,是可以登录,并且可以上传、下载、建目录和删除等。
如果要让 FTP 只支持系统真实用户登录,你只要稍微修改一下 pureftpd 的配置文件就可以了。
# ee /usr/local/etc/pure-ftpd.conf
ChrootEveryone yes
NoAnonymous yes
UnixAuthentication yes //用“/etc/passwd”中的用户认证
只需以上三行就可以实现只允许系统真实用户登录 FTP 。系统真实用户会登陆到自己的系统主目录中,可下载,可上传,可删除,没有任何限制。但是由于有 chroot 的限制,所以无法去真实系统的其它目录而已。在实际应用中,这种用法并不多见,我也就不费篇幅介绍了。
二、puredb虚拟用户支持
1、建立 FTP 专用的系统用户。
自从 0.99.2 版本开始,pure-ftpd 就开始支持虚拟用户。
虚拟用户方式是一个简单的用户列表机制,类似于“/etc/passwd”,它将用户的相关信息,如口令、姓名、 uid、gid、主目录等,存入一个文本文件。但是该文本文件文件只适用于 FTP 。这意味着,你可以很容易地设置 FTP 虚拟帐号,而不需要在系统中添加系统用户,以免和系统用户混淆在一起。
同时,可以为这些虚拟用户单独设置配额、ratio、带宽等限制,这些功能是系统用户认证无法实现的。很多虚拟用户可以共享同一个系统用户的属性,因此建议为这些虚拟用户单独创建一个系统用户,从而方便管理。
你可以使用系统已经存在的帐号,比如“nobody”用户,作为虚拟用户的系统帐号。但最好使用一个单独的帐号,专门对应 FTP 。我们选择新建系统用户(经测试,在 linux 系统中如果用 linux 系统自带的 ftp 用户,在用虚拟用户登陆时会出现不被信任的提示。大家也可以做做实验,看是不是这样)。建立方法如下:
对于 Linux/OpenBSD/NetBSD/Solaris/HPUX/ 或其它的类 Unix 系统,使用下面的命令:
groupadd ftpgroup
useradd -g ftpgroup -d /home/ftp -s /sbin/nologin ftpuser
对于 FreeBSD ,用下面的命令:
# pw groupadd ftpgroup
# pw useradd ftpuser -g ftpgroup -d /home/ftp -s /sbin/nologin
系统帐号建立好后,我们就开始着手准备虚拟用户了。
2、建立虚拟用户。
使用 ”pure-pw”命令实现创建、修改和删除虚拟用户等操作。虚拟用户的信息以每个用户一行的方式存放在相应的文本文件中。你也可以手工编辑这个文件。其存储格式如下:
<account>:<password>:<uid>:<gid>:<gecos>:<home directory>:<upload bandwidth>:<download bandwidth>:<upload ratio>:<download ratio>:<max number of connections>:<files quota>:<size quota>:<authorized local IPs>:<refused local IPs>:<authorized client IPs>:<refused client IPs>:<time restrictions>
除了帐号、口令、uid、gid 和 home directory 之外,其它的可以是空值。
下面是 pure-pw 命令用法。
(1)创建新用户。
要创建一个新用户,用下列的语法。
pure-pw useradd <login> [-f <passwd file>] -u <uid> [-g <gid>]
-D/-d <home directory> [-c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client host>[/<mask>][,<allow client host>[/<mask>]]…]
[-R <deny client host>[/<mask>][,<deny client host>[/<mask>]]…]
[-i <allow local host>[/<mask>][,<allow client host>[/<mask>]]…]
[-I <deny local host>[/<mask>][,<deny local host>[/<mask>]]…]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m]
假设我们要创建“tim”这样一个虚拟用户,则可以使用如下命令:
# pure-pw useradd tim -u ftpuser -d /home/ftp/tim
其中:
-u 将虚拟用户 tim 同系统用户 ftpuser 关联在一起。
-d 参数使 tim 只能访问其 home 目录。而如果想让他访问整个文件系统,可以用 -D 选项。
执行完上述命令后,会提示输入密码,两次输入 tim 用户的密码即可。用户的口令会根据系统对加密方式的支持情况,选择一个最安全的方式进行加密。
然后需要建立“/home/ftp/tim”目录,并修改它的属性。
# mkdir /home/ftp
# mkdir /home/ftp/tim
注意:在配置文件中有选项自动建立主目录。
CreateHomeDir yes //设置为 yes 创建新虚拟用户时 pureftpd 自动创建用户的主目录。
但是有一点需要大家注意,就是它只支持二层目录的建立而不支持三层以上目录的建立。举个例子,如果我们创建虚拟用户是用如下语句:
# pure-pw useradd test -u ftpuser -d /home/ftp
而这时系统只有“/home”目录而没有“/home/ftp”目录,那么在 test 用户第一次登陆时 pureftpd 会创“/home/ftp”目录。
如果我们改变以上命令如下:
# pure-pw useradd test -u ftp -d /home/ftp/test
而这时系统只有“/home”目录或“/home/ftp”目录,而没有“/home/ftp/test”目录,那么我们登陆时会得到没有主目录的提示。
其他参数含义:
-z 选项运用用户在一天当中指定的时间段连接服务器。如 -z 0900-1800 ,则该用户只能在上午 9 点到晚上 6 点之间连接服务器。
-r 选项或 -R 选项,可以限制用户从指定 IP 和掩码连入服务器。如,单一的 IP/掩码对(-r 192.168.1.0/24)。多个IP/掩码对用英文逗号隔开(-r 192.168.1.0/24,10.1.0.0/16,127.0.0.1/32)。仅 IP (-r 192.168.1.4,10.1.1.5)。主机名(-r bla.bla.net,yopcitron.com)。或者以上形式的任何组合。(-r,允许;-R拒绝)
-y ,用户同一时间的并发连接数。或者 0 意味着不限制。也就是同一 IP 的连接数。
-f ,默认虚拟用户的信息会被存放在“./etc/pureftpd.passwd”文件中,通过该选项可以改变该文件的位置。
默认的存储用户信息的文件存放在“./etc/pureftpd.passwd”,我用 ports 方式安装的 pureftpd ,其存放位置在“/usr/local/etc/pureftpd.passwd”。
我们看下这个文本文件的内容。
# cat /usr/local/etc/pureftpd.passwd
tim:$1$LX/3.F60$bYdYwsQOYIaWq.Ko.hfI3.:500:101::/home/ftp/tim/./:::::::::::::
密码是系统自己加密的。
(2)更改用户。
与 pure-pw adduser 不同的是,使用 pure-pw usermod 不是创建一个用户,而是更改已存在用户的某些属性。
例如,我们给 joe 用户添加一个限额,限制 joe 用户最多拥有1000个文件,最大10 Megabytes 空间。命令如下:
# pure-pw usermod joe -n 1000 -N 10
重置某些属性的语法如下:
pure-pw usermod -n ” :禁用文件配额
pure-pw usermod -N ” :禁用文件大小配额
pure-pw usermod -q ” -Q ” :禁用 ratio
pure-pw usermod -t ” :禁用下载带宽限制
pure-pw usermod -T ” :禁用上传带宽限制
pure-pw usermod <-i,-I,-r or -R> ” :禁用 IP 过滤
pure-pw usermod -z ” :禁用时间段约束
pure-pw usermod -y ” :禁用并发数限制
(3)删除用户。
删除一个用户的命令语法是:
# pure-pw userdel <login> [-f <passwd file>] [-m]
这时,用户的信息会被从指定的 passwd 文件中删除,但是用户的 home 目录会被保留,需要手工删除。
(4)修改口令。
更改一个用户口令的语法是:
# pure-pw passwd <login> [-f <passwd file>] [-m]
(5)显示用户信息。
“ ./etc/pureftpd.passwd” 文件中记录的信息不方便用户的阅读,因此 pure-ftpd 提供了显示用户信息的命令。其语法是:
# pure-pw show <login> [-f <passwd file>]
例如:
1
# pure-pw show joe
2
3
Login : joe
4
Password : $1$LX/3.F60$bYdYwsQOYIaWq.Ko.hfI3.
5
UID : 500 (ftpuser)
6
GID : 101 (ftpgroup)
7
Directory : /home/ftpusers/joe/./
8
Full name :
9
Download bandwidth : 0 Kb (unlimited)
10
Upload bandwidth : 0 Kb (unlimited)
11
Max files : 1000 (enabled)
12
Max size : 10 Mb (enabled)
13
Ratio : 0:0 (unlimited:unlimited)
14
Allowed local IPs :
15
Denied local IPs :
16
Allowed client IPs : 192.168.0.0/16
17
基本配置
安装完成後,接下来要对Squid的运行进行配置(不是前面安装时的配置)。所有项目都在squid.conf中完成。Squid自带的squid.conf包括非常详尽的说明,相当于一篇用户手册,对配置有任何疑问都可以参照解决。
在这个例子中,代理服务器同时也是网关,内部网络接口eth0的IP地址为192.168.0.1,外部网络接eth1的IP地址为202.103.x.x。下面是一个基本的代理所需要配置选项:
http_port 192.168.0.1:3128默认端口是3128,当然也可以是任何其它端口,只要不与其它服务发生冲突即可。为了安全起见,在前面加上IP地址,Squid就不会监听外部的网络接口。 下面的配置选项是服务器管理者的电子邮件,当错误发生时,该地址会显示在错误页面上,便于用户联系:
cache_mgr start@soocol.com以下这些参数告诉Squid缓存的文件系统、位置和缓存策略:
cache_dir ufs /var/squid
cache_mem 32MB
cache_swap_low 90
cache_swap_high 95
在这里,Squid会将/var/squid目录作为保存缓存数据的目录,每次处理的缓存大小是32兆字节,当缓存空间使用达到95%时,新的内容将 取代旧的而不直接添加到目录中,直到空间又下降到90%才停止这一活动。
如果不想Squid缓存任何文件,如某些存储空间有限的专有系统,可以使用 null文件系统(这样不需要那些缓存策略):
cache_dir null /tmp下面的几个关于缓存的策略配置中,较主要的是第一行,即用户的访问记录,可以通过分析它来了解所有用户访问的详尽地址:
cache_access_log /var/squid/access.log
cache_log /var/squid/cache.log
cache_store_log /var/squid/store.log
下面这行配置是在较新版本中出现的参数,告诉Squid在错误页面中显示的服务器名称:
visible_hostname No1.proxy以下配置告诉Squid如何处理用户,对每个请求的IP地址作为单独地址处理:
client_netmask 255.255.255.255如果是普通代理服务器,以上的配置已经足够。但是很多Squid都被用来做透明代理。
所谓透明代理,就是客户端不知道有代理服务器的存在,当然也不需要进行任何与代理有关的设置,从而大大方便了系统管理员。相关的选项有以下几个:
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_user_host_header on
在Linux上,可以用iptables/ipchains直接将对Web端口80的请求直接转发到Squid端口3128,由Squid接手,而用户浏览器仍然认为它访问的是对方的80端口。例如以下这条命令:
iptables -t nat -A PREROUTING -s 192.168.0.200/32 -p tcp –dport 80 -j REDIRECT 3128
就是将192.168.0.200的所有针对80端口的访问重定向到3128端口。
所有设置完成後,关键且重要的任务是访问控制。Squid支持的管理方式很多,使用起来也非常简单(这也是有人宁愿使用不做任何缓存的Squid,也 不愿意单独使用iptables的原因)。
Squid可以通过IP地址、主机名、MAC地址、用户/密码认证等识别用户,也可以通过域名、域後缀、文件类 型、IP地址、端口、URL匹配等控制用户的访问,还可以使用时间区间对用户进行管理,所以访问控制是Squid配置中的重点。
Squid用ACL (Access Control List,访问控制列表)对访问类型进行划分,用http_access deny 或allow进行控制。根据需求首先定义两组用户advance和normal,还有代表所有未指明的用户组all及不允许上网的baduser,配置代 码如下:
acl advance 192.168.0.2-192.168.0.10/32
acl normal src 192.168.0.11-192.168.0.200/32
acl baduser src 192.168.0.100/32
acl baddst dst www.soocol.com
acl all src 0.0.0.0/0
http_access deny baduser
http_access allow advance
http_access allow normal
可以看出,ACL的基本格式如下: acl 列表名称 控制方式 控制目标 比如acl all src 0.0.0.0/0,其名称是all,控制方式是src源IP地址,控制目标是0.0.0.0/0的IP地址,即所有未定义的用户。出于安全考虑,总是在最後禁止这个列表。 下面这个列表代表高级用户,包括IP地址从192.168.0.2到192.168.0.10的所有计算机:
acl advance 192.168.0.2-192.168.0.20/32下面这个baduser列表只包含一台计算机,其IP地址是192.168.0.100:
acl baduser 192.168.0.100/32
ACL写完後,接下来要对它们分别进行管理,代码如下:
http_access deny baduser
http_access allow advance
http_access allow normal
上面几行代码告诉Squid不允许baduser组访问Internet,但advance、normal组允许(此时还没有指定详细的权限)。由于 Squid是按照顺序读取规则,会首先禁止baduser,然後允许normal。如果将两条规则顺序颠倒,由于baduser在normal范围中, Squid先允许了所有的normal,那么再禁止baduser就不会起作用。
特别要注意的是,Squid将使用allow-deny-allow-deny……这样的顺序套用规则。例如,当一个用户访问代理服务器时, Squid会顺序测试Squid中定义的所有规则列表,当所有规则都不匹配时,Squid会使用与最後一条相反的规则。
就像上面这个例子,假设有一个用户 的IP地址是192.168.0.201,他试图通过这台代理服务器访问Internet,会发生什么情况呢?我们会发现,他能够正常访问,因为 Squid找遍所有访问列表也没有和192.168.0.201有关的定义,便开始应用规则,而最後一条是deny,那么Squid默认的下一条处理规则 是allow,所以192.168.0.201反而能够访问Internet了,这显然不是我们希望的。所以在所有squid.conf中,最後一条规则 永远是http_access deny all,而all就是前面定义的“src 0.0.0.0”。
[编辑] 高级控制
前面说过,Squid的控制功能非常强大,只要理解Squid的行为方式,基本上就能够满足所有的控制要求。下面就一步一步来了解Squid是如何进行控制管理的。
通过IP地址来识别用户很不可靠,比IP地址更好的是网卡的MAC物理地址。要在Squid中使用MAC地址识别,必须在编译时加上“–enable-arp-acl”选项,然後可以通过以下的语句来识别用户:
acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b …它直接使用用户的MAC地址,而MAC地址一般是不易修改的,即使有普通用户将自己的IP地址改为高级用户也无法通过,所以这种方式比IP地址可靠得多。
假如不想让用户访问某个网站应该怎么做呢?可以分为两种情况:一种是不允许访问某个站点的某个主机,比如ok的主机是ok.sina.com.cn,而其它的新浪资源却是允许访问的,那么ACL可以这样写:
acl sinapage dstdomain ok.sina.com.cn
… …
http_access deny ok
… … 由此可以看到,除了ok,其它如http://www.sina.com.cn、news.sina.c…??常访问。
另一种情况是整个网站都不许访问,那么只需要写出这个网站共有的域名即可,配置如下:
acl qq dstdomain .tcccent.com.cn注意tcccent前面的“.”,正是它指出以此域名结尾的所有主机都不可访问,否则就只有tcccent.com.cn这一台主机不能访问。
如果想禁止对某个IP地址的访问,如202.118.2.182,可以用dst来控制,代码如下:
acl badaddr dst 202.118.2.182当然,这个dst也可以是域名,由Squid查询DNS服务器将其转换为IP。
还有一种比较广泛的控制是文件类型。如果不希望普通用户通过代理服务器下载MP3、AVI等文件,完全可以对他们进行限制,代码如下:
acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$
http_access deny mmxfile
看到regex,很多读者应该心领神会,因为这条语句使用了标准的规则表达式(又叫正则表达式)。它将匹配所有以.mp3、.avi等结尾的URL请求,还可以用-i参数忽略大小写,例如以下代码:
acl mmxfile urlpath_regex -i \.mp3$这样,无论是.mp3还是.MP3都会被拒绝。当然,-i参数适用于任何可能需要区分大小写的地方,如前面的域名控制。
如果想让普通用户只在上班时间可以上网,而且是每周的工作日,用Squid应当如何处理呢?看看下面的ACL定义:
acl worktime time MTWHF 8:30-12:00 14:00-18:00
http_access deny !worktime
首先定义允许上网的时间是每周工作日(星期一至星期五)的上午和下午的固定时段,然後用http_access 定义所有不在这个时间段内的请求都是不允许的。
或者为了保证高级用户的带宽,希望每个用户的并发连接不能太多,以免影响他人,也可以通过Squid控制,代码如下:
acl conncount maxconn 3
http_access deny conncount normal
http_access allow normal这样,普通用户在某个固定时刻只能同时发起三个连接,从第四个开始,连接将被拒绝。
总之,Squid的ACL配置非常灵活、强大,更多的控制方式可以参考squid.conf.default。
[编辑] 认证
用户/密码认证为Squid管理提供了更多便利,最常用的认证方式是NCSA。从Squid 2.5版本开始,NCSA认证包含在了basic中,而非以前单独的认证模块。下面来看看实现认证的具体操作。
首先在编译时配置选项应包括以下配置:
–enable-auth=”basic” –enable-basic-auth-helpers=”NCSA”
“make install”以後,需要将“helpers/basic_auth/NCSA/ncsa_auth”拷贝到用户可执行目录中,如/usr/bin(如 果在该目录中找不到这个执行文件,在编译时请使用make all而不是make,或者直接在该目录中执行make),然後需要借助Apache的密码管理程序htpasswd来生成用户名/密码对应的文件,就像 下面这行代码:
htpasswd -c /var/squid/etc/password guest在输入两遍guest用户的密码後,一个guest用户就生成了。如果以後需要添加用户,把上面的命令去掉-c参数再运行即可。
Squid 2.5在认证处理上有了较大的改变,这里就只讨论2.5版本的处理方法,2.4及以下版本请参考squid.conf.default。在2.5版的squid.conf中,包括以下几个相关选项:
该选项指出了认证方式(basic)、需要的程序(ncsa_auth)和对应的密码文件(password)
auth_param basic program /usr/bin/ncsa_auth /var/squid/etc/password
指定认证程序的进程数
auth_param basic children 5
浏览器显示输入用户/密码对话框时的领域内容
auth_param basic realm My Proxy Caching Domain
基本的认证有效时间
auth_param basic credentialsttl 2 hours
普通用户需要通过认证才能访问Internet
acl normal proxy_auth REQUIRED
http_access allow normal通过以上的配置即可完成认证工作。有的读者可能要问:认证只针对普通用户,而高级用户是直接上网的,该怎么处理呢?其实,这两种用户是可以共存的。
如 前所述,Squid是顺序处理http_access的,所以在http_access处理过程中,如果先处理normal用户,那么当前用户无论是否属 于高级用户,都会被要求进行认证;相反如果先处理高级用户,剩下的就只有需要认证的普通用户了。例如以下配置代码:
…
http_access allow normal (需要认证)
http_access allow advance (不需要认证)
… 不管是否为noauth用户,都要求进行用户名/密码验证。正确的方法是将二者位置交换,代码如下:
…
http_access allow advance
http_access allow normal
… 这时,高级用户不会受到任何影响。
总结
下面把整个squid.conf总结一下:
[编辑] 服务器配置
http_port 192.168.0.1:3128
cache_mgr start@soocol.com
cache_dir null /tmp
cache_access_log /var/squid/access.log
cache_log /var/squid/cache.log
cache_store_log /var/squid/store.log
visible_hostname No1.proxy
client_mask 255.255.255.255
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_user_host_header on用户分类
acl advance arp 00:01:02:1f:2c:3e 00:01:02:3c:1a:8b …
acl normal proxy_auth REQUIED
acl all src 0.0.0.0 行为分类
acl mmxfile urlpath_regex \.mp3$ \.avi$ \.exe$
acl conncount maxconn 3
acl worktime time MTWHF 8:30-12:00 14:00-18:00
acl sinapage dstdomain ok.sina.com.cn
acl qq dstdomain .tcccent.com.cn 处理
http_access allow advance
http_access deny conncount normal
http_access deny !worktime
http_access deny mmxfile
http_access deny sinapage
http_access deny qq
http_access allow normal配置後的状况是,advance组可以不受任何限制地访问Internet,而normal组则只能在工作时间上网,而且不能下载多媒体文件,不能访问某些特定的站点,而且发送请求不能超过3个。
通过本文的介绍,它可以了解Squid的基本能力。当然,它的能力远不止此,可以建立强大的代理服务器阵列,可以帮助本地的Web服务器提高性能,可以提高本地网络的安全性等。要想发挥它的功效,还需要进一步控制。
推荐参考资料:《Squid中文权威指南》
附:访问控制列表
# ACCESS CONTROLS
# —————————————————————————–
# TAG: acl
# Defining an Access List //定义访问控制列表
#
# acl aclname acltype string1 … //访问控制列表的格式
# acl aclname acltype “file” …
#
# when using “file”, the file should contain one item per line
#
# acltype is one of the types described below
#
# By default, regular expressions are CASE-SENSITIVE. To make
# them case-insensitive, use the -i option.
#
*** IP地址访问控制列表***
# acl aclname src ip-address/netmask … (clients IP address) //以源客户端IP地址为列表
# acl aclname src addr1-addr2/netmask … (range of addresses) //以源IP地址范围为列表
# acl aclname dst ip-address/netmask … (URL host’s IP address) //以目的主机IP地址为列表
# acl aclname myip ip-address/netmask … (local socket IP address) //squid主机的IP地址为myip列表
#
# acl aclname arp mac-address … (xx:xx:xx:xx:xx:xx notation)
# # The arp ACL requires the special configure option –enable-arp-acl.
# # Furthermore, the arp ACL code is not portable to all operating systems.
# # It works on Linux, Solaris, FreeBSD and some other *BSD variants.
# #
# # NOTE: Squid can only determine the MAC address for clients that are on
# # the same subnet. If the client is on a different subnet, then Squid cannot
# # find out its MAC address.
#
***域名访问控制列表***
# acl aclname srcdomain .foo.com … # reverse lookup, client IP //以域名为源列表
# acl aclname dstdomain .foo.com … # Destination server from URL //以域名为目的列表
# acl aclname srcdom_regex [-i] xxx … # regex matching client name //
# acl aclname dstdom_regex [-i] xxx … # regex matching server
# # For dstdomain and dstdom_regex a reverse lookup is tried if a IP
# # based URL is used and no match is found. The name “none” is used
# # if the reverse lookup fails.
#
***时间访问控制列表***
# acl aclname time [day-abbrevs] [h1:m1-h2:m2]
# day-abbrevs:
# S - Sunday
# M - Monday
# T - Tuesday
# W - Wednesday
# H - Thursday
# F - Friday
# A - Saturday
# h1:m1 must be less than h2:m2
***其它访问控制列表***
# acl aclname url_regex [-i] ^http:// … # regex matching on whole URL //匹配以http://开始的列表
# acl aclname urlpath_regex [-i] \.gif$ … # regex matching on URL path //匹配以.gif为结尾的列表
# acl aclname urllogin [-i] [^a-zA-Z0-9] … # regex matching on URL login field //
# acl aclname port 80 70 21 … //端口列表
# acl aclname port 0-1024 … # ranges allowed //端口范围列表
# acl aclname myport 3128 … # (local socket TCP port) //squid本地端口
# acl aclname proto HTTP FTP … //协议列表
# acl aclname method GET POST … //访问方式列表
# acl aclname browser [-i] regexp …
安装mysql之前我们首先创建一个组,称为mysql,然后创建一个名为mysql的用户。
然后解压mysql-standard-4.0.16-pc-linux-i686.tar.gz,用命令tar –zxvf mysql-standard-4.0.16-pc-linux-i686.tar.gz, 解压后在当前目录生成一个mysql-standard-4.0.16-pc-linux-i686的文件夹,进入该目录,看看里面有哪些文件和目录,然后用./configure对mysql的安装目录进行配置,如下图所示的./configure –prefix=/usr/local/mysql/是将mysql安装在/usr/local目录下的mysql目录中。
对于一般的文件,剩下就只需make & make install了。
但是这个版本的mysql,只需将mysql-standard-4.0.16-pc-linux-i686目录复制到/usr/local下,然后重命名为mysql即可。
然后安装数据库,用#scripts/mysql_install_db,如下图五所示,mysql_install_db是一个脚本文件,将创建mysql和test两个数据库。mysql数据库是系统库,包含一些重要信息,如用户信息等,在不完全清楚的情况下,建议不要直接操作次数据库。test数据库是一个测试用的数据库。
接下来是设置目录权限了,用如下的命令
#chown -R root:mysql /usr/local/mysql
#chown -R mysql:mysql /usr/local/mysql/data
分别设置目录usr/local/mysql的所属用户是root,所属组是mysql,设置/usr/local/mysql/data的所属用户是mysql,所属组是mysql.
测试数据库,进入mysql目录下的bin目录,用如下的命令
./bin/safe_mysqld –user=mysql & 来启动mysql,
然后用./mysql –u root –p 来进入mysql,注意mysql安装后的初始密码为空。
测试如通过,将mysql设置为系统启动时启动,可以用vi编辑/etc/rc.d/rc.local也可以用下面的命令直接将mysql的启动项加入到自启动。
echo “/usr/local/mysql/bin/safe_mysqld –user=mysql &” >>/etc/rc.d/rc.local
Mysql已经安装完毕,再来安装php和apache。
在安装Apache
用tar –zxvf apache_1.3.27.tar.gz来解压apache,解压后会在当前目录下生成一个apache_1.3.27的目录,进入该目录,我们先在/usr/local下创建一个servers的目录,用mkdir /usr/local/servers,然后我们用./configure –prefix=/usr/local/servers/apache对apache的安装目录进行设置
然后用tar –zxvf php-4.2.3.tar.gz解压php,解压后生成php-4.2.3的目录,进入到该目录,./configure –with-apache=/home/apache_1.3.27 –with-mysql=/usr/local/mysql –enable-track-vars ,这个设置很重要,
它配置了php与apache以及mysql的关联,相当与将apache和mysql联系在一起。
接下来,make & make install,至此已成功安装php。
我们来回到tar –zxvf apache_1.3.27.tar.gz后生成的目录apache_1.3.27下,然后,再用./configure –prefix=/usr/local/servers/apache \\–activate-module=src/modules/php4/libphp4.a 来对apache进行重新设置,主要是加入识别php代码的模块。
接着make & make install,编译apache
我们回到解压php后生成的php-4.2.3目录下,将php.ini-dist复制到/usr/local/lib/php目录下。
然后我们要修改Apache的配置文件httpd.conf
查看httpd.conf文件中是否有如下行:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
第一条指令指定PHP文件的扩展名为php;第二条指令的意思是,当用浏览器查看一个扩展名为phps的PHP文件时,可以看到加了颜色的源码。
如没有看到,我们在httpd.conf里添加上面的两行。
现在apache已经配置完毕,我们可以启动apache了。
#cd /usr/local/servers/apache/bin
#apachectl start
和mysql一样,我们设置为系统启动时运行apache,用下面的命令echo “/usr/local/servers/apache/bin/apachetl start”>> /etc/rd.d/rc.local
接下来的工作就是把我们已经写好的网页文件放到目录/usr/local/servers/apache/htdocs/ 下,
数据库文件放到/usr/local/mysql/data/ 下即可,然后重新启动系统就可以浏览我们的网页了。