个人机器需要开个文件共享,Linux机器懒得配置SMB,就直接安装了ProFtpd,以做FTP服务器
Ubuntu安装挺简单,可使用就不那么友好了,配合GAdmin-Proftpd,一样不好用。
首先就卡在用户上,默认ftp用户等等都登录不进,各种认证失败,麻烦死了
搜索一下资料,可以支持Sqlite3做后端用户认证
就修改了一下Proftpd的配置,首先在modules.conf打开sql认证的终端
LoadModule mod_sql.c ...... # Install proftpd-mod-sqlite and decomment the previous # mod_sql.c module to use this LoadModule mod_sql_sqlite.c
然后再配置Sqlite3的配置,直接从网络上抄下来的,内容直接存为一个文件,放在/etc/proftp.d/conf.d/目录下
#首先来说这俩,定义proftpd以什么身份来运行,跟apache里的是一个意思 #我是习惯了apache定义为www用户和www组,配置proftpd也就这样了 #以什么身份运行,我个人感觉没啥特别意义,关键是虚拟用户对实体用户的映射! User ftp Group nobody #sqlite2跟3差别较大,各软件平台对其支持也是分开来的,比如PHP #这里就是指明,使用sqlite3 SQLBackend sqlite3 #数据库文件的绝对路径,一定要绝对 SQLConnectInfo /usr/local/lib/ftpd.db #数据库内虚拟用户的密码认证方式 #我认为Backend的意思就是数据库自己的认证方式,比如mysql的password方案 #该方案可以指定多种,使用空格隔开,按照先后,依次try #下面这句的意思就是“先用sqlite自己的认证方式(我用的明文,其他解决方案没研究) #如果不行,再使用crypt(3)的方案”,实际配置文件里我只要了一个Plaintext SQLAuthTypes Plaintext 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 1000 #这两个的意思,是所有未在数据库中定义uid和gid的用户的默认uid及gid SQLDefaultUID 1001 SQLDefaultGID 1002
最后建立SQLITE3的数据库
执行sqlite3 /usr/local/lib/ftpd.db
输入如下两个SQL语句,分别创建表,及插入一个用户
CREATE TABLE "users" ("user_name" varchar(20), "user_passwd" varchar(50), "uid" int(11) NOT NULL DEFAULT 1001, "gid" int(11) NOT NULL DEFAULT 1002, "home_dir" varchar(200), "shell" varchar(200)); INSERT INTO "users" VALUES('test','test',1001,1002,'/home/www/ftp/test',NULL);
使用test用户就可以登录了。
表的uid和gid的默认值都设置为了1001/1002,即XXX用户在系统内的uid和gid的值。新添加字段时,这两个字段我也设置了。XXX用户和组在我系统内是早就建好的,uid和gid分别都是1001/1002。
通过这两个字段的值,就完成了proftpd内的虚拟用户跟系统内实体用户的映射
如果插入的虚拟用户的UID与GID都是1000,那创建的文件/目录就归属于当前用户了(大多是系统建立时的第一个用户)
然后配置目录权限,我希望做到是所有用户只允许上传、下载,不允许删除
简单配置一个文件放在/etc/proftp.d/conf.d目录下
<Limit DELE RMD> DenyAll #全部匿名用户在download文件夹不能WRITE写入、删除、删除文件夹 </Limit>
配置文件备份:https://files.cnblogs.com/files/eaglexmw/proftpd.conf.tar.gz