LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1478|回复: 1

[原创]Squid Proxy基于MySQL的用户及User+IP绑定的验证

[复制链接]
发表于 2007-11-6 15:25:13 | 显示全部楼层 |阅读模式
概述:

本文档为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已经安装
  1. # rpm -q squid
  2. 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
  1.    $ tar -xzvf mysql_auth-0.8.tar.gz
  2.    $ cd mysql_auth-0.8
  3.    $ make
复制代码

   通常这步会有错误,出错信息如下:
  1.    /usr/bin/ld: cannot find -lmysqlclient
  2.    collect2: ld returned 1 exit status
  3.    make: *** [mysql_auth] Error 1
复制代码

   出现该错误的原因是Makefile里没有考虑到libmysqlclient真正所处的路径通常会是/usr/lib/mysql, 而不是/usr/local/lib, 所以打开Makefile, 修改里面的CFLAGS参数,加上/usr/lib/mysql路径即可:
   修改后的CFLAGS为:
  1. CFLAGS = -I/usr/local/include -L/usr/local/lib -L /usr/lib/mysql
复制代码

   保存修改好的Makefile, 退出vi (or emacs or nano or joe or whatever)
   再次运行 make 进行编译
  1.    $ make
  2.    编译成功.
  3.    $ su -               <- 切换到root
  4.    # make install       <- 运行make install把mysql_auth安装到相应的目录
复制代码
  在这步通常会出现两个错误,第一个错误为make报告nogroup这个group不存在, 可通过groupadd nogroup来解决
  1. $ su -c "groupadd nogroup"
复制代码
  然后如果再次运行make install, 会遭遇到第二个错误
  
  1. /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内容格式类似如下:
  1.    $(INSTALL) -D -o nobody -o nogroup -m 600 .....
复制代码


   确认以上步骤都完成后,再次运行make install
  1.    # 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文件改为:
  1. chown squid.squid /usr/local/squid/etc/mysql_auth.conf
复制代码


   b. 配置MySQL和MySQL_Auth之间的连接是否正常
   首先确认MySQL 3.0或以上的版本已经正确安装
  1.    # 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目录
  1.       # cd scripts
  2.       # mysql -u root -p < create_script
  3.       Enter password:                      系统提示输入mysql root的password
复制代码

      如无出错信息,则表示该步骤完成, mysql中现在已有一名为mysql_auth的新增数据库, 该数据库中仅包含一张表data, 访问该表可通过mysql用户squid,密码squid来访问
      
   5. MySQL_auth中还附带有一个用户管理工具mypasswd, 存放的路径通常为/usr/local/bin/mypasswd
  1.       # mypasswd jim 123456    <- 增加一个名为jim的用户,密码为123456
  2.       Password record ADDED successfully.

  3.       # 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这个段落, 添加以下内容:
  1.         auth_param basic children 5
  2.         auth_param basic realm Squid proxy-caching web server
  3.         auth_param basic credentialsttl 2 hours
  4.         auth_param basic casesensitive off
  5.         auth_param basic program /usr/local/squid/libexec/mysql_auth
复制代码


        以上内容指定了squid可以通过一个外部程序来进行用户验证.

    4. 找到acl配置的段落,添加以下内容:
  1.         external_acl_type ip_user_check children=5 %SRC %LOGIN /usr/lib/squid/ip_user_check -f \ /etc/squid/ip_user.conf
  2.         acl ipuseracl external ip_user_check
  3.         acl YMCT proxy_auth REQUIRED
  4.         http_access allow YMCT ipuseracl
复制代码


        以上内容规定了squid只允许通过YMCT(mysql用户/密码验证通过)和ipuseracl(用户名和IP验证通过)的用户才可以使用squid的服务
     

    5. /etc/squid/ip_user.conf内保存的是需要通过squid的用户和他们来源IP的对应关系, 文件格式为:
  1.         192.168.1.123                test
复制代码

    6. 启动squid, 正常运行的squid应该可以从内存中看到如下的情况:
  1.        # pstree

  2.        squid---squid---5*[ip_user_check]
  3.                      |-5*[mysql_auth]
  4.                      |-unlinkd
复制代码

VII: SELinux的问题.
    Red Hat Enterprise Linux 4的SeLinux缺省情况为打开状态,selinux似乎会干扰mysql_auth的启动,需将selinuxdisable后,再启动squid, disable selinux的办法为
  1.     # cd /etc/selinux/
  2.     # vi config
  3.     将selinux=enforcing改为disabled
复制代码
   
    注:selinux理论上应该可以通过policy设定allow mysql_auth的运行, 具体需参照selinux的文档。

VII: 测试
    启动squid, 设定相应客户端上的浏览器的proxy设置, 进行测试.
发表于 2007-11-8 14:33:41 | 显示全部楼层
好东西就是要顶。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表