服务器运行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)所拥有的。