proftpd+mysql虚拟用户认证配置


1.       查看是否已经安装proftpd软件(一般Debian5.0自带安装,通常为1.3.0以上的版本)查看是否安装proftpd,通过命令查看是否已经安装proftpd服务端(结果依据版本而定)

apt-cache search proftpd


 

2.       安装proftpd-mysql整合模块

aptitude install proftpd-mysql或者apt-get install proftpd-mysql(这个命令试过了很多源都更新不到)

Proftpd安装后会提示 inetd or standalone? 选择:standalone模式运行


3.       增加用户组和用户

groupadd -g 2001 ftpgroup

useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

 

4.       创建数据库表结构

mysql -u root -pcreate database ftp;

 

GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'ftp'@'localhost' IDENTIFIED BY 'password';

GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'ftp'@'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';

 

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 2001, 'ftpuser');

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (1, 'test', 'test', 2001, 2001, '/home/www.demo.com', '/sbin/nologin', 0, '', '');

INSERT INTO `ftpuser` (`id`, `userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`) VALUES (2, 'admin', 'admin', 2002, 2001, '/home/www.demo2.com', '/sbin/nologin', 0, '', '');

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);

 

quit;

 

5.       修改配置文件/etc/proftpd/proftpd.conf

5.1   关闭IPv6的支持

查找UseIPv6字段修改on为off


5.2   添加数据库支持以及配置限制

# 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 root zsdinfo

 

# 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

CreateHome 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


5.3   查找/etc/proftpd/module.conf文件

注释LoadModule mod_sql_postgres.c

 

5.4   重启proftpd

/etc/init.d/proftpd restart

5.5   登录FTP测试是否能够通过mysql所设置的用户登录

ftp localhost

用户名和密码使用mysql中数据库ftp对应的ftpuser的用户

登录成功:


 

登录失败:


 

6.       数据库表结构介绍

ftpuser Table表介绍:这些表都是由MySql来自动创建,一般不要手工修改。

userid: Proftpd虚拟用户(如exampleuser )

passwd: 用户加密密码。

uid: 该帐号的FTP用户创建结束时,第2步(如2001)

gid: 在groupid的FTP创建组结束时,第2步(如2001)

homedir: 虚拟Proftpd用户的主目录 (如 /home/www.example.com)。虚拟用户将被固定在这个主目录中,也就是说,他不能访问其他目录以外的主目录。

shell: 用户登陆后的shell。 默认情况下在 /sbin/nologin 这里。

 

ftpquotalimits Table表介绍:这些表都是由MySql来自动创建,一般不要手工修改。

name: Proftpd的虚拟用户 (如exampleuser)

quota_type: 用户或组。通常情况下,是在这里使用的用户。

per_session: true或false 。true 是指配额限制只适用于一次上传。例如,如果用户都有一个配额的15 MB时,他已上传15M文件,他就不能上传东西更多。但如果他退出logs再次登陆,他再次有15 MB可用。当值为false 时,该用户有15 MB时,不管他是否登陆,将再一次写入logs。

limit_type: hard 或 soft。hard 配额限制是不能超过限额,而soft 配额可以暂时超过。通常你很难在这里使用。

bytes_in_avail: 上传限制字节 (如:15728640 for 15 MB)。0意味着无限的。

bytes_out_avail: 下载限制字节。 0意味着无限的。

bytes_xfer_avail: 限制字节总和。上传和下载的使用者的总和,是允许这样做。 0意味着无限的。

files_in_avail:上传限制的文件。 0意味着无限的。

files_out_avail: 下载文件的限制。 0意味着无限的。

files_xfer_avail: 转移限制的文件。 0意味着无限的。

 

ftpquotatallies table 使用 Proftpd 内建的配额管理,所以不用再新建。

 

7.       SSL认证配置(可选)

aptitude install openssl

vi /etc/proftpd/proftpd.conf

 

UseIPv6 off

加入如下内容:

DefaultRoot ~

IdentLookups off

ServerIdent on "FTP Server ready."

8.       创建TLS的SSL证书(可选)

8.1   为了使用TLS,我们必须创建一个SSL证书。我想创建在 /etc/proftpd/ ,先创建 ssl 目录:

mkdir /etc/proftpd/ssl

 

8.2   基本信息配置

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 []: <-- 请输入你的电子邮件地址。

 

8.3   添加tls.conf

vi /etc/proftpd/proftpd.conf

在文件中引入 /etc/proftpd/tls.conf 这一行:

# This is used for FTPS connections

Include /etc/proftpd/tls.conf

 

8.4   备份配置文件

cp /etc/proftpd/tls.conf /etc/proftpd/tls.conf_org

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>

 

8.5   重启proftpd测试SSL登录

/etc/init.d/proftpd restart

 

附录一  常用参数

  • MaxClients 100 ;最大用户同时连接数
  • MaxClientsPerHost 8 ;同一个客户端只能最多8个账号可以登陆
  • MaxClientsPerUser 5 #每个账户在每个客户端最多可以同时登陆5次,可以防止多线程软件下载对服务器的破坏。
  • MaxHostsPerUser 2 #每个用户最多允许来源IP为2个。
  • WtmpLog on 是否要把ftp记录在日志中,设置成off可以屏蔽掉log日志。
  • TransferRate RETR 100.0:102400 #限速100KByte/S
  • TimeoutIdle 150 #发呆时间(秒)默认为600秒
  • TimeoutLogin 50 #登陆超时(秒)
  • TimeoutNoTransfer 150 #传输超时(秒)
  • UseReverseDNS off #不允许proftpd进行DNS反查
  • IdentLookups off #不对用户端进行ident确认
  • AllowOverwrite on ;允许覆盖
  • AllowRetrieveRestart on ;允许下载续传
  • AllowStoreRestart on ;允许上载续传
  • AllowForeignAddress on #让proftp支持现在流行的passive传输方式,默认是不支持的。
  • PassivePorts 49152 65534 #端口也可自己指定喜欢的,千万别忘了在客户端也要设置成支持passive
  • RootLogin on #允许以root身份登录,默认是不允许的,出于安全起见不推荐此选项。

附录二  配置基于本地用户的访问控制

<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

附录三  proftpd.conf样例

#设置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;

附录四  proftpd的一些命令

1.       ftpshut:关闭FTP服务,并在/etc下生成文件shutmsg。要重新开放FTP服务,把/etc/shutmsg删除。

2.       ftpcout:FTP服务器在线人数信息显示。

3.       ftpwho:FTP服务器在线人员名单。

4.       ftptop:FTP服务器当前情况。

附录五  FTP 数字代码的意义

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 未执行请求的的命令,名称不正确。