这个想法很早就有了,只是一直没有动手去做。我是喜欢想清楚再动手的,如果没有想清楚,宁可不动手。我们团队的ftp原来的用户密码简直就是不设防的,而且使用的是mysql做的,改密码非常的不方便。
proftpd自身已经提供了一套接口,只要所开发的新模块按照相应的认证接口提供功能,那么使用BBS用户密码作为ftp的用户密码,是不困难的。
所实现的接口无非是提供类似系统调用的getgroup、getpwnam等等,认证的部分是在auth当中来完成,具体的接口表像下面这个样子:
static authtable auth_bbs_authtab[] = {
{ 0, "setpwent", bbspw_setpwent },
{ 0, "endpwent", bbspw_endpwent },
{ 0, "setgrent", bbspw_setgrent },
{ 0, "endgrent", bbspw_endgrent },
{ 0, "getpwent", bbspw_getpwent },
{ 0, "getgrent", bbspw_getgrent },
{ 0, "getpwnam", bbspw_getpwnam },
{ 0, "getpwuid", bbspw_getpwuid },
{ 0, "getgrnam", bbspw_getgrnam },
{ 0, "getgrgid", bbspw_getgrgid },
{ 0, "auth", bbspw_auth },
{ 0, "check", bbspw_check },
{ 0, "uid2name", bbspw_uid2name },
{ 0, "gid2name", bbspw_gid2name },
{ 0, "name2uid", bbspw_name2uid },
{ 0, "name2gid", bbspw_name2gid },
{ 0, "getgroups", bbspw_getgroups },
{ 0, NULL }
};
其实,虽然系统提供了这些接口要求,但是也并不是所有的接口都需要用上,在一般的认证和ftp session过程当中,主要用到的有getgroups、uid2name、gid2name、auth、getpwnam等有限的几个,还有一些如setpwent、endpwent、setgrent、getpwent、endpwent等等虽然会被调用到,但是并不会对proftpd的内部处理造成影响,甚至proftpd也不判断返回值。
今天已经将这一套功能正式在团队里测试,下一部可以做的是:
1、如何提高认证的效率?在FB BBS当中,有专门的共享内存负责存放用户名在密码文件当中的位置,这样在检索的时候比在文件当中索引要快得多,考虑到ftp上传下载的时候通常会多线程处理,意味着同时会有一个用户的多个认证线程在工作,如何提高这里的效率,值得考虑;
2、如何将用户与多个组相关联。团队里一个同学会隶属于多个项目组,那么如何建立用户与项目组之间的关系,这可能要通过团队的短信平台数据库来完成,目前对于通过BBS用户密码认证的用户全部是认为是一个组,全部放在temp目录下。这对于分组管理来说还是不方便的。
不过现在至少我们迈出了第一步了,呵呵。
这两天最后的新版本编译是分布在新服务器和现有服务器上完成后才投入使用的,不过在编译的过程当中也碰到一些小小的问题,居然都是在库的链接上。在新服务器上,由于centos虽然安装了mysql,但是却没有mysql的头文件,导致proftpd在增加sql支持的时候编译不过,上网下载了mysql的头文件后解压到/usr/include下解决,但在链接的时候说找不到mysqlclient的库,查了/usr/lib/mysql目录下明明有,在./configure的时候也指定了路径,可就是报错,后来才发现那个目录下没有libmysqlclient.so的文件,只有xxxx.so.x,只好做一个符号链接了事。在现有的服务器上,mysql是另外安装的,找到了/usr/local/mysql目录以后,在configure的时候敲错了库的目录,也是一番折腾,呵呵。看样子熟手也有马失前蹄的时候啊~~


