|
概述:
本文档为Squid Proxy实现基于MySQL的用户认证及IP绑定的认证而编写.
作者Email: jimcheng@gmail.com
本文档在GPL v2下发布。
I. 本文档在Red Hat Enterprise Linux AS 4下测试通过,其他Unix/Linux平台可类同参照。
需要的主要软件包有:
Squid 2.5以上
MySQL 3.0 or 4.x
MySQL_auth
ip_user (注:ip_user通常在一些Linux所带的Squid中已经附带,可以不用另外安装)
其中MySQL_Auth用来完成用户名及密码的验证,ip_user用来进行用户名和IP的绑定验证
II. 确定squid已经安装
- # rpm -q squid
- squid-2.5.STABLExxxx-xxxx
复制代码
III. 获取MySQL_Auth
MySQL_auth Homepage: http://people.arxnet.hu/airween/mysql.auth/
进入该页面后下载mysql_auth-0.8.tar.gz
IV. 获取ip_user (如squid已经内置,则不用另行安装)
ip_user Hompage: geekbunker.org/rodrigo/ip_user.html
进入该页面后下载ip_user 1.0
V. 编译,调试MySQL_Auth, 及MySQL
a. 编译MySQL_Auth
- $ tar -xzvf mysql_auth-0.8.tar.gz
- $ cd mysql_auth-0.8
- $ make
复制代码
通常这步会有错误,出错信息如下:
- /usr/bin/ld: cannot find -lmysqlclient
- collect2: ld returned 1 exit status
- make: *** [mysql_auth] Error 1
复制代码
出现该错误的原因是Makefile里没有考虑到libmysqlclient真正所处的路径通常会是/usr/lib/mysql, 而不是/usr/local/lib, 所以打开Makefile, 修改里面的CFLAGS参数,加上/usr/lib/mysql路径即可:
修改后的CFLAGS为:
- CFLAGS = -I/usr/local/include -L/usr/local/lib -L /usr/lib/mysql
复制代码
保存修改好的Makefile, 退出vi (or emacs or nano or joe or whatever)
再次运行 make 进行编译
- $ make
- 编译成功.
- $ su - <- 切换到root
- # make install <- 运行make install把mysql_auth安装到相应的目录
复制代码 在这步通常会出现两个错误,第一个错误为make报告nogroup这个group不存在, 可通过groupadd nogroup来解决
- $ su -c "groupadd nogroup"
复制代码 然后如果再次运行make install, 会遭遇到第二个错误
- /usr/bin/install: cannot create regular file '/usr/local/squid/libexec/mysql_auth': No such file or directory
复制代码 ,
出错的原因是原作者没有考虑到/usr/local/squid/这个目录及以下的子目录可能并不事先存在, 需要再次修改Makefile来fix这个问题.
修改Makefile内结尾附近的Install: 这部分, 给所有的$(INSTALL) -o nobody -o nogroup ...行加上-D的参数,来强制install在cp文件前先建立目录.
修改后的Make内的install内容格式类似如下:
- $(INSTALL) -D -o nobody -o nogroup -m 600 .....
复制代码
确认以上步骤都完成后,再次运行make install
如没有报错信息出现,则mysql_auth安装完成。
注1:如果squid在系统中不是以nobody的身份来运行,需将/usr/local/squid/etc/mysql_auth.conf文件的ownership改为对应的user/group, 在Red Hat Enterprise 4中,squid是以其自己的身份squid.squid来运行的,则需将该conf文件改为:
- chown squid.squid /usr/local/squid/etc/mysql_auth.conf
复制代码
b. 配置MySQL和MySQL_Auth之间的连接是否正常
首先确认MySQL 3.0或以上的版本已经正确安装
检查mysql_auth中关于MySQL部分的配置是否正确, 这部分的配置信息在/usr/local/squid/etc/mysql_auth.conf中描述. 配置文件的具体内容可参照文档,
通常在这个配置文件中有几点需要注意:
1. hostname是否正确,如果是缺省情况下连接位于本地的MySQL server, 则原先的参数localhost可不作改动
2. 默认mysql_auth会用username: squid, password: squid来连接MySQL, 并会在mysql_auth这个database内的data表中建立squid验证所需的proxy username和password. (mysql_auth提供了一个初始化script来完成mysql建数据库和表等一系列操作, 稍后会提到)
3. mysql_auth.conf中最需要注意的是mysqld_socket这个参数, 这个参数缺省情况下指向的位置为
/tmp/mysqld.sock
现在一般主流的Linux一般已将mysql unix socket移至/var/lib/mysql/mysql.sock, 所以修改该行为:
mysqld_socket /var/lib/mysql/mysql.sock
如遇其他情况,可参照mysql的配置文件my.cnf来确定sock的具体存放位置.
4. 完成上列步骤后,可运行mysql_auth提供的script来完成步骤2中所提及的初始化工作,
该脚本所在位置为mysql_auth-0.8.tar.gz解开后的目录下的scripts目录
- # cd scripts
- # mysql -u root -p < create_script
- Enter password: 系统提示输入mysql root的password
复制代码
如无出错信息,则表示该步骤完成, mysql中现在已有一名为mysql_auth的新增数据库, 该数据库中仅包含一张表data, 访问该表可通过mysql用户squid,密码squid来访问
5. MySQL_auth中还附带有一个用户管理工具mypasswd, 存放的路径通常为/usr/local/bin/mypasswd
- # mypasswd jim 123456 <- 增加一个名为jim的用户,密码为123456
- Password record ADDED successfully.
- # mypasswd -d jim <- 删除一个名为jim的用户
复制代码
如mypasswd运行中出现错误,请检查步骤3中所提及的mysql_auth.conf的配置是否正确
VI. 配置squid
1. squid的配置文件通常所处的位置为: /etc/squid/squid.conf
2. squid的一些通常设定请参见squid的配置文挡,本文档不再做详细描述.
3. 找到squid.conf中auth_param这个段落, 添加以下内容:
- auth_param basic children 5
- auth_param basic realm Squid proxy-caching web server
- auth_param basic credentialsttl 2 hours
- auth_param basic casesensitive off
- auth_param basic program /usr/local/squid/libexec/mysql_auth
复制代码
以上内容指定了squid可以通过一个外部程序来进行用户验证.
4. 找到acl配置的段落,添加以下内容:
- external_acl_type ip_user_check children=5 %SRC %LOGIN /usr/lib/squid/ip_user_check -f \ /etc/squid/ip_user.conf
- acl ipuseracl external ip_user_check
- acl YMCT proxy_auth REQUIRED
- http_access allow YMCT ipuseracl
复制代码
以上内容规定了squid只允许通过YMCT(mysql用户/密码验证通过)和ipuseracl(用户名和IP验证通过)的用户才可以使用squid的服务
5. /etc/squid/ip_user.conf内保存的是需要通过squid的用户和他们来源IP的对应关系, 文件格式为:
6. 启动squid, 正常运行的squid应该可以从内存中看到如下的情况:
- # pstree
- squid---squid---5*[ip_user_check]
- |-5*[mysql_auth]
- |-unlinkd
复制代码
VII: SELinux的问题.
Red Hat Enterprise Linux 4的SeLinux缺省情况为打开状态,selinux似乎会干扰mysql_auth的启动,需将selinuxdisable后,再启动squid, disable selinux的办法为
- # cd /etc/selinux/
- # vi config
- 将selinux=enforcing改为disabled
复制代码
注:selinux理论上应该可以通过policy设定allow mysql_auth的运行, 具体需参照selinux的文档。
VII: 测试
启动squid, 设定相应客户端上的浏览器的proxy设置, 进行测试. |
|