Proftpd全称:Professional FTP daemon是针对Wu-FTP的弱项而开发的,除了改进的安全性,还具备许多Wu-FTP没有的特点,能以Stand-alone、xinetd模式运行等。ProFTP已经成为继Wu-FTP之后最为流行的FTP服务器软件,越来越多的站点选用它构筑安全高效的FTP站点,ProFTP配置方便,并有MySQL和Quota模块可供选择,利用它们的完美结合可以实现非系统账号的管理和用户磁盘的限制。
ProFtpd虽然不错,即使再简单,可让新手在字符终端下配置好目录、用户、权限、乃至安全参数,得好好学习一下配置文件的写法才行。这让新手们很头痛。现在好了,有了Gadmintools GADMIN-PROFTPD 新手们也能快速地在桌面上配置ProFtpd了。
Gadmintools GADMIN-PROFTPD主页:http://www.gadmintools.org/
Gadmintools GADMIN-PROFTPD 基于 Gtk+,为 ProFTPD 提供了一个简单直观配置前端。用户配置和服务器参数一目了然,并且可以直接在 Gadmintools 中启动或关闭 ProFTPD,也可以方便的查看生成的配置文件及日志。
下面还是介绍在字符终端前如何配置吧,一般服务器上可没桌面环境让你很直观的配置。
$ sudo aptitude install proftpd-mysql
Proftpd安装后会提示 inetd or standalone? 选择:standalone
$ sudo groupadd -g 2001 ftpgroup $ sudo useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser
$ sudo mysql -u root -pcreate database ftp; GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; USE ftp; CREATE TABLE ftpgroup ( groupname varchar(16) NOT NULL default '', gid smallint(6) NOT NULL default '5500', members varchar(16) NOT NULL default '', KEY groupname (groupname) ) TYPE=MyISAM COMMENT='ProFTP group table'; CREATE TABLE ftpquotalimits ( name varchar(30) default NULL, quota_type enum('user','group','class','all') NOT NULL default 'user', per_session enum('false','true') NOT NULL default 'false', limit_type enum('soft','hard') NOT NULL default 'soft', bytes_in_avail int(10) unsigned NOT NULL default '0', bytes_out_avail int(10) unsigned NOT NULL default '0', bytes_xfer_avail int(10) unsigned NOT NULL default '0', files_in_avail int(10) unsigned NOT NULL default '0', files_out_avail int(10) unsigned NOT NULL default '0', files_xfer_avail int(10) unsigned NOT NULL default '0' ) TYPE=MyISAM; CREATE TABLE ftpquotatallies ( name varchar(30) NOT NULL default '', quota_type enum('user','group','class','all') NOT NULL default 'user', bytes_in_used int(10) unsigned NOT NULL default '0', bytes_out_used int(10) unsigned NOT NULL default '0', bytes_xfer_used int(10) unsigned NOT NULL default '0', files_in_used int(10) unsigned NOT NULL default '0', files_out_used int(10) unsigned NOT NULL default '0', files_xfer_used int(10) unsigned NOT NULL default '0' ) TYPE=MyISAM; CREATE TABLE ftpuser ( id int(10) unsigned NOT NULL auto_increment, userid varchar(32) NOT NULL default '', passwd varchar(32) NOT NULL default '', uid smallint(6) NOT NULL default '5500', gid smallint(6) NOT NULL default '5500', homedir varchar(255) NOT NULL default '', shell varchar(16) NOT NULL default '/sbin/nologin', count int(11) NOT NULL default '0', accessed datetime NOT NULL default '0000-00-00 00:00:00', modified datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (id), UNIQUE KEY userid (userid) ) TYPE=MyISAM COMMENT='ProFTP user table'; quit;
$ sudo vim /etc/proftpd/proftpd.conf
查找UseIPv6并修改为:
UseIPv6 off
然后再文件最后增加如下内容:
DefaultRoot ~ # The passwords in MySQL are encrypted using CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # used to connect to the database # databasename@host database_user user_password SQLConnectInfo ftp@localhost proftpd password # Here we tell ProFTPd the names of the database columns in the "usertable" # we want it to interact with. Match the names with those in the db SQLUserInfo ftpuser userid passwd uid gid homedir shell # Here we tell ProFTPd the names of the database columns in the "grouptable" # we want it to interact with. Again the names match with those in the db SQLGroupInfo ftpgroup groupname gid members # set min UID and GID - otherwise these are 999 each SQLMinID 500 # create a user's home directory on demand if it doesn't exist SQLHomedirOnDemand on # Update count every time user logs in SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Update modified everytime user uploads or deletes a file SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # User quotas # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off
然后修改modules.conf文件注释掉LoadModule mod_sql_postgres.c这行:
$ sudo vim /etc/proftpd/modules.conf
修改成这样:
#LoadModule mod_sql_postgres.c
重启Proftpd
$ sudo /etc/init.d/proftpd restart
$ sudo mysql -u root -p
USE ftp; INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');
在这一步,创建 exampleuser用户,并且配置15MB的上传限额。
INSERT INTO `ftpquotalimits` (`name`, `quota_type`, `per_session`, `limit_type`, `bytes_in_avail`, `bytes_out_avail`, `bytes_xfer_avail`, `files_in_avail`, `files_out_avail`, `files_xfer_avail`) VALUES ('exampleuser', 'user', 'true', 'hard', 15728640, 0, 0, 0, 0, 0);
这一步,分配用户ID:1 用户:exampleuser 密码:secret 并且设置根目录及登陆shell。在增加第2第N个用户的时候,修改对应项即可。
INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'exampleuser', 'secret', 2001, 2001, '/home/www.example.com', '/sbin/nologin', 0, '', ''); quit;
ftpuser Table表介绍:这些表都是由MySql来自动创建,一般不要手工修改。
ftpquotalimits Table表介绍:这些表都是由MySql来自动创建,一般不要手工修改。
ftpquotatallies table 使用 Proftpd 内建的配额管理,所以不用再新建。
$ sudo aptitude install openssl
$ sudo vim /etc/proftpd/proftpd.conf
修改:
UseIPv6 off
加入如下内容:
DefaultRoot ~
IdentLookups off
ServerIdent on "FTP Server ready."
为了使用TLS,我们必须创建一个SSL证书。我想创建在 /etc/proftpd/下 ,先创建 ssl 目录:
$ sudo mkdir /etc/proftpd/ssl $ sudo openssl req -new -x509 -days 365 -nodes -out /etc/proftpd/ssl/proftpd.cert.pem -keyout /etc/proftpd/ssl/proftpd.key.pem
Country Name (2 letter code) [AU]: <-- 输入你的国家名 (如: CN ). State or Province Name (full name) [Some-State]: <-- 输入你所在的州或者省的名字。(如江苏:jiangsu ) Locality Name (eg, city) []: <-- 输入你的城市。(如南京:nanjing ) Organization Name (eg, company) [Internet Widgits Pty Ltd]: <-- 输入你的组织名称(例如,贵公司的名称: yahoo ) Organizational Unit Name (eg, section) []: <-- < - 请输入你的组织单位名称(如“IT部门”: it )。 Common Name (eg, YOUR name) []: <-- 输入完整的系统域名(如“server1.example.com”)。 Email Address []: <-- 请输入你的电子邮件地址。
$ sudo vi /etc/proftpd/proftpd.conf
在文件中引入 /etc/proftpd/tls.conf 这一行:
[...] # # This is used for FTPS connections # Include /etc/proftpd/tls.conf [...]
$ sudo cp /etc/proftpd/tls.conf /etc/proftpd/tls.conf_orig $ sudo vi /etc/proftpd/tls.conf
<IfModule mod_tls.c> TLSEngine on TLSLog /var/log/proftpd/tls.log TLSProtocol SSLv23 TLSOptions NoCertRequest AllowClientRenegotiations TLSRSACertificateFile /etc/proftpd/ssl/proftpd.cert.pem TLSRSACertificateKeyFile /etc/proftpd/ssl/proftpd.key.pem TLSVerifyClient off TLSRequired on </IfModule>
好了,重启proftpd:
$ sudo /etc/init.d/proftpd restart
现在你可以用Filezilla等FTP客户端来连接了,别忘记选择 FTPES 方式。
<Limit LOGIN> #配置只有ftpusers组的用户可以ftp登陆 DenyAll #不允许 AllowGroup ftpusers </Limit>
<Limit LOGIN> Order deny,allow Deny from all #配置禁止某网段地址访问FTP。在这里可以填入如:172.16.5 Allow from 172.16.12 #配置只允许172.16.12网段的机器可以ftp登陆 </Limit>
<Directory /wwwroot> #配置账号webuser拥有/wwwroot目录的所有权限 <Limit ALL> AllowUser webuser </Limit> </directory
<Limit WRITE> #写权限设置 DenyAll #不允许 </Limit>
<Directory ~/incoming> #对确省跟下的incoming目录进行权控设置 <Limit WRITE> #允许incomming目录可写 allowall </Limit> <Limit DELE SITE_CHMOD RETR> #对dele,chmod,retr等ftp命令控制 DenyAll #不允许用户对受控制对象操作 </Limit>
磁盘限额:
Quotas on QuotaCalc on DefaultQuota 8000 #用户只能用8000个block QuotaBlockSize 1024 #byte QuotaBlockName kb #1K,只在提示中出现,告诉用户block的单位。
使用MySQL认证,可以把sample-configurations/mod_sql.conf拷贝到/usr/local/etc下面并将其改名为proftpd.conf
我们用到的比较多的可能是Limit的使用,Limit大致有以下动作,基本能覆盖全部的权限了,大家灵活使用就是了。
CMD:Change Working Directory 改变目录 MKD:MaKe Directory 建立目录的权限 RNFR: ReName FRom 更改目录名的权限 DELE:DELEte 删除文件的权限 RMD:ReMove Directory 删除目录的权限 RETR:RETRieve 从服务端下载到客户端的权限 STOR:STORe 从客户端上传到服务端的权限 READ:可读的权限,不包括列目录的权限,相当于RETR,STAT等 WRITE:写文件或者目录的权限,包括MKD和RMD DIRS:是否允许列目录,相当于LIST,NLST等权限,还是比较实用的 ALL:所有权限 LOGIN:是否允许登陆的权限 针对上面这个Limit所应用的对象,又包括以下范围 AllowUser 针对某个用户允许的Limit DenyUser 针对某个用户禁止的Limit AllowGroup 针对某个用户组允许的Limit DenyGroup 针对某个用户组禁止的Limit AllowAll 针对所有用户组允许的Limit DenyAll 针对所有用户禁止的Limit
#设置FTP服务器的名称: ServerName"My FTP Server" #设置FTP服务器的类型,ProFTPD能以 Stand-alone、xinetd两种模式运行: ServerType standalone #是否启用虚拟的FTP,on 为支持,off是关闭。 DefaultServer on #设置根,可以限制用户在某个地方活动,增强服务器的安全性。 DefaultRoot ~ #设置FTP服务端口号,标准的FTP服务端口是21。 Port 21 #设置新建文件或目录时,指定默认配置文件的权限,一般是022: Umask 022 #同一时间内服务器可以处理的程序有几笔,若服务器运行类型为standalone,可设低一些,以防止DoS攻击,设置最大的了进程: MaxInstances 30 #设置正常服务的系统用户与组,指定proftpd 进程启动时的有效用户ID,处于安全考虑默认的身份是nobody.: User ftpuser Group nobody #使用主机本地端时间,而不要使用GMT时间,会引起时间误差 TimesGTM off #允许覆盖 AllowOverwrite on #设置最大的登录数: MaxClients 10 #当使用者登陆时,则会显示welcome.msg中的欢迎词信息: DisplayLogin welcome.msg #当使用者转换目录,则会显示.message中的信息 DisplayFirstChdir .message #设置最大的尝试登录的次数,如果超过自动断开连接: MaxLoginAttempts 3 #下载时,支持断点续传: AllowRetrieveRestart on #上传时,允许断点续传: AllowStoreRestart on #屏蔽服务器版本信息 ServerIdent off #设置系统日志文件: SystemLog /var/log/ftp.syslog #设置记录文件传输的日志文件: TransferLog /var/log/ftp.transferlog #针对匿名用户的配置信息 #设定登入账号的别名。将登录的 anonymous 账号转换为实际存在的 ftp 帐号,即可用 anonymous 方式登录 UserAlias anonymous ftp #设置MySQL认证: <Global> #数据库联接的信息,DatabaseName是数据库名, HostName是主机名, #Port是端口号,UserName是连接数据库的用户名,Password是密码。 SQLConnectInfo DatabaseName@HostName:Port UserName Password #例如SQLConnectInfo proftpd@localhost root 123456 #数据库认证的类型: SQLAuthTypes Backend Plaintext #指定用来做用户认证的表的有关信息。 SQLUserInfo FTPUSERS userid passwd uid gid home shell #设置如果shell为空时允许用户登录: RequireValidShell off #数据库的鉴别,这里是用于用户的方式: SQLAuthenticate users #如果home目录不存在,则系统会为根据它的home项新建一个目录: SQLHomedirOnDemand on </Global>
关于欢迎文件的设置包含如下参数
%T:目前的时间 %F:所在硬盘剩下的容量 %C:目前所在的目录 %R:Client端的主机名称 %L:Server端的主机名称 %U:使用者账户名称 %M:最大允许连接人数 %N:目前的服务器连接人数 %E:FTP服务器管理员的E-mail %i:本次上传的文件数量。 %o:本次下载的文件数量 %t:本次上传和下载的文件数量
$ sudo vi /wwwroot/welcome.msg 欢迎您%U,这是Johnson的Web空间FTP服务器: 目前的时间是:%T; 本服务器最多允许%M个用户连接数; 目前服务器上已有%N个用户连接数; 目前你所在的目录是%C; 目录所在的硬盘还剩下字节%F;
110 重新启动标记应答。 120 服务在多久时间内ready。 125 数据链路埠开启,准备传送。 150 文件状态正常,开启数据连接端口。 200 命令执行成功。 202 命令执行失败。 211 系统状态或是系统求助响应。 212 目录的状态。 213 文件的状态。 214 求助的讯息。 215 名称系统类型。 220 新的联机服务ready。 221 服务的控制连接埠关闭,可以注销。 225 数据连结开启,但无传输动作。 226 关闭数据连接端口,请求的文件操作成功。 227 进入passive mode。 230 使用者登入。 250 请求的文件操作完成。 257 显示目前的路径名称。 331 用户名称正确,需要密码。 332 登入时需要账号信息。 350 请求的操作需要进一部的命令。 421 无法提供服务,关闭控制连结。 425 无法开启数据链路。 426 关闭联机,终止传输。 450 请求的操作未执行。 451 命令终止:有本地的错误。 452 未执行命令:磁盘空间不足。 500 格式错误,无法识别命令。 501 参数语法错误。 502 命令执行失败。 503 命令顺序错误。 504 命令所接的参数不正确。 530 未登入。 532 储存文件需要账户登入。 550 未执行请求的操作。 551 请求的命令终止,类型未知。 552 请求的文件终止,储存位溢出。 553 未执行请求的的命令,名称不正确。