ProFTPD1.3配置

ProFTPD 支持MySQL数据库添加虚拟用户认证及Quotas(磁盘限额)

proftpd.conf配置指令手册(en):http://www.proftpd.org/docs/directives/linked/configuration.html
ProFTPD官方网站(en): http://www.proftpd.org/
proftpd.conf配置指令手册(zh):
http://www.itlearner.com/article/3549/relate
安装环境:
操作系统centos-5.2
mysql 5.0.67 源代码安装在/usr/local/mysql目录

1、proftpd-1.3.2源代码编译安装

./configure –prefix=/usr/local/proftpd
–with-modules=mod_sql:mod_sql_mysql #支持mysql数据库
–with-modules=mod_quotatab:mod_quotatab_sql #支持磁盘配额
–with-modules=mod_tls #支持SSL/TLS安全传输
–with-includes=/usr/local/mysql/include
–with-libraries=/usr/local/mysql/lib
make
make install

cp sample-configurations/mod_sql.conf /usr/local/proftpd/etc/proftpd.conf

2、proftpd.conf文件配置基本格式:

#全局设置
设置项目1 参数1
设置项目2 参数2
……
……
#某个目录的设置
<Directory “路径名”>
……
……
</Directory>
#关于匿名用户的设置
<Anonymous “匿名登录的目录”>
……
……
<Limit 限制动作>
……
……
</Limit>
</Anonymous>

3、proftpd.conf配置文件中的一些基本配置:

ServerName 服务器名称
ServerType 服务器工作类型(standalone/inted)
DefaultServer 是否启用虚拟FTP (on/off)
Port 运行端口
Umask 默认文件权限(022)
User 运行proftpd服务器的用户
Group 运行proftpd服务器的用户组
AllowOverwrite 是否允许客户端覆盖文件(安全上一般设置为off)
RequireValidShell 用户shell不在/etc/shells文件中,默认不允许登陆(on/off)
MaxInstances 20 最多有20个proftpd的PID
MaxClients 10 最多允许10个用户在线
MaxClientsPerHost 1 一个IP只允许一个帐号连接
MaxClientsPerUser 2 每个帐号在每个客户端最多同时登陆2次,可防止多线程下载软件
DisplayLogin welcome.msg ftp登陆欢迎信息文件
<Directory /*> 登入时想进入的目录位置(/* 为通配符)
<Anonymous ~ftp> 匿名用户设置
<Global> 所有虚拟ftp的共同设置项

3.1 虚拟FTP设置
<VirtualHost 192.168.0.1>
ServerName “……”
……
……
</VitualHost>

3.2 开启ftp上传/下载的续传功能
AllowStoreRestart on #上传
AllowRetrieveRestart on #下载

3.3 限速设置

格式为: TransferRate STOR|RETR 速度(kbytes/s) user 使用者
STOR 为上传速度
RETR 为下载速度
后面不跟user的时候,针对全部用户进行限速

3.4 让proftpd支持FXP传输
AllowForeignAddress on
PassivePorts 40000 40999

3.5 加快连接速度,关闭DNS反解
UseReverseDNS off
IdentLookups off

3.6 只允许部分网段访问FTP
<Limit LOGIN>
Order allow,deny
Allow from 10.10.
Deny from all
</Limit>

4、<Limit>参数说明

4.1 限制的动作
CWD: Change Working Directory 改变目录
MKD: Make Directory 创建目录
RNFR: ReName FRom 更改目录名
DELE: DELEte 删除文件
RMD: ReMove Directory 删除目录
RETR: RETRieve 下载
STOR: STORe 上传
READ: 可读文件的权限,但不包括列目录
WRITE: 写文件或目录的权限,包括MKD和RMD
DIRS: 列目录的权限
LOGIN: 登陆的权限
ALL: 所有权限

4.2 <Limit>所应用的对象

AllowUser/DenyUser AllowGroup/DenyGroup AllowALL/DenyAll ……

5、部分安全策略配置

5.1 隐藏proftpd服务器的版本信息
ServerIdent off

5.2 伪装Proftpd服务器
伪装成windows下的ftp服务器Serv-U
ServerIdent on “Serv-U FTP Server v6.4 for Winsock ready ……”

5.3 使用非root权限运行proftpd服务:
User nobody
Group nobody

禁止root登陆:
RootLogin off

对ftp用户使用chroot限制:
DefaultRoot ~

控制ftp命令缓冲区大小:
CommandBufferSize 512

修改proftpd服务器使用的端口:
Port 2121

5.4 监控Proftpd服务器运行情况

5.4.1 记录ftp连接数
watch -n 360 /usr/local/proftpd/bin/ftpcount
每隔360秒显示一次连接用户数量的信息

5.4.2 查找谁与FTP服务器连接
/usr/local/proftpd/bin/ftpwho

5.5 服务器配置文件的修改(proftpd.conf)

5.5.1 通过IP地址限制FTP访问
#只允许10.10.0.0/16网段用户访问
<Limit LOGIN>
Order allow,deny
Allow from 10.10.
Deny from all
</Limit>

5.5.2 使用pam作为proftpd授权用户的鉴别方法
AuthPAM on
AuthPAMConfig ftp

修改/etc/pam.d/ftp相应文件

5.5.3 限制FTP命令特权

*禁止一些用户创建和删除目录的特权
<Directory /*>
<Limit MKD RMD>
Order deny,allow
DenyGroup badusers
AllowAll
</Limit>
</Directory>

*建立只能上载的FTP服务器
<Directory /*>
<Limit RETE>
DenyAll
</Limit>
</Directory>

*限制对单个目录的访问
<Directory /*>
<Limit CWD>
DenyAll
</Limit>
</Directory>

*限制目录浏览特权
<Directory /my/mp3s>
<Limit DIRS>
DenyGroup newfriends
</Limit>
</Directory>

5.5.4 使不同用户之间相互隔离
一些用户通常访问ISP的FTP服务器时,会看到一些不应当的系统信息,因此隐藏这些信息是必要的,下面是一个配置:
DefaultRoot “/www”
<Directory /www>
HideNoAccess on
<Limit ALL>
IgnoreHidden on
</Limit>
</Directory>
HideNoAccess指令将用户隐藏/www 目录下的所有条目,IgnoreHidden指令指示ProFTPD 服务器忽略用户所有指令。

6、加密FTP服务器与客户端的连接
需要在编译安装的时候配置支持相应模块
./configure –with-modules=mod_tls

6.1 制作凭证
# mkdir /etc/ssl/certs
# mkdir /etc/ssl/private
# chmod og-rwx /etc/ssl/private
# mkdir /etc/ssl/crl
# mkdir /etc/ssl/newcerts
修改 /etc/ssl/openssl.cnf
把 dir = ./demoCA 改成 dir = /etc/ssl

6.2 制作最高层认证中心 (Root CA)
Private Key ( Public Key )
# openssl genrsa -des3 -out /etc/ssl/private/myrootca.key 2048
# chmod og-rwx /etc/ssl/private/myrootca.key
填写凭证申请书 (然后按照问题回答即可)
#openssl req -new -key /etc/ssl/private/myrootca.key -out /tmp/myrootca.req
签发凭证
# openssl x509 -req -days 7305 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_ca -signkey /etc/ssl/private/myrootca.key
-in /tmp/myrootca.req -out /etc/ssl/certs/myrootca.crt
# rm -f /tmp/myrootca.req

6.3 用最高层认证中心签发凭证
制作服务器用的凭证
# openssl genrsa -out /etc/ssl/private/myhost.key 2048
# chmod og-rwx /etc/ssl/private/myhost.key
填写凭证申请书
# openssl req -new -key /etc/ssl/private/myhost.key -out /tmp/myhost.req
# openssl x509 -req -days 3650 -sha1 -extfile /etc/ssl/openssl.cnf -extensions v3_req -CA /etc/ssl/certs/myrootca.crt
-CAkey /etc/ssl/private/myrootca.key -CAserial /etc/ssl/myrootca.srl
-CAcreateserial -in /tmp/myhost.req -out /etc/ssl/certs/myhost.crt
# rm -f /tmp/myhost.req

6.4 接下来设定proftpd.conf,主要是在最后加上以下有关TLS的设

< IfModule mod_tls.c >
TLSEngine on
TLSLog /var/log/tls.log
TLSProtocol SSLv23
TLSOptions NoCertRequest
TLSRequired On
TLSRSACertificateFile /etc/ssl/certs/myhost.crt
TLSRSACertificateKeyFile /etc/ssl/private/myhost.key
TLSCACertificateFile /etc/ssl/certs/myrootca.crt
TLSVerifyClient On
< /IfModule >

7、有关MySQL+Quota的设置
需要在编译安装的时候配置支持相应模块
./configure –with-modules=mod_sql:mod_sql_mysql
–with-modules=mod_quotatab:mod_quotatab_sql
–with-includes=/usr/local/mysql/include
–with-libraries=/usr/local/mysql/lib
7.1 数据库的导入

mysql mysql -uroot -ppassword
create database ftpdb
grant select, update on ftpdb.* to proftpd@localhost identified by ‘password’
use ftpdb
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’;

INSERT INTO `ftpgroup` VALUES (’ftpgroup’, 5500, ‘ftpuser’);

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` float NOT NULL default ‘0′,
`bytes_out_avail` float NOT NULL default ‘0′,
`bytes_xfer_avail` float 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` float NOT NULL default ‘0′,
`bytes_out_used` float NOT NULL default ‘0′,
`bytes_xfer_used` float 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`)
) TYPE=MyISAM COMMENT=’ProFTP user table’ ;
7.2 在proftpd.conf文件中加入sql相关配置:

SQLAuthTypes Backend Plaintext
#Backend表示用户认证方式为MySQL数据库的认证方式
#Plaintext表示明文认证方式,排在最前面的为最先使用的方式
SQLAuthenticate users* groups*

# databasename@host database_user user_password
SQLConnectInfo ftpdb@localhost proftpd password
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
SQLHomedirOnDemand on
#如果用户主目录不存在,则系统会根据此用户在用户数据表中的homedir字段的值新建一个目录
# 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

7.3 加入Quota磁盘配额相关设置

QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on
QuotaLog “/var/log/quota”
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

7.4 ftpquotalimits表设置说明

name: – 用户帐号
quota type: – user, group, class, all (we use user)
per_session: – true or false (we use true)
limit_type: – 硬限制 or 软限制 (我们一般用硬限制)
bytes_in_avail: – 允许上传的字节数
bytes_out_avail: – 允许下载的字节数
bytes_xfer_avail: – 允许传输的字节数(包括上传/下载)
files_in_avail: – 允许上传的文件数
files_out_avail: – 允许下载的文件数
files_xfer_avail: – 允许传输的文件数(包括上传/下载)

8、其他
8.1 使用命令ftpshut
基本格式:
ftpshut [ -l min ] [ -d min ] time [ warning-message … ]
参数说明:
-l min: 在ftp关闭服务之前的几分钟内,尝试建立新的ftp连接均不被接受
-d min: 在ftp关闭服务之前的几分钟内,已经建立的ftp连接将被中止
time: 在多少时间后,服务器将关闭ftp服务,格式有两种
+number 经过number分钟后关闭
MMHH 在今天MM:HH服务器将关闭

8.2 welcome.msg 欢迎文件可用参数

%T 目前的时间
%F 所在硬盘剩下的容量
%C 目前所在的目录
%R Client 端的主机名称
%L Server 端的主机名称
%U 使用者帐户名称
%M 最大允许连接人数
%N 目前的服务器连接人数
%E FTP服务器管理员的 email
%i 本次上传的文件数量
%o 本次下载的文件数量
%t 本次上传+下载的文件数量
应用举例:
欢迎您%U, 这是Frank的测试FTP服务器;
目前时间是:%T;
本服务器最多允许%M个用户连接数;
目前服务器上已有%N个用户连接数;
目前你所在的目录是%C;
目录所在的硬盘还剩下%F字节。

 

 

 

 

留下评论