ProFTPD搭载sqlite3,简单配置轻量级FTP服务器

所谓简单,是因为ProFTPD的一些复杂功能都没有写进来,比如用户磁盘空间配额、上传下载速率限制等。
所谓轻量级,是因为配这个平台,是为了公司内部使用,用户有限。更复杂的配置,日后再说吧:)

网上的很多关于ProFTPD搭载数据库进行管理的文章,大多用的都是MySQL(搜baidu的结果)和PostgreSQL(搜google的结果),可是单单为了一个公司内部使用的这么一个小平台,使用这么两个重量级的数据库,是在有点杀鸡用牛刀的感觉。对于我的需求,Sqlite这个轻量级的嵌入式数据库,显然是最最合适的选择。在网上跑来跑去找了1个多小时,也没有一篇像样的配置文档,甚至连ProFTPD的官方doc里,提起sqlite也是只言片语。没办法,只有自己对着英文的Howto,自己摸索了。

1,Install Sqlite3 and ProFTPD
下载安装Sqlite3最新版:http://www.sqlite.org/

#tar -zxf sqlite-amalgamation-3.6.13.tar.gz
#cd sqlite-3.6.13/
#./configure
#make
#make install

下载安装ProFTPD最新版:http://www.proftpd.org/
ProFTPD对于数据库的支持,并不是通过linux的PAM方式来实现的
而是内置了模块,这点曾经让我走了很多弯路,TMD居然没有文章提及这点。使用sqlite模块:

#tar -zxf proftpd-1.3.2.tar.gz
#cd proftpd-1.3.2
#./configure –prefix=/usr/local/proftpd –with-modules=mod_sql:mod_sql_sqlite
#make
#make install

2,配置ProFTPD
编辑/usr/local/proftpd/etc/proftpd.conf文件,加入下面列出来的这一大坨参数。
这里只说说跟Sqlite3有关的参数,其他比较有用的参数配置说明,满世界都是。完整配置文件放在最后。
其实除了SQLBackend和SQLConnectInfo两个参数之外,剩下的一些参数在配置其他数据库时也会用到
我在配置这些数据库相关参数的时候,走了很多弯路,查了很多文档,记下来也给自己脑子备个份。

#首先来说这俩,定义proftpd以什么身份来运行,跟apache里的是一个意思
#我是习惯了apache定义为www用户和www组,配置proftpd也就这样了
#以什么身份运行,我个人感觉没啥特别意义,关键是虚拟用户对实体用户的映射!
User www
Group www

#sqlite2跟3差别较大,各软件平台对其支持也是分开来的,比如PHP
#这里就是指明,使用sqlite3
SQLBackend sqlite3
#数据库文件的绝对路径,一定要绝对
SQLConnectInfo /home/www/ftpd.db
#数据库内虚拟用户的密码认证方式
#我认为Backend的意思就是数据库自己的认证方式,比如mysql的password方案
#该方案可以指定多种,使用空格隔开,按照先后,依次try
#下面这句的意思就是“先用sqlite自己的认证方式(我用的明文,其他解决方案没研究)
#如果不行,再使用crypt(3)的方案”,实际配置文件里我只要了一个Backend
SQLAuthTypes Backend Crypt
#自定义存放用户信息的表和字段
#下面这句的意思就是
#users表 里的 字段:用户名 密码 系统映射uid 系统映射gid 主目录 shell路径
#切记:表和字段的名字可以随便起(跟实际数据库中的表和字段相对应),但顺序不可乱
#按照我对英文howto的理解,前4个字段名是必须要设置的,后两个如果自己用不上
#必须使用NULL来填补,这样mod_sql模块就不会去检索这俩字段了
SQLUserInfo users user_name user_passwd uid gid home_dir NULL
#如果主目录字段名设置为NULL,那么这里这个就必须要定义
#这个是用来定义那些没有“主目录定义的用户”的主目录,有点绕口:P
#SQLDefaultHomedir “/tmp”
#这个参数设置为off的意思,是不让proftpd去检查该FTP用户映射到系统里的用户的shell
#就是说,有没有shell,我都让你登陆。特别是上面的字段,将shell路径这个设置为了NULL
RequireValidShell off
#组信息,没啥意思,就这么放着吧,意思跟上面那个SQLUserInfo一样
#表名 组名 组id 成员
SQLGroupInfo groups group_name gid members
#这里是用户身份认证的程度,只验证user,连带group啥的都验证
#图简单,我这里只验证user这一层
SQLAuthenticate users
#设置ProFTPD允许登陆的最小UID,这个UID是映射到linux系统内实际用户的UID,小于这个值将不允许登陆
#这个值如果不设置,系统默认的是999,在很多国内的文章里,uid和gid都是设置5000多
#所以即使不管这个值,也不会有问题,可是如果你跟我一样,映射用户的uid和gid都小于999了,就要注意它了
#我的www用户的uid和gid都是504,在这里,卡了我有一个多小时,TNND
SQLMinUserUID 500
#这两个的意思,是所有未在数据库中定义uid和gid的用户的默认uid及gid
SQLDefaultUID 504
SQLDefaultGID 504

我的完整的proftpd.conf文件

http://rui7905.googlecode.com/svn/trunk/proftpd_sqlite3

3,建立数据库及用户表
#sqlite3 /home/www/ftpd.db 数据库就建好了,简单吧~
其实理论上,这个文件的路径,是放在哪里都可以的。我配置完这个平台后,又用php写了一个简单的管理平台
为了方便我的apache运行用户www读写数据库,就放在了www的主目录下。。
在sqlite3环境下,用下面这个语句建立数据表

CREATE TABLE “users” (“user_name” varchar(20), “user_passwd” varchar(50), “uid” int(11) NOT NULL DEFAULT 504, “gid” int(11) NOT NULL DEFAULT 504, “home_dir” varchar(200), “shell” varchar(200))

下面创建一个新用户:

INSERT INTO “users” VALUES(‘test’,’test’,504,504,’/home/www/ftp/test’,NULL);

表的uid和gid的默认值都设置为了504,即www用户在系统内的uid和gid的值。新添加字段时,这两个字段我也设置了。www用户和组在我系统内是早就建好的,uid和gid分别都是504。通过这两个字段的值,就完成了proftpd内的虚拟用户跟系统内实体用户的映射。具体到自己,请根据实际情况来设置这两个字段的默认值,及新添加记录的值。
4,最后
到现在,整个配置应该是完成了,使用这个命令来启动ProFTPD:

/usr/local/proftpd/sbin/proftpd -c /usr/local/proftpd/etc/proftpd.conf &

参考资料:
ProFTPD Howto:SQL and mod_sql:
http://www.proftpd.org/docs/howto/SQL.html
ProFTPD module mod_sql:
http://www.proftpd.org/docs/contrib/mod_sql.html
ProFTPD module mod_sql_sqlite:
http://www.proftpd.org/docs/contrib/mod_sql_sqlite.html
Configuration Directive List:
http://www.proftpd.org/docs/directives/linked/by-name.html
Simple MySQL Authentication:
http://www.proftpd.org/docs/configs/mysql_simple.conf

ProFTPD搭载sqlite3,简单配置轻量级FTP服务器》有5个想法

  1. Pingback引用通告: 架設FTP – Proftpd & Sqlite | Ferrari != Ferrari

  2. cser

    其实多用户的时候也一样,只要把uid和gid对应好就可以了。
    这样上传的文件权限也自动一一对应,刚开始不知道。把所有的用户都映射到同样的uid和gid了。
    走了很多弯路。

    回复
  3. 清风

    wget http://www.sqlite.org/sqlite-autoconf-3070500.tar.gz
    tar zxvf sqlite-autoconf-3070500.tar.gz
    cd sqlite-autoconf-3070500
    ./configure
    make
    make install
    cd ../

    wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.3d.tar.gz
    tar zxvf proftpd-1.3.3d.tar.gz
    cd proftpd-1.3.3d
    ./configure –prefix=/usr/local/proftpd –with-modules=mod_sql:mod_sql_sqlite –with-modules=mod_quotatab:mod_quotatab_sql –with-modules=mod_tls –with-includes=/usr/local/include –with-libraries=/usr/local/lib
    make
    make install
    cd locale/
    make install
    cd ../../

    groupadd -g 504 ftpgroup
    useradd -u 504 -g 504 -s /sbin/nologin ftprun

    mkdir /data
    mkdir /data/ftp
    mkdir /data/website

    chown -R ftprun:ftpgroup /usr/local/proftpd
    chown -R ftprun:ftpgroup /data/ftp
    chmod 0766 /usr/local/proftpd
    chmod 0766 /data/ftp

    rm -rf /usr/local/proftpd/etc/proftpd.conf
    vi /usr/local/proftpd/etc/proftpd.conf

    3,建立数据库及用户表
    sqlite3 /data/ftp/ftpd.db 数据库就建好了,简单吧~
    其实理论上,这个文件的路径,是放在哪里都可以的。我配置完这个平台后,又用php写了一个简单的管理平台
    为了方便我的apache运行用户www读写数据库,就放在了www的主目录下。。
    在sqlite3环境下,用下面这个语句建立数据表
    CREATE TABLE “users” (“user_name” varchar(20), “user_passwd” varchar(50), “uid” int(11) NOT NULL DEFAULT 504, “gid” int(11) NOT NULL DEFAULT 504, “home_dir” varchar(200), “shell” varchar(200));
    INSERT INTO “users” VALUES(‘test2′,’test2′,504,504,’/data/website’,NULL);

    .e #退出命令

    4,最后
    到现在,整个配置应该是完成了,使用这个命令来启动ProFTPD。
    /usr/local/proftpd/sbin/proftpd

    我这样弄的 老哥给指点一下 哪里错了

    回复

发表评论

邮箱地址不会被公开。 必填项已用*标注