理论描述
Linux系统中,有不少实现FTP服务器的软件套件。但是,大部分都是基于Linux系统用户。。这一方面,没必要,ftp用户能上传下载文件即可;另一方面,不安全,ftp用户一旦采用弱密码,则会大大降低系统安全性。
根据我们的需求,我们的FTP服务器需要满足以下特点:
匿名登录
FTP的Passive传输模式
UTF-8编码,对客户端推送语言编码
虚拟用户,用户磁盘空间限额
FTPS安全传输
根据以上需求,我们采用了proftpd这款软件。它不但能优雅的完成上述功能,还能有更多的强大功能等待我们发现。
proftpd服务器完全使用编译的方式安装软件,使用一个配置文件来配置服务。proftpd支持使用mysql数据库存储用户信息。然而,在满足我们需要的情况下,为了保持系统简洁性,我们采用文件存储用户信息。
proftpd软件短小精悍,官方鸟语文档丰富,可读性非常好。
操作步骤
获取软件包
搭建系统时,官方最新的稳定版本是1.3.xx,从下面地址下载源代码包:
ftp://ftp.proftpd.org/distrib/source/
下载后,解压。
tar xvfproftpd-1.3.xx.tar.gz
安装软件
这里采用编译的形式安装
./configure--with-modules=mod_quotatab:mod_quotatab_file:mod_ban:mod_tls:\\
mod_rewrite:mod_ifsession--enable-ctrls --enable-nls
--with-modules//编译时包括选项:
mod_quotatab //启用 quota用户磁盘限额
mod_quotatab_file //采用基于文件的quotatab
mod_ban //启动动态黑名单,防止密码猜测,DDOS攻击
mod_tls //启用tls,实现功能FTPS
mod_rewrite //启用重写,可实现用户上传内容自动改名
mod_ifsession //启用会话判断,可判断会话,对用户IP设置规则。
--enable-ctrls //启用访问控制,可设置ACL
--enable-nls //启用语言探测,解决中文乱码。
make
//默认安装到/usr/local/ ,需要root权限
makeinstall
编译安装完成后,我们看一下,安装后的文件分布:
[root@ftp ~]# cd /usr/local
[root@ftp local]# ls -R
./bin:
ftpasswd ftpcount ftpdctl ftpmail ftpquota ftptop ftpwho prxs
./etc:
conf.d proftpd.conf (部分输出)
./etc/conf.d:
ban.tab ftpd.group ftpquota.limittab mod_ban.conf mod_tls.conf proftpd-key.pem
cacert.pem ftpd.passwd ftpquota.tallytab mod_quota.conf proftpd-cert.pem whitelist
配置主配置文件
接下来,讲解配置文件。下面的配置文件只是一个实例,并不通用。使用者根据自身情况酌情修改,
在开始配置proftpd配置文件之前,请确保已经正确配置了,proftpd需要的文件,目录,文件池等必要条件。
# This isa basic ProFTPD configuration file . rename it to
#'proftpd.conf' for actual use. Itestablishes a single server
# and asingle anonymous login. It assumes thatyou have a user/group
#"nobody" and "ftp" for normal operation and anon.
#--------------------------------------------------------------------------
# mainconfigure for
# ftp.xiyang-liu.com
# by xiyang-liu
#--------------------------------------------------------------------------
##配置管理员邮箱地址,实际没什么用,服务器相当安全,至今没给我发过邮件
ServerAdmin xiyangliu1987@gmail.com
##配置服务器名,实践说明在设置了服务器伪装后,不提示服务器名。
ServerName"Xiyang-liu.comFTP Server"
## 配置服务器伪装,这里我们伪装proftpd成Server-U服务器。
ServerIdent on "Serv-UFTP Server v6.4 for WinSock ready..."
##设置服务器运行模式,独立服务,或者被监管
ServerType standalone
#ServerType inetd
##设置为默认服务器
DefaultServer on
##设置服务器进程运行使用的用户
User nobody
##设置服务器进程运行使用的组
Group nobody
##设置关闭IPv6支持
UseIPv6 off
##设置服务器接受请求的端口
Port21
##设置被动模式使用的端口范围
PassivePorts6000065535
##设置用户上传文件的权限掩码
Umask022
##设置用户被chroot锁定到的各自的Home目录
DefaultRoot~
##关闭欢迎信息显示
DeferWelcome off
##如果显示欢迎信息,则指定显示的文件
DisplayLogin welcome.msg
##指定切换文件夹时,显示的欢迎信息
DisplayChdir.message
#
#
##登录超时时间,从出现输入用户名的提示符到断开连接的时间
TimeoutLogin1200
##空闲超时,无操作超时
TimeoutIdle600
##不传输超时,数据连接建立,但是没有数据传输
TimeoutNoTransfer900
##延迟超时,从数据连接建立到有数据传输最大延迟时间
TimeoutStalled3600
##不使用DNS反查询
UseReverseDNS off
##上传时,允许覆盖已有的文件
AllowOverwrite yes
##不使用RFC 1413协议反查用户信息,加快FTP访问速度
IdentLookups off
## 开启delay引擎,更安全。
## 为什么这么说呢?Proftpd在接受用户请求的时候,会查询用户列表,以确
##定是否有这个用户。如果有,还会查询黑名单列表,访问控制列表。这些查询都需要
##时间。所以,不同情况(服务器存在账户和不存在账户)下,从输入用户名到出现密
##码提示符之间的时间会有一个时间差值。这个时间很短,凭人无法感觉,但是计算机
##可以识别,通过对这个时间差进行分析,可以试探那些Proftpd上存在哪些用户,不
##存在哪些用户。
## 开启delay引擎,会均衡这个时间段。无论输入的用户存不存在,从用户名输入到
##弹出密码提示符的时间间隔都是一样的!
DelayEngine on
##指定日志格式
LogFormatdefault"%h%l %u %t \\"%r\\" %s %b"
LogFormat auth "%v [%P] %h %t \\"%r\\" %s"
LogFormat write "%h %l %u %t \\"%r\\" %s%b"
TransferLog/usr/local/var/proftpd/log/transfer.log
ExtendedLog/usr/local/var/proftpd/log/access.log WRITE,READ write
ExtendedLog/usr/local/var/proftpd/log/auth.log AUTHauth
#
#
##如果存在lang模块
<<>IfModule mod_lang.c>
##开启lang引擎
LangEngine on
##默认语言英文
LangDefaulten_US
##使用强制utf8编码
UseEncoding on
##制定语言模块位置
LangPath/usr/local/share/locale/
<<>/IfModule>
#
##如果存在facts模块
.c>
##关闭FactsAdvertise,提高兼容性。
FactsAdvertise off
<IfModule>
#
##限制特定操作
<<>LimitSITE_CHMOD,SITE_CHGRP>
##阻止所有用户使用更改权限 更改组命令
DenyAll
<<>/Limit>
#
##设置虚拟用户
##指定虚拟用户的passwd和group文件,格式和系统文件一样
AuthUserFile /usr/local/etc/conf.d/ftpd.passwd
AuthGroupFile/usr/local/etc/conf.d/ftpd.group
#这里->这里 之间是约束说明。
##创建虚拟用户的时候制定home目录,应该是下面目录的子目录。
# homedir/ftp_pool/home/
##虚拟用户统一使用nobody的UID和GID
###问:为什么不使用不同的UID和GID?那样不是更安全吗?
###答:也可以使用不同的UID和GID,但是那样太费事。使用不同UID和GID。首先,
##要判断和系统UID和GID是不是有冲突;其次,要每次创建用户需要找一个没用过的
##UID和GID;再次,得给新创建的用户赋予权限;最后,灾难恢复太麻烦。
# useridnobody
# groupidnobody
#这里->这里 之间是约束说明。
#
#
#设置匿名用户资源
<<>Anonymous/ftp_pool/pub/>
##匿名用户使用的用户和组
User ftp
Group ftp
##用户别名
UserAlias anonymous ftp
##不要求合法的shell
RequireValidShellno
MaxClients50
##限制匿名用户登录的位置
<<>Limit LOGIN>
##限制顺序为先允许 再阻止
OrderAllow,Deny
##允许内网用户登录匿名目录
Allow10.0.0.0/8
Allow172.16.0.0/12
Allow192.168.0.0/16
##阻止所有其他用户
Deny ALL
<<>/Limit>
#
##配置upload目录权限
#限制写
Order Allow,Deny
##只允许技术部上传
Allow 10.1.5.0/24
##阻止其他所有用户
Deny ALL
<<>/Limit>
<Directory>
##配置匿名用户权限
<<>Limit WRITE>
##阻止所用户的写权限
DenyAll组织所有
<<>/Limit>
<Anonymous>