服务器运行2个月了一直靠着sftp在传文件,决定还是配个ftp server方便下其他需要文件传输的朋友。
根据版本号原则(选择版本号最丰富最高的那个),在ProFTP/Pure-ftp/vsftp中选择了ProFTP,部分原因也是为了能搭配Mysql来保存用户信息。 这样做的好处在于可以不必暴露服务器上真实的用户名密码,即使信息外泄也不会引发严重安全问题,而且修改用户信息定义也方便,无需root登录只要修改下数据库就生效了。
在Gentoo上安装时需要USE参数中有mysql才会编译proftpd的mysql支持。 下面就是proftpd.conf里的配置,辅以简单说明
\[code lang="bash"\]# 申明从mysql中读取用户信息 AuthOrder mod_sql.c # SQL信息log输出,方便调试 SQLLogFile /var/log/proftpd.sqllog # 指定验证方法,Backend即调用特定数据库的密码加密方法,如Mysql下的password()函数 SQLAuthTypes Backend SQLBackend mysql SQLAuthenticate users groups #用户库连接信息 数据库名@主机名 用户名 密码 SQLConnectInfo dbname@localhost dbuser dbpassword # 数据库表的结构,如果你采用后文给出的db schema则无需更改 SQLUserInfo ftpusers userid passwd uid gid homedir shell SQLGroupInfo ftpgroups groupname gid members # 当用户登录时更新数据库表中count字段的值+1并且更新accessed字段值为当前时间。 #这两条并非必须,只是为了记录下用户登录时间次数。同理,可以将用户执行STOR或DELE的信息输出到日志 SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE “count=count+1,accessed=now() WHERE userid=’%u’” ftpusers
\[/code\]\[code lang="sql"\]# 数据表结构如下 CREATE TABLE IF NOT EXISTS `ftpusers` ( `userid` varchar(40) NOT NULL, `passwd` varchar(50) NOT NULL, `uid` int(11) NOT NULL default ‘0’, `gid` int(11) NOT NULL default ‘0’, `homedir` text NOT NULL, `shell` text NOT NULL, `count` int(11) NOT NULL default ‘0’, `accessed` datetime default NULL, PRIMARY KEY (`userid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `ftpgroups` ( `groupname` varchar(50) NOT NULL, `gid` int(11) NOT NULL, `members` text NOT NULL, PRIMARY KEY (`groupname`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
\[/code\]这里需要注意的是,user表中每个user的uid和gid字段值必须是系统中存在的并且有足够权限读写homedir指向的路径。举个例子,如果有虚拟用户ayue且homedir指向/var/ftp/ayue,并且/var/ftp/ayue实际上是由用户Juda拥有,则ayue的uid和gid必须和/etc/passwd中Juda的一样才能正常读写该目录。也就是说,我们在数据库中创建的虚拟用户ayue可以理解为系统中真实存在的用户Juda的一个映射,ayue上传的文件在系统里就是Juda(同uid,同gid)所拥有的。