免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7445 | 回复: 13
打印 上一主题 下一主题

[proxy] [原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-09-17 10:49 |只看该作者 |倒序浏览
[推荐测试]
---------------------------------------------------------------------------------------
几个月前自己随便搞了一个Squid+mysql的代理认证,apache+php+mysql的代理帐号管理系统,经验拿来和大家一起分享.呵呵.

  Squid的Mysql的认证并不是很流行,原因并不是他的性能方面的原因,而是简单的代理认证只需要Ncsa之类简单的密码文件操作,而复杂的多功能的有LDAP数据库,但是我选择了Mysql, 因为我看中了它的网络操作的方便性。Apache+php+mysql正是最流行的经典组合.

  我们的代理认证系统最终选择了Squid+Mysql+Php+Apache其中
Squid+mysql组成了认证的效验和认证以后的代理服务。
Mysql+Php+Apache组成了前台的代理用户管理系统。这样就能通过web操作来完成用户的管理的操作。

1 Squid端认证代码的编写
用c语言编写一段Squid能够加载的认证程序,通过这个认证程序来访问Mysql数据库,完成认证的过程。

/*
*  mysql_auth.c
*
*  Copyright 1998 Frank Liu (frank@ctcqnx4.ctc.cummins.com)
*  Distributed under the GPL
*
*  26 Sep 1999, version 2:
*    1. fixed a bug where A_TABLE is defined but never used.
*       (thanks to luciano.ghezzi@linux.it)
*    2. now you can choose to use either clear text password or
*       encrypted password in the MySQL table.
*  13 Nov 1998, version 1:
*    initial release                                                            
*  Needs to be compiled/linked with MySQL libs.                                 
*  Assuming MySQL header files are installed in /usr/local/mysql/include        
*  and MySQL libs in /usr/local/mysql/lib                                       
*                                                                              
*                                                                              
* gcc -O2 -Wall -o mysql_auth mysql_auth.c -L /usr/lib/mysql -lmysqlclient      
*
*  Dec, 2002.
*  Modfied by Jiang.
*  Add support for crypt password.
*/

#include <stdio.h>;
#include <stdlib.h>;
#include <string.h>;
#include "mysql.h"

/* comment out next line if you use clear text password in MySQL DB */
/*#define ENCRYPTED_PASS*/

/* can use NULL for localhost, current user, or no password */
#define DBHOST "localhost"
#define DBUSER "root"
#define DB "www"
#define DBPASSWORD "*******"

/* table for the user database for the squid authentication,
   column names for auth username and auth password */
#define A_TABLE  "user1"
#define A_USERNAME "username"
#define A_PASSWORD "passwd"

#define BUFSIZE         256

void main(int argc, char *argv[])
{
    char buf[BUFSIZE], qbuf[BUFSIZE];
    char *p;
    MYSQL mysql,*sock;
    MYSQL_RES *res;

    /* make standard output line buffered */
    if (setvbuf(stdout, NULL, _IOLBF, 0) != 0)
        return;

    while (1) {
        if (fgets(buf, BUFSIZE, stdin) == NULL)
            break;
        if ((p = strchr(buf, '\n')) != NULL)
            *p = '\0';          /* strip \n */
        if ((p = strchr(buf, ' ')) == NULL) {
            (void) printf("ERR\n";
            continue;
        }
        *p++ = '\0';

        /* buf is username and p is password now */

        if (!(sock = mysql_connect(&mysql, DBHOST, DBUSER, DBPASSWORD)))
        {
            /* couldn't connect to database server */
            (void) printf("ERR\n";
            continue;
        }
        if (mysql_select_db(sock, DB))
        {
            /* couldn't use the database */
            (void) printf("ERR\n";
            mysql_close(sock);
            continue;
        }
        sprintf(qbuf, "select " A_USERNAME " from " A_TABLE " where "
                       A_USERNAME "='%s' and " A_PASSWORD

#ifdef ENCRYPTED_PASS
                      "=password('%s')", buf, p);
#else
                      "='%s'", buf, p);
#endif
        if(mysql_query(sock,qbuf) || !(res=mysql_store_result(sock)))
        {
            /* query failed */
            (void) printf("ERR\n";
            mysql_close(sock);
            continue;
        }
        if ( res->;row_count !=0 )
            (void) printf("OK\n";
        else
            (void) printf("ERR\n";
        mysql_free_result(res);
        mysql_close(sock);
    }
    exit(0);
}


代码核心部分就是对Mysql中一张表的访问从而确定客户提供的用户名和密码是否存在于表中。
用gcc编译连接
gcc -I /usr/local/mysql/include -O -o mysql_auth mysql_auth.c \
       -L /usr/local/mysql/lib -lmysqlclient -lm

这样就生成了mysql_auth这个认证程序。代码中的注释很关键,可能对你很有帮助.

2 Squid配置的修改
        auth_param basic program /var/squid/bin/mysql_auth //认证程序的地址
        auth_param basic children 5 //初始启动认证个数
        auth_param basic realm FreeTown Proxy Caching Domain
        auth_param basic credentialsttl 1 hours

        acl authed proxy_auth REQUIRED //代理需要认证
        authenticate_ip_ttl 2 hours
        acl ip_unico max_user_ip –s//每个账号只能使用一个ip

这些配置都是摸索出来了的,用着还可以


3 Apache+php前端的代理帐号管理程序的编写
  其实这个过程就是写一个php的网页来使用户和管理员来完成对mysql中存储的那张表的读写过程.
   比如帐号的创建,密码修改,帐号删除等等操作都可以通过这个网页实现.
我是php新新手,代码写的很垃圾.大家想一想知道知道里面的操作怎么实现了.


这里要注意一点是,如果在上面那个msql认证的c代码中
/* comment out next line if you use clear text password in MySQL DB */
/*#define ENCRYPTED_PASS*/

如果你注释掉了#define ENCRYPTED_PASS
那么密码存放的时候就应该使用明文的.

总结

这样便能简单方便的实现web操作来做到管理squid的代理认证工作。

工作也能做到稳定高效。我们做好整个系统后在学校里发布测试,最终用户数量为3000多。每天的代理服务器的连接数300多万。一天的数据流量是40G.。

发布后基本上这个认证系统没出过问题,事实证明这个系统是稳定高效的,并且和其它流行的认证管理方法相比有自己的特色。

欢迎大家和我交流,提出意见,

论坛徽章:
0
2 [报告]
发表于 2004-09-17 11:33 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

不错,顶一下!

论坛徽章:
0
3 [报告]
发表于 2004-09-17 11:40 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

wddllyy原创不断啊.
这个认证管理很不错,轻巧实用.实现起来也容易.
不知道LDAP能不能像mysql那样用php之类的来操作啊?

论坛徽章:
0
4 [报告]
发表于 2004-09-17 11:50 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

原帖由 "flyg" 发表:
wddllyy原创不断啊.
这个认证管理很不错,轻巧实用.实现起来也容易.
不知道LDAP能不能像mysql那样用php之类的来操作啊?


LDAP本身作为一个认证服务系统,它更强大
你说的是用web操作LDAP吧,是可以的用phpldapadmin或者用perl写都可以
不过我没有研究过,呵呵

论坛徽章:
0
5 [报告]
发表于 2004-09-18 09:26 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

请了几天假,proxy好像高手不少啊。好现象啊。

论坛徽章:
0
6 [报告]
发表于 2004-09-18 10:17 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

[quote]原帖由 "szkingrose"]请了几天假,proxy好像高手不少啊。好现象啊。[/quote 发表:
haha 斑斑真给面子  

我不是高手拉 去灌水还说注册未满3天不许灌,只好到这里发发心得小文章

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2004-09-19 04:42 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

auth_param basic program /var/squid/bin/mysql_auth

這個程式其實也不見得要 c 寫, perl/php/shell 都可以做到同樣的事
重點只在於 Output 如果是 OK , 代表認證通過
若是 ERR , 則表不過,輸入方式為 STDIN,
squid (proxy) 傳來的東西沒記錯的話是 username passwd
而這組 id/passwd 在網路上則是以 base64 在傳(同 http auth)
..
所以 ldap + php 認證沒有什麼太大問題的,只要你的 php  query ldap
後,送出 OK\n (stdout)表示認證通過即可,ERR\n 則不通過
原理懂用什麼來認或做倒都不難.


那個 sql 句字可以再依自己需要加強,例如抓時間或部門,來決定是否放行
如果再去找個 pam_mysql/libnss-mysql ,都果你弄的起來  (i can   )

就可以和系統帳號同步(libnss-mysql 是讓帳號存入 mysql,如同 libnss-ldap
則存入 ldap)
http://libnss-mysql.sourceforge.net/
http://sourceforge.net/projects/pam-mysql/


如果還要更好一點 ...
http://www.diegonet.com/support/mod_auth_mysql.shtml
連一般網頁常用的 .htaccess 都可以參考同一個 mysql 表 (這也有 ldap 版)

這種方案我們以跑好幾年了,所有的機器與認證都重 mysql 來
(機器有四十部以上), mysql 跑兩套在不同機器並做同步,以防當掉

ps: 那段 c source code 建議註明出處,如果不是樓主自己寫的話

论坛徽章:
0
8 [报告]
发表于 2004-09-19 13:13 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

原帖由 "abel" 发表:

這個程式其實也不見得要 c 寫, perl/php/shell 都可以做到同樣的事
重點只在於 Output 如果是 OK , 代表認證通過
若是 ERR , 則表不過,輸入方式為 STDIN,
squid (proxy) 傳來的東西沒記錯的話是 username passwd
而這組 id/passwd 在網路上則是以 base64 在傳(同 http auth)
..
所以 ldap + php 認證沒有什麼太大問題的,只要你的 php query ldap
後,送出 OK\n (stdout)表示認證通過即可,ERR\n 則不通過
原理懂用什麼來認或做倒都不難.


非常感谢,有时间的话一定试试看ldap,

原帖由 "abel" 发表:

那個 sql 句字可以再依自己需要加強,例如抓時間或部門,來決定是否放行
如果再去找個 pam_mysql/libnss-mysql ,都果你弄的起來 (i can  )

就可以和系統帳號同步(libnss-mysql 是讓帳號存入 mysql,如同 libnss-ldap
則存入 ldap)

这一段没看太懂 老大能不能讲清楚点呢?
谢谢拉
ps  另外 您是港台地方的么?怎么用繁体?


原帖由 "abel" 发表:

http://libnss-mysql.sourceforge.net/
http://sourceforge.net/projects/pam-mysql/


如果還要更好一點 ...
http://www.diegonet.com/support/mod_auth_mysql.shtml
連一般網頁常用的 .htaccess 都可以參考同一個 mysql 表 (這也有 ldap 版)

這種方案我們以跑好幾年了,所有的機器與認證都重 mysql 來
(機器有四十部以上), mysql 跑兩套在不同機器並做同步,以防當掉


ps: 那段 c source code 建議註明出處,如果不是樓主自己寫的話


真不好意思    ,我是直接从服务器上源代码里拷出来的  现在加上了.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-09-19 16:52 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

wddllyy 兄真的不錯哦...
個人覺得,這是很重要的習慣,不是我寫的文字或程式,我一定註冊出處,因為這代
表對作者的尊重與尊敬,反過來想想,今天若您寫了一篇好文.結果人家直接拿去用
都沒有說明出處,其實多數人的心裏都會覺得不好(但當,這不見得每個人都一樣)


當然,您用的這個 c 是用 GPL 宣告的,不會有什麼問題,但若一不注意,公司或個
人很容易因違反 IPR (intellectual property rights,我不知道這個你們的用語,
在台灣稱為智慧財產權), 這點因為可能大家都覺得 Linux 是免費而沒有注意到.
當然,每個公司或單位,的狀況或法律上的檢查可能不同,我但單位因為推行
BS7799 2002 , 所以關於這個程面問題,都會很小心.,


至於您的 pam-mysql/libnss-mysql 問題,建議您直接到官方網站看
若你要實作,就依官方的文件去做,試著不用什麼 "中文文檔" "xxx 教學",
那種東西大多數只能讓你捷進,但不能培養你的真正能力,尤其學習力及解決問題
的能力(教學文件不會跟你列什麼狀況如何解決...這種"小事",但這才是能力所在)
pam-mysql 讓你用 mysql 做 pam  認證,像 login/pop3/imap/su/....
libnss-mysql 讓系統帳號轉入 mysql , 如此即可以用 db 的操作,來處理 user 事務

你若把我給的 link 第一頁看過,大概就知道是什麼東西了.

论坛徽章:
0
10 [报告]
发表于 2004-09-19 22:59 |只看该作者

[原创]Linux下搭建基于MYSQL认证,Apache+php管理的Squid代理系统

感谢楼上兄台的教诲,

intellectual property rights 译为 知识产权保护法
这方面我一定注意.

另外谢谢告知学习方法,小弟有空一定看看,早日赶上各位大侠的水平.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP