Squid Proxy基于MySQL用户和密码的验证
概述: 本文档为Squid Proxy实现基于MySQL用户和密码认证而编写. 参考: 作者Email: jimcheng@gmail.com 本文档在GPL v2下发布。 I. 本文档在Federa core 3下测试通过,其他Unix/Linux平台可类同参照。 需要的主要软件包有: Squid 2.5以上 确定squid已经安
概述:
本文档为Squid Proxy实现基于MySQL用户和密码认证而编写.
参考:
作者Email: jimcheng@gmail.com
本文档在GPL v2下发布。
I.
本文档在Federa core 3下测试通过,其他Unix/Linux平台可类同参照。
需要的主要软件包有:
Squid 2.5以上
确定squid已经安装
代码:
# rpm -q squid
squid-2.5.STABLExxxx-xxxxIII.
(我的系统上是squid-2.5.STABLE6-3)//by jerry
MySQL 3.0 or 4.x
(我的系统上是mysql-3.23.58-13)//by jerry
确定mysql已经安装
代码:
# rpm -q mysql
MySQL_auth
其中MySQL_Auth用来完成用户名及密码的验证.
II.
获取MySQL_Auth
MySQL_auth Homepage: http://people.arxnet.hu/airween/mysql.auth/
http://www.sourcefiles.org/Databases/Utilities/
进入该页面后下载mysql_auth-0.8.tar.gz
III.
编译,调试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 - # make install
在这步通常会出现两个错误,第一个错误为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
代码:
# make install
如没有报错信息出现,则mysql_auth安装完成。
这步骤用,我没有执行su -c "groupadd nogroup",而是将Makefile中的(INSTALL)部分中的nobody和nogroup都改成了squid。也就是所有者和使用者都是squid。//by jerry
注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
这步骤中的身份涉及到文件的使用和拥有权限。如果在开始的时候在mysql_auth的Makefile中的(INSTALL)部分中的nobody和nogroup都改成了squid,则上面的注1即不用注意了。//by jerry。
b. 配置MySQL和MySQL_Auth之间的连接是否正常
首先确认MySQL 3.0或以上的版本已经正确安装.
代码:
# rpm -q mysql
检查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目录
/*****************by jerry
首先,这个时候需要打开mysql
否则会出现can't connect to local MYSQL server through socket '/var/lib/mysql/mysql.sock' (2)的错误提示。
启动mysql的命令是:/etc/rc.d/init.d/mysqld start (省略前面的目录不好使)
如果是安装后第一次启动
会出现:初始化 MySQL 数据库:[确定]
启动 MySQL: [确定]
的信息。
如果不是第一次运行了则只有:
启动 MySQL: [确定]
启动以后
进入mysql默认的情况是,用户是root,密码为空(即没有密码),所以
#mysql 直接回车就进入了
也可用#mysql -uroot -p 回车
提示:Enter password:直接回车
当然若修改过密码,或者当前用户不是root。则用户名和密码都不能省略了。
并且mysql在任何目录下都可以直接用。
*****************///by jerry
代码:
# cd scripts
# mysql -u root -p Enter password: 系统提示输入mysql root的password
如无出错信息,则表示该步骤完成, mysql中现在已有一名为mysql_auth的新增数据库, 该数据库中仅包含一张表data, 访问该表可通过mysql用户squid,密码squid来访问
5. MySQL_auth中还附带有一个用户管理工具mypasswd, 存放的路径通常为/usr/local/bin/mypasswd
/*****************by jerry
(使用mypasswd需要先启动mysql)
1.添加一个测试用户 (squid停止的情况下也好使)
# mypasswd jerry 54321 Password record ADDED successfully.
(如果改用户名存在则显示是:Password record UPDATED succesfully)
2.验证刚才建立的用户, 测试MYSQL_AUTH(需要先启动mysql)
# /usr/local/squid/libexec/mysql_auth
Jerry 654321
0K (若无改用户或密码错误,则显示ERR)
3.我们也可以从mysql数据库中找到:
#mysql -usquid -psquid
#use mysql_auth
#select * from data
我们将看到用上面mypasswd建立的用户和密码。
#quit(或者exit是推出)
4.删除这测试用户
# /usr/local/bin/mypasswd -d Jerry 654321
Password record DELETED succesfully. *****************///by jerry
V. 配置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
(已经有了的,不用再添加//by jerry)
以上内容指定了squid可以通过一个外部程序来进行用户验证.
4. 找到acl配置的段落,添加以下内容:
代码:
acl YMCT proxy_auth REQUIRED
http_access allow YMCT ipuseracl
以上内容规定了squid只允许通过YMCT(mysql用户/密码)验证通过的用户才可以使用squid的服务
VI: SELinux的问题.
Federo core 3的SeLinux缺省情况为打开状态,selinux会干扰mysql_auth的启动,需将selinuxdisable后,再启动squid, disable selinux的办法为
代码:
# cd /etc/selinux/
# vi config
将selinux=enforcing改为disabled
注:selinux理论上应该可以通过policy设定allow mysql_auth的运行, 具体需参照selinux的文档。
这步骤完事一定要重启(注销不好使),因为现在selinux是开启状态。
VII: 测试
启动mysql:
/etc/rc.d/init.d/mysqld start
启动squid:
/etc/init.d/squid start (不能省略目录)//by jerry
正常运行的squid应该可以从内存中看到如下的情况:
代码:
# pstree
squid---squid---5*[ip_user_check]
|-5*[mysql_auth]
|-unlinkd
设定相应客户端上的浏览器的proxy设置, 进行测试.
*********************************************************************************************************************************************************************************
一些偶遇:
1.auth_param basic realm Squid proxy-caching web server //就是设置当客户端连接的时候如果需要密码验证弹出一个对话框上面显示的一部分。
2.
把
acl YMCT proxy_auth REQUIRED
http_access allow YMCT ipuseracl
换成
acl our_networks src 202.118.26.186
http_access allow our_networks
则202.118.26.186可以通过改代理上网。
3.
cache.log中看到
2006/04/15 16:52:51| WARNING: basicauthenticator #1 (FD 6) exited
2006/04/15 16:52:51| WARNING: basicauthenticator #2 (FD 7) exited
2006/04/15 16:52:51| WARNING: basicauthenticator #3 (FD 8) exited
2006/04/15 16:52:51| Too few basicauthenticator processes are running
主要是权限问题,可以用:
chown squid.squid /usr/local/squid/etc/mysql_auth.conf
解决掉!
4.
分析squid的具体运行情况可以通过查看log:
/var/log/message
/var/log/squid 这下面主要看cache.log
5.
匹配ACL,squid找到第一个匹配时,它就停止搜索了。
http_access使用“与”逻辑。
不要在http_access deny allow后加任何语句。
5.
acl访问控制元素格式:
acl name type value1 value2
上一篇: sql case 函数与详细说明