1. 单配置文件,其设置指示和apache的有类似之处,非常容易配置。
    2. 基于单个目录的.ftpaccess设置文件,类似与apache的.htaccess文件。
    3. 易于设置的多虚拟 服务器和匿名ftp服务。
    4. 可以设置为从xinetd启动,或者是独立ftp服务器两种运行方式。
    5. 匿名ftp的根目录不需要任何特殊的目录结构,或系统程序或其他系统文件。
    6. ncfptd不执行任何外部程序,从而减少了安全隐患。
    7. 可以根据文件属主情况或unix风格的访问控制来隐藏文件或目录。
     8. 以非root身份运行,从而减少了安全隐患。
    9. 强大的log功能,支持utmp/wtmp及wu-ftpd格式的记录标准,并支持扩展功能的记录。
    10. 支持Shadow密码,包括支持密码过期机制。
    11. 遵从GPL版权,开放源代码。
    12. 可设定多个虚拟FTP server,而匿名FTP服务更是十分容易。
    13. 最新版本1.2.10 。 http://www.ProFTPD.org
一、基本ProFTPD服务器配置过程:
    1.如果安装过wuftpd服务器首先卸载。ProFTPD最新版本是1.3.0,官方网址: http://www.ProFTPD.org 。下载链结: ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.0.tar.bz2
[root@ftpd /]# bunzip proftpd-1.3.0.tar.bz2
[root@ftpd /]# cp proftpd-1.3.0.tar /usr/src/
[root@ftpd /]# cd /usr/src
[root@ftpd src]# tar xvf proftpd-1.3.0.tar
[root@ftpd src]# cd proftpd-1.3.0
[root@pftd proftpd-1.3.0]# ./configure ; make ; make install   
    到现在为止,你已经完成了proftpd的编译和安装。并且在/usr/local/etc/目录下有一个默认的proftpd配置文件proftpd.conf。
    2.理解配置文件
   下面是默认安装后的配置文件:
ServerName “ProFTPD Default Installation”
ServerType standalone
DefaultServer on
ServerIdent off
Port 21
Umask 022
MaxInstances 30
User nobody
Group nogroup
<Directory /*>
AllowOverwrite on
</Directory>
<Anonymous ~ftp>
User ftp
Group ftp
UserAlias anonymous ftp
MaxClients 10
DisplayLogin welcome.msg
DisplayFirstChdir .message
<Limit WRITE>
DenyAll
</Limit>
</Anonymous>
    这里笔者去掉了所有注视。熟悉Apache服务器的配置方法的读者很很容易理解。二者有许多相似之处。
单线指令,如ServerName and ServerType。
多线容器指令。如<Directory> and <Limit>。
配置服务器后应当知道配置文件中指令的含义。可以参考官方配置指南(下载链接: http://www.proftpd.org/docs/directives/configuration.pdf )。下面主要介绍安全相关的部分。
ServerName :服务器名称。在登入时所显示的服务器名称。确省是:“ProFTPD Default Installation”可以根据个人情况修改。
ServerType :服务器工作类型。ProFTPD能以Stand-alone、xinetd两种模式运行。
DefaultServer:是否启用虚拟FTP,on为支持,off是关闭。
ServerIdent :是否显示FTP软件名称,on为显示,off是关闭。
Port:运行端口。设定于登入时,主机是监听那一个端口。
Umask:指定确省配置文件的权限一般是022。
MaxInstances:最大连接请求。设定服务器于同一时间内可以处理的程序有几笔,若服务器运行类型设为standalone的话,可设低一点,以避免***的DoS***。
User:指明运行FTP服务器的用户名称。
Group: 指明运行FTP服务器的用户组名称。
<Directory /*> 登入时想进入的目录位置 (/*是通配符合),AllowOverwrite 表示是否允许客户端覆盖文件,这样是不安全的应当选择off。
</Anonymous> 是否建立匿名FTP站点。除非需要请删除这个选型。
DisplayLogin welcome.msg 设置ftp登陆欢迎信息文件。
    3.配置实例

建立一个单机(standalone)模式的FTP 服务器
建立配置文件如下:
ServerName “FTP Server”
ServerType standalone
DefaultServer on
Port 21
Umask 027
MaxInstances 30
User nobody
Group nogroup
<Directory /*>
AllowOverwrite off
</Directory>
使用su命令切换为root用户。
在/etc/rc.d/init.d目录中安装启动脚本:cp ./contrib/dist/rpm/proftpd.init.d /etc/rc.d
/init.d/proftpd
添加一个新组:groupadd nogroup。
建立符号链结让FTP 服务器随启动自动启动:ln -/etc/rc.d/init.d/proftpd /etc/rc.d/rc3.d/S95proftpd
测试连接情况:从客户端测试proftpd是否正常运行:

C:WINDOWS>ftp 192.168.2.33
Connected to 192.168.2.33.
220 ProFTPD 1.2.0rc3 Server (ProFTPD Default Installation)[ftpd.test.com.cn]
User (192.168.2.33:(none)): ideal
Password:
230 User ideal logged in.
ftp>
ProFTPD的控制命令:/etc/rc.d/init.d/proftpd stop 关闭服务器
                       /etc/rc.d/init.d/proftpd start 启动服务器
                       /etc/rc.d/init.d/ proftpd reload 重新加载修改后的配置文件etc/proftpd.conf并且启动服务器。
    4.建立一个 安全的匿名ProFTPD站点

    如果人们只需要从FTP服务器等到一些小文件(几兆),可以使用Apache web服务器代替匿名FTP站点。如果要通过一个匿名账号频繁上传、下载文件,就要建立一个安全的ProFTPD服务器。下面是配置文件/etc /proftpd.conf内容(其中incoming目录容许用户上传文件):
<Anonymous ~ftp>
User ftp
Group ftp
RequireValidShell off
UserAlias anonymous ftp
MaxClients 40
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
<Directory incoming>
<Limit WRITE>
AllowAll
</Limit>
<Limit READ>
DenyAll
</Limit>
</Directory>
</Anonymous>

    根据以上内容建立的ProFTPD服务器会为自动连接到匿名ProFTPD服务器的用户创建一个chroot限制,用户的主目录为站点的根目录。下面解释主要配置指令的作用:
User 和 Group:这两个指令确保User ftp和Group ftp拥有所有匿名会话。
RequireValidShell:由于在/etc/passwd中没有用户FTP的有效列表,所以该指令说明ProFTPD允许User ftp的匿名会话。
UserAlias:该指令把anonymous赋予FTP账号,以便所有用户可以使用ftp和anonymous作为用户名登录匿名FTP服务器。
MaxClients:这里限制匿名连接数目是40,你可以根据系统负载设定连接数目。
<Directory>容器:这些容器给定目录的各种限制:
第一个目录容器对每个用户和每个目录禁止写权限(包括上传、删除和修改)。
第二个目录容器在incoming子目录中给每个用户写权限。
最后一个Limit指令确保在incoming子目录中上传文件的用户不能查看和恢复目录中的文件。
    5. 设定虚拟主机

可以通过指令:VirtualHost来实现虚拟主机,一个最简单的例子:
<VirtualHost 192.168.2.35>
ServerName "virtual FTP server"
</VirtualHost>
若你仅仅希望通过匿名访问某个虚拟主机,则使用如下的指令:

<Anonymous ~student>
User student
Group ftp
MaxClientsPerHost 1 "Sorry,This ftp only use one's IP connect!!"
AnonRequirePassword on
RateReadBPS 512000     “限制带宽最大速度”
RateReadFreeBytes 512000
RateReadHardBPS on
<Limit LOGIN /home/student/*>
Order allow,deny
Allow from 192.16.*.*   “限制IP登陆范围”
Deny from all
</Limit>
<Limit READ>   “设置/home/student用户可以读”
AllowAll
</Limit>
<Limit DELE>   “不能删除 文件”
DenyAll
</Limit>
<Limit RNFR>   “不可更名文件”
DenyAll
</Limit>
<Limit MKD>   “不可建立文件目录”
DenyAll
</Limit>
</Anonymous>
Limit参数说明:
CWD :Change Working Directory,变换目录之意;
MKD :MaKe Directory,可建立目录与否;
RNFR :ReName FRom,可更改档名与否;
DELE :DELEt,可删除文件语法;
RMD :ReMove Directory,可移除目录与否;
RETR :RETRieve,下载之意由服务器传送数据到客户端;
READ :可读取与否 ;
WRITE:可写入与否 ;
STOR :STORe,上传之意,由客户端传送数据到服务器;
ALL :允许全部的动作;
6.在图形界面下控制ProFTPD

    GProftpd一个GNOME桌面环境下的ProFTPD标准克隆,基本上能实现命令行模下的所有的功能。使用之后,在看配置文件,顿有拔云见山之感 。因为ProFTPD可设定的功能太多了,初学者不太可能完全背下所有功能及相关的设定。也因为如此,许多人退而选择使用ProFTPD的预设设定值。但 这么一来,ProFTPD的强大功能被弃之不用,相当可惜。如果有一套 软件, 可以辅助管理员进行ProFTPD的设定动作,相信这些问题便可以迎刃而解了。GProFTPD便是一套以GTK+图形界面下发展的帮助管理员在 GNOME环境下进行ProFTPD设定工作ProFTPD前端程序。GProFTPD并不只是一个设定工作的辅助程序而已。通过GProFTPD,管理 员可以进行FTP账号管理、文件传输动作的实时监控,还可以直接查看系统登入成功及失败的次数,提前了解是否有人正在对系统进行***动作。当然也可以进行 ProFTPD 服务器的服务启动、停止动作,也可以直接修改设定文件,或是决定系统重新启动的时间。几乎所有与ProFTPD相关的功能,都能使用GProFTPD直接进行,不必再担心看不懂配置的内容了。

    (1)下载安装:
    #Wget http://mange.dynalias.org/linux/gproftpd/OLD/gproftpd-8.2.4.tar.gz
    (2)系统要求:
    硬件: 中央处理器:兼容 Intel X86处理器PentiumII 400 以上 ,64 兆(推荐128兆) 内存,150兆以上 硬盘空间 ,显示内存4兆。软件: 内核版本基于2.4或以上 ,GNOME 1.2以上,桌面分辨率 至少为640×480 ,桌面颜色至少6万5千色(16位元)。

    (3)安装前的准备工作:
    安装过程中需要编译所以需要GCC(2.96以上)和Qt(2.0以上)、GTK支持,所以要使用RPM来确认: rpm -qa | grep gcc;rpm -qa | grep qt;rpm -qa | grep gtk

    (4)命令行下安装软件
gunzip gproftpd-8.2.4.tar.gz
tar vxf gproftpd-8.2.4.tar
cd gproftpd-8.2.4
./configure;make;make install
    (5)运行软件:
    打开一个终端运行命令:“/usr/sbin/gproftpd” 服务器(Sever)主工作界面如图1。        
75740.JPG
图1 gproftpd 主工作界面
   
     
    在图1主工作界面 我们可以设置FTP服务器IP地址,查看FTP服务器运行情况等信息。下面看看 安全(Secunity)界面见图2。
75742.JPG
图2 gproftpd 安全界面

    这里我们可以看到FTP的登录用户情况。在用户界面(users)可以设置用户登录密码、登录目录以及最大并发连接等见图3 。
75744.JPG
图3 用户设置界面

    接着可以查看磁盘(disk)界面。这里可以监控磁盘使用情况,避免恶意用户用垃圾数据塞满你的硬盘。见图4。
75746.JPG
图4 磁盘使用情况
 
   【IT168 专稿】在上篇文章中( 点击查看),介绍了ProFTPD 服务器的基本配置方法,本文继续介绍如何加固ProFTPD 服务器
二、 基本加固ProFTPD服务器步骤
   1.升级版本
    升级陈旧的ProFTPD版本,因为早期的ProFTPD版本存在的 安全漏洞。对于一个新配置的ProFTPD服务器来说使用最新稳定版本是最明智的选择,可以在其官方网站下载其源代码进行编译。ProFTPD最新版本是1.3.0,官方网址: http://www.ProFTPD.org
   2.理解ProFTPD服务器运行方式
    守护进程(Daemon)定义:是在计算机启动时就被运行的,并在系统中持续 运行的进程, 它等待着随时为客户提供自身负责的服务。守护进程的工作就是打开一个端口,并且等待(Listen)进入的连接。 如果客户提请了一个连接,守护进程就创建(fork)子进程来响应此连接, 而父进程继续监听更多的服务请求。正因为如此,每个守护进程都可以处理多个客户服务请求。ProFTPD能以Stand-alone、xinetd两种模 式运行。首先我们要理解这两个模式的含义。
    (1)Stand-alone(运行独立)守护进程
    Stand-alone(独立运行)守护进程由init脚本负责管理,所有独立运行的守护进程的脚本在/etc/rc.d/init.d/目录下。系统服 务都是独立运行的守护进程包括:syslogd和cron等。运行独立的守护进程工作方式称作:stand-alone。它Unix传统的C/S模式的访 问模式。服务器监听(Listen)在一个特点的端口上等待客户端的联机。如果客户端产生一个连接请求,守护进程就创建(Fork)一个子服务器响应这个 连接,而主服务器继续监听。以保持多个子服务器池等待下一个客户端请求。stand-alone模式工作原理见图5。
84799.jpg
图5 stand-alone工作模式

    工作在stand-alone模式下的 网络服 务有route、gated。另外是大家最熟悉是Web服务器:Apache和邮件服务器Sendmail、域名服务器Bind。因为这些负载很大服务器 上,预先创子服务器,可以通过客户的服务速度。在Linux系统中通过stand-alone工作模式启动的服务由/etc/rc.d/下面对应的运行级 别当中的符号链接启动。
2)xinetd模式
    从守护进程的概念可以看出,对于系统所要通过的每一种服务,都必须运行一个监听某个端口连接所发生的守护进程,这通常意味着资源浪费。为了解决这个问题,Linux引进了“ 网络守护进程服务程序”的概念。Redhat Linux 9.0使用的网络守护进程是xinted(eXtended InterNET daemon)。和stand-alone模式相比xinted模式也称 Internet Super-Server(超级 服务器)。xinetd能够同时监听多个指定的端口,在接受用户请求时,他能够根据用户请求的端口不同,启动不同的网络服务进程来处理这些用户请求。可以把xinetd看做一个管理启动服务的管理 服务器,它决定把一个客户请求交给那个程序处理,然后启动相应的守护进程。xinetd模式工作原理见图6。
84805.jpg
图6 xinetd工作模式

    和stand-alone工作模式相比,系统不想要每一个网络服务进程都监听其服务端口。运行单个xinetd就可以同时监听所有服务端口,这样就降低了 系统开销,保护系统资源。但是对于访问量大、经常出现并发访问时,xinetd想要频繁启动对应的网络服务进程,反而会导致系统性能下降。察看系统为 Linux服务提供那种模式方法在Linux命令行可以使用pstree命令可以看到两种不同方式启动的网络服务。一般来说系统一些负载高的服 务:sendmail、Apache服务是单独启动的。而其他服务类型都可以使用xinetd超级服务器管理。守护进程的分类:系统守护进程:如atd、 crond、lpd、syslogd、login等。网络守护进程:如sshd、httpd、sendmail、xinetd等。
    查看目前运行的守护进程树可以使用命令:“pstree”。pstree指令用ASCII字符显示树状结构,清楚地表达程序间的相互关系。如果不指定程序 识别码或用户名称,则会把系统启动时的第一个程序视为基层,并显示之后的所有程序。若指定用户名称,便会以隶属该用户的第一个程序当作基层,然后显示该用 户的所有程序。主要命令选型:

-a  显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。
-c  不使用精简标示法。
-G  使用VT100终端机的列绘图字符。
-h  列出树状图时,特别标明现在执行的程序。
-H<程序识别码>  此参数的效果和指定"-h"参数类似,但特别标明指定的程序。
-l  采用长列格式显示树状图。
-n  用程序识别码排序。预设是以程序名称来排序。
-p  显示程序识别码。
-u  显示用户名称。
-U  使用UTF-8列绘图字符。
pstree 输出界面见图7()内是进程号。
84807.JPG
图7 pstree 输出界面

    xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和 安全。xinetd(eXtended InterNET services daemon)提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。它能提供以下特色:
  • 支持对tcp、ucp、RPC服务(但是当前对RPC的支持不够稳定) 。
  • 基于时间段的访问控制 。
  • 功能完备的log功能,即可以记录连接成功也可以记录连接失败的行为。
  • 能有效的防止DoS***(Denial of Services) 。
  • 能限制同时运行的同意类型的服务器数目 。
  • 能限制启动的所有服务器数目 。
  • 能限制log文件大小 。
  • 将某个服务绑定在特定的系统接口上,从而能实现只允许私有网络访问某项服务 。
  • 能实现作为其他系统的代理。如果和ip伪装结合可以实现对内部私有网络的访问。
    原则上任何系统服务都可以使用xinetd,然而,我认为,最适合应该是哪些常用的internet服务,同时,这个服务的请求数目和频繁程度不会太高。 象DNS和Apache就不适合采用这种方式,而象Ftp、telnet、 SSH等就很适合使用xinetd方式,系统默认使用xinetd的服务可以分为如下几类:
  1、标准internet服务:telnet ftp
2、信息服务:finger netstat systat
3、邮件服务:imap imaps pop2 pop3 pops
4、RPC服务:rquotad rstatd rusersd sprayd walld
5、BSD服务:comsat exec login ntalk shell talk
6、内部服务:chargen daytime echo servers services time
7、安全服务:irc
8、其他服务:name uucp
Red Hat 中xinetd 的配置文件:主配置文件:/etc/xinetd.conf,每一个由xinetd启动的服务在目录/etc/xinetd.d/下都有一个以服务名称命 名的配置文件。在主配置文件/etc/xinetd.conf中将/etc/xinetd.d目录下的所有文件的内容使用 includedir /etc/xinetd.d语句包含进来。xinetd的配置选项见表-1。
84811.jpg
表 1. xinetd的指示符

    xinetd能有效的防止拒绝服务***(Denial of Services)原理:
    (a)限制同时运行的进程数:

    通过设置instances选项设定同时运行的并发进程数:
instances=20
    当 服务器被请求连接的进程数达到20个时,xinetd将停止接受多出部分的连接请求。直到请求连接数低于设定值为止。
    (b)限制一个IP地址的最大连接数:

    通过限制一个主机的最大连接数,从而防止某个主机独占某个服务。
per_source=5
    这里每个IP地址可以连接单个IP地址的连接数是5个。

    (c)限制负载:

    xinetd还可以使用限制负载的方法防范拒绝服务***。用一个浮点数作为负载系数,当负载达到这个数目的时候,该服务将暂停处理后续的连接:
max_load = 2.8
    上面的例子中当一项系统负载达到2.8时,所有服务将暂时中止,直到系统负载下降到设定值以下。说明要使用这个选项,编译时要加入--with- loadavg ,xinetd将而已处理max-load配置选项。从而在系统负载过重时关闭某些服务进程,来实现某些拒绝服务***。

    (d)限制所有 服务器数目(连接速率):

    xinetd可以使用cps选项设定连接速率,下面的例子:
cps = 25 60
    第一个参数表示每秒可以处理的连接数,如果超过了这个连接数之后进入的连接将被暂时停止处理;第二个参数表示停止处理多少秒后继续处理先前暂停处理的连接。即服务器最多启动25个连接,如果达到这个数目将停止启动新服务60秒。在此期间不接受任何请求。
   3.尽量使用xinetd方式运行ProFTPD服务器
    ProFTPD能以Stand-alone、xinetd两种模式运行。当用户账号比较少又经常需要连接到ProFTPD 服务器时推荐使用xinetd模式运行。使用xinetd方式运行ProFTPD可以有效防范DoS***。使用xinetd方式运行ProFTPD的步骤:
    (1)检查确省运行情况

    确省情况下ProFTPD以stand-alone工作模式运行,可以使用“ps aux| grep proftpd”命令查看进程号,然后使用kill命令中止运行。

    (2)修改配置文件

    修改/etc/proftpd.conf文件的ServerType选项由“standalone”改为“inetd”。

    (3)建立用户组

    groupadd nogroup
    (4)创建配置文件/etc/xinetd.d/proftpd,代码如下:

service ftp
{
flags = REUSE
socket_type = stream   “服务的数据封包类型为stream”
instances = 30           “最多可以同时建立30个ftp连接。”
max_load = 3.0        “最大负载“
wait = no         “不需等待,即ftp服务将以多线程的方式运行”
user = root         “执行此服务进程的用户是root”
server = /usr/local/sbin/proftpd “启动脚本位置”
log_on_success = HOST PID
log_on_failure = HOST RECORD
disable = no   “允许运行proftpd”
}

    (5)重新启动xinetd配置

    killall -USR1 xinetd

    (6)使用命令连接服务器

    可以使用“ftp localhost”连接本地服务器,如果连接被拒绝,可以使用命令:
    tail -f /var/log/messages查看错误信息。
 
教你配置安全的ProFTPD服务器(下)
 
四、其他安全策略
    1.隐藏ProFTPD服务器版本信息
    通常 软件的BUG信息是和特定版本相关的,因此版本号是***寻求最有价值的信息。隐藏ProFTPD版本号比较简单,修改配置文件:/etc/Proftpd.conf:
ServerIdent off
   2.伪装ProFTPD服务器
    Windows下的FTP服务多是Serv-U,可以把ProFTPD伪装为Serv-U,方法是修改配置文件proftpd.conf,添加如下内容:
ServerIdent on \"Serv-U FTP Server v5.0 for WinSock ready...\"
存盘退出后,重新启动proftpd服务,登录到修改了提示信息的FTP服务器进行测试:
C:\\>ftp 192.168.0.1
Connected to 192.168.0.1.
220 Serv-U FTP Server v5.0 for WinSock ready...
User (192.168.0.1:(none)):
331 Password required for (none).
Password:
530 Login incorrect.
Login failed.
ftp > quit
221 Goodbye.
    这样从表面上看,服务器就是一个运行着Serv-U的Windows了。

     3. 使用非root权限运行ProFTPD
    以非root权限运行ProFTPD 。修改配置文件:/etc/Proftpd.conf:
User nobody      #设置FTP服务以nobody运行
Group nogroup        #注意:原来是“Group nobody”,一定要改为“Group nogroup ”
上面的配置表示以nobody用户身份运行ProFTPD服务器 。使用nobody身份运行能够降低缓冲区溢出***所带来的危险。
    4.监控ProFTPD服务器运行情况
   通常新部署一个ProFTPD服务器之后需要进行一段时间的监控:记录FTP连接记录、谁连接到我的FTP服务器。Proftpd本身附带了几个命令可以使用。
    (1) 记录FTP连接数
    使用usr/local/bin/ftpcout命令,可以显示FTP服务器连接用户数量信息。 我们还可以使用watch命令配合使用,运行下面命令:
watch -n 360 /usr/local/bin/ftpcount
    这个命令每三百六十秒显示一次连接用户数量的信息。
    (2) 查找谁与FTP服务器连接
    使用usr/local/bin/ftpwho命令可以显示谁连接到FTP服务器。一个简单的输出如下:
Master proftpd process 8322:
8387 0m1s proftpd: sheila - reboot.intevo.com: IDLE
8341 3m59s proftpd: kabir - k2.intevo.com: IDLE
- - 2 users
    以上输出显示有两个用户(sheila和kabir)从不同的计算机连接到FTP服务器,输出内容还包括:为这些用户服务的ProFTPD的进程和主ProFTPD的进程ID。
5.修改配置文件服务器
    ProFTPD使用的配置文件和Apache类似:
    单线指令:ServerName 和 ServerType
    多线容器指令:<Directory>和 <Limit>
    如果以前配置过Apache的话,会很容易掌握。Proftpd 服务器配置文件etc/Proftpd.conf中的许多选项可以加固服务器。
    (1)通过IP地址限制FTP访问
    假设要允许主机名称myhost.domain.com访问FTP服务器,首先使用命令:
Ping myhost.domain.com
假设等到IP地址是:216.112.169.138。下面修改配置文件,加入以下内容:
<Limit LOGIN>
Order Allow, Deny
Allow from 216.112.169.138
Deny from all
</Limit>
    注意不要在Allow命令后直接使用主机名称,因为检查主机名称会降低服务器的运行速度。另外主机名称比IP地址更具有欺骗性。如果 myhost.domain.com没有固定IP地址,主机用户在下一次从ISP获得一个IP地址时就无法和FTP服务器连接。这时必须给整个 网络授予FTP访问的权限。命令如下:“Allow from 216.112.169.” 。
    (2)使用PAM作为ProFTPD授权用户的鉴别方法
    ProFTPD可以加入嵌入式认证模块,成为PAM-aware的FTP服务器。PAM全称:Pluggable Authentication Module (嵌入式认证模块)。它最初有SUN公司开发;很快被Linux社区的接受,并且开发了更多的模块。其目标是提供一套可用于验证用户身份的函数库,从而将 认证从应用程序开发中独立出来。Linux-PAM处理四种独立的(管理)工作。它们是: 认证管理; 帐号管理; 会话期间管理;和密码管理。
    PAM工作方式:
(1)       调用某个应用程序,以得到该程序的服务。
(2)       PAM应用程序调用后台的PAM库进行认证工作。
(3)       PAM库在/etc/pam.d/目录中查找有关应用程序细节的配置文件,该文件告诉PAM,本应用程序使用何种认证机制。
(4)       PAM库装载所需的认证模块。
(5)       这些模块可以让PAM与应用程序中的会话函数进行 通信
(6)       会话函数向用户要求有关信息。
(7)       用户对这些要求做出回应,提供所需信息。
(8)       PAM认证模块通过PAM库将认证信息提供给应用程序。
(9)       认证完成后,应用程序做出两种选择:
*将所需权限赋予用户,并通知用户。
*认证失败,并通知用户。PAM工作流程见图8。
86859.JPG
图8 PAM工作流程

    下面手工建立一个/etc/pam.d/ftp文件包括以下内容:
%PAM-1.0
auth required /lib/security/pam_listfile.so item=user \
sense=deny file=/etc/ftpusers onerr=succeed
auth required /lib/security/pam_stack.so service=system-auth
auth required /lib/security/pam_shells.so
account required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
然后在配置文件/etc/Proftpd.conf加入两行:
AuthPAMAuthoritative on
AuthPAMConfig ftp
    这样ProFTPD服务器会自动把/etc/pam.d/ftp配置用于用户授权。这样用户连接到ProFTPD服务器时都由PAM使用/etc/pam.d/ftp文件进行认证。
    (3)对FTP用户使用chroot限制
    Unix(以及类Unix) 操作系统提 供了一种功能,让用户在重新映射的根文件系统中执行进程。chroot(更改根目录)命令会将根(/)文件系统的重新映射转换成相对于当前根目录的指定目 录,然后在新的根目录下执行指定的命令。ProFTPD服务器要限制普通FTP用户可以访问的目录,配置很简单,如果限制skate组的skate用户登 录时不能切换到其他目录,修改配置文件加入一行:
DefaultRoot ~ skate,skate
    这样他只能呆在自己的home目录中。警告: 正如在真实生活中一样,没有监牢是不可攻破的。使用网络常驻程序中任何已知的弱点,恶意的用户可以上载并执行刻意编制的程序代码,促使系统核心允许他们冲 破chroot,因而能够追踪其他不属于已更换根目录环境的进程,或者以你不会喜欢的方式来利用可用的设备。在chroot监牢中执行不 安全的常驻程序可挡住大多数利用该常驻程序来侵入服务器计算机的举动。不过,你不能企望chroot能让服务器完全安全!务必遵守其他步骤。
    (4)限制FTP命令特权
    *禁止一些用户创建和删除目录的特权
    如果发现一些用户有威胁行为,可以把他放在一个特定组中(badusers)使用如下的配置:
<Directory /*>
<Limit MKD RMD>
Order deny,allow
DenyGroup badusers
AllowAll
</Limit>
</Directory>
    这样除了那个特定的用户组之外,其他用户可以创建和删除目录。
   
    *建立只能上载的FTP服务器
    如果要建立一个只能上载的FTP服务器,在主服务器或者虚拟主容器中使用如下配置:
<Directory /*>
<Limit RETE>
DenyAll
</Limit>
</Directory>

    *限制对单个目录的访问。

<Directory /*>
<Limit CWD>
DenyAll
</Limit>
</Directory>
    这样相应的FTP用户就不能更改目录。如果使用DenyGroup groupname代替DenyAll ,将配置范围限定在/etc/group文件中定义的groupname用户组中。

    *限制目录浏览特权
<Directory /my/mp3s>
<Limit DIRS>
DenyGroup newfriends
</Limit>
</Directory>
以上配置可以限制/my/mp3s目录中名为newfriends组的目录浏览特权。这样可以防止他得到/my/mp3s目录的列表。
    (5)控制FTP命令缓冲区大小
    许多***通过发送一个大尺寸的命令***FTP服务器,希望造成服务器缓冲区溢出。可以在使用CommandBufferSize命令可以限制客户端命令长度。通常设定为512。
    (6)修改ProFTPD服务器使用端口
    ProFTP如果使用Stand-alone模式,可以通过设置proftpd.conf来控制它。使用不同端口的设置也较为简单,只需在proftpd.conf中将“Port xx”改为需要的值即可。

    (7)使不同用户之间相互隔离
    一些用户通常访问ISP的FTP服务器时,会看到一些不应当的系统信息,因此隐藏这些信息是必要的,下面是一个配置:
DefaultRoot “/www”
<Directory /www>
HideNoAccess on
<Limit ALL>
IgnoreHidden on
</Limit>
</Directory>
HideNoAccess指令将用户隐藏/www 目录下的所有条目,IgnoreHidden指令指示ProFTPD 服务器忽略用户所有指令。
    (8)简化配置文件
    对于初学者来说看到大量的配置文件和注释时反到会感到不知所措。如果/etc/group 中定义了一个novices的组,希望组用户可以在 /ftp/download目录中上传和下载,可以如下配置proftpd.conf :
<Directory /ftp/download>
<Limit READ>
AllowGroup novices
</Limit>
<Limit WRITE>
DenyGroup novices
</Limit>
</Directory>
<Directory /ftp/upload>
<Limit READ>
DenyGroup novices
</Limit>
<Limit WRITE>
AllowGroup novices
</Limit>
</Directory>
五、加密FTP服务器与客户端连接
    传统的 网络服务程序FTP在本质上都是不 安全的,因为它们在网络上用明文传送口令和数据,嗅探器非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到“中间 服务器”(server- in-the-middle)这种方式的***。所谓“中间服务器”的***方式,就是“中间服务器”冒充真正的服务器接收你传给服务器的数据,然后再冒充你 把数据传给真正的服务器。服务器和你之间的数据传送被“中间服务器”转手后做了手脚之后,就会出现很严重的问题。虽然近年来出现了很多种ftp的替代服 务,例如ssh加密通道的sftp/scp,或使用IPSEC协议的×××通道等等,但是在大多数情况下,ftp的通用性和易用性使得它在很长一段时间内 必然无法被完全取代。所以如同其他一系列古董服务(例如SMTP/HTTP)一样,近年来也出现了一些不需要对ftp协议自身做完全更改的协议扩展模块, 能够良好的完成兼容性和功能扩展。ftp SSL/TLS Extension就是其中一种方式。
    SSL/TLS协议,SSL(Secure SocketLayer)最早是netscape公司设计的用于HTTP协议加密的安全传输协议,SSL工作于TCP协议的传输层(TCP层)和应用程序 之间。作为一个中间层,应用程序只要采用SSL提供的一套SSL套接字API来替换标准的Socket套接字,就可以把程序转换为SSL化的安全网络程 序,在传输过程中将由SSL协议实现数据机密性和完整性的保证。SSL协议的当前版本为3.0,当SSL取得大规模成功后,IETF( www.ietf.org)将SSL作了标准化,规范为RFC2246,并将其称为TLS(TransportLayerSecurity)。从技术上讲,TLS1.0与SSL3.0的差别非常微小,SSL由于其历史应用的原因在当前的商业应用程序之中使用得更多一些。
下面配置支持TLS的ProFTPD服务器。
   1.首先配置文件

# ./configure --with-modules=mod_tls \
--with-modules=mod_sql:mod_sql_mysql \
--with-includes=/usr/local/include \
--with-libraries=/usr/local/lib/mysql
# make;# make install

   2. 接下来制作凭证
# 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
    3.制作最高层认证中心 (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
制作服务器用的凭证
Private Key ( Public Key )
# 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

   4.用最高层认证中心签发凭证

# 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
    5. 接下来设定/usr/local/etc/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 >
    使用支持TSL技术的客户端连接FTP服务器。到此为止服务器端安装设置完毕,登陆服务器的客户端使用FlashFXP , FlashFXP由于安装使用的文章比较多,所以本文就不详细介绍了。其他支持TLS连接的客户端很多windows环境下的FileZilla、 UltraFXP,Linux环境下的C-kermit 8.0( http://www.columbia.edu/kermit/ck80.html ),fireftp(firefox浏览器的ftp插件下载链接: http://releases.mozilla.org/pub/mozilla.org/extensions/fireftp/fireftp-0.94.2-fx.xpi )和lftp( http://lftp.yar.ru/ )。
    lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常想一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。
    命令行语法
lftp [OPTS] <site>
`lftp' 是在 rc 文件执行后 lftp 执行的第一个命令
-f <file>           执行文件中的命令后退出
-c <cmd>            执行命令后退出
--help              显示帮助信息后退出
--version           显示 lftp 版本后退出
其他的选项同 `open' 命令
-e <cmd>            在选择后执行命令
-u <user>[,<pass>] 使用指定的用户名/口令进行验证
-p <port>           连接指定的端口
<site>              主机名, URL 或书签的名字
    如果在命令行中输入的站点名称,lftp将直接登录站点,如果在命令行不输入站点名称,则必须在进入到lftp界面后用open命令打开 。
    更多可以支持TSL的FTP客户端查看列表: http://www.ford-hutchinson.com/~fh-1-pfh/ftps-ext_col.html
    这样我们就成功的为FTP增添了TSL加密连接.而一个比较完整安全的FTP站点也配置完成了 。

 
网友评论: