鸟哥的 Linux 私房菜 -- very secure FTP (vsftp) server

since2012/04/23

     
 
简易 vsftpd 服务器设定
本文已不再维护,更新文章请参考此处
最近更新日期:2003/09/04
既然说 FTP 真的很危险,那么不要开启也罢!不过,偏偏很多时候我们又得使用到 FTP 的功能。这个时候选择一个比较安全的 FTP 服务器软件就很重要啦!除了 proftpd 可以取代 Wu FTP 之外,另一个蛮安全的 vsftpd 也可以用来取代喔!这个章节我们就来谈一谈 vsftpd 的设定吧!


大标题的图示前言
    除了 proftpd 之外,事实上,这个 vsftpd 也是一个很好的 FTP 服务器软件喔!为什么这么说呢?因为 vsftpd 全名是『very secure FTP daemon』的意思,所以他的发展本来就是以安全性为考虑来发展这个套件的。vsftpd 在安全性的考虑上面,主要针对了『程序的权限, privilege』概念来设计的,因为我们的任何服务在 Linux 上面运作时都会取得一个 PID,而这个 PID 是有拥有者的身份的,也就是说,这个服务的 PID 在我们的 Linux 上面是具有某些『权限』的。万一这个服务的 PID 所属拥有者的身份等级太高,例如 root 的权限,那么如果不幸该 PID 有些设计上的漏洞,使得该 PID 被入侵的话,入侵者将具有该 PID 的权限,也就是 root 的身份喔!所以,近来发展的套件都会尽量的将服务取得的 PID 权限降低,使得该服务即使不小心被入侵了,入侵者也无法得到有效的系统管理权限,这样会让我们的系统较为安全的啦。
     
    除了上面这个权限的设计之外, vsftpd 也利用 chroot 这个软件的辅助,来让登入者仅能于一些较不重要的目录当中活动,而无法使用 Linux 系统全部的功能。所谓的 chroot 这个函数,最主要的功能就是『改变根目录的所在 ( change root directory )』了!举例来说,如果您想要让使用者登入 A 服务后,且执行任何指令都是在 /tmp/pub 目录下,并限制用户使用 A 服务时都只能在 /tmp/pub 目录下,那么使用『 chroot /tmp/pub command 』就能够让 /tmp/pub 变成 A 服务的根目录『/』了!如此一来,使用者就无法离开 /tmp/pub ,那么万一我们 A 服务的 PID 还是被入侵时,没有关系,入侵者还是仅能在 /tmp/pub 里面跑来跑去而已,而无法使用 Linux 的完整功能。这个时候,自然我们的系统也就会比较安全啦!
     
    vsftpd 是基于上面的说明来设计的一个较为安全的 FTP 服务器软件,他具有底下的特点喔:
     
    • vsftpd 是以一般身份启动服务,所以对于 Linux 系统的权限较低,对于 Linux 系统的危害就相对的减低了。此外, vsftpd 亦利用 chroot() 这个函式进行改换根目录的动作,使得系统工具不会被 vsftpd 这支服务所误用;
    • 任何需要具有较高执行权限的 vsftpd 指令均以一支特殊的上层程序 ( parent process ) 所控制 ,该上层程序享有的较高执行权限功能已经被限制的相当的低,并以不影响 Linux 本身的系统为准;
    • 所有来自 clients 端,想要使用这支上层程序所提供的较高执行权限之 vsftpd 指令的需求,均被视为『不可信任的要求』来处理,必需要经过相当程度的身份确认后,方可利用该上层程序的功能。例如 chown(), Login 的要求等等动作;
    • 此外,上面提到的上层程序中,依然使用 chroot() 的功能来限制用户的执行权限。
     
    由于具有这样的特点,所以 vsftpd 会变的比较安全一些咯!
     
    另外,要架设 vsftpd 之前,还是请您得先要针对 FTP 的主动联机、被动联机以及 port 21, 20 这两个指令信道与数据信道的基础有一定程度的认识喔,会比较容易进入状况,所以,还是回到前面的 Wu FTP 那一张节,将前言的部分看完才好吶!我这里假设您已经具有 FTP 的相关知识了,所以底下就直接来进行 vsftpd 的安装与设定吧!

大标题的图示套件安装:

    以 RPM 安装
     
    在目前新版的 Red Hat 9 主要的 FTP 服务器软件就是 vsftpd 这个玩意儿!所以您可以拿出光盘里面的 vsftpd 来直接以 RPM 安装即可!如果您的 Linux distribution 没有提供 vsftpd 的话,没有关系,我们也可以使用底下的 Tarball 的方式来安装吶!
     

    以 Tarball 安装
     
    要以 Tarball 安装,当然得先下载 Tarball 的档案了!vsftpd 的官方网站下载点为: 您可以自行找寻自己喜欢的版本来安装。我这里以 1.2.0 这一版来安装 vsftpd 在我的 Mandrake 9.0 上面喔!(注:如果是 Red Hat 的系统,原本就有 vsftpd 了,所以使用 RPM 安装比较好!至于其他没有提供 vsftpd RPM 档案的 distribution 就可以使用 Tarball 咯!)
     
    1. 下载与解压缩:
    [root@test root]# wget \
    > ftp://vsftpd.beasts.org/users/cevans/vsftpd-1.2.0.tar.gz
    [root@test root]# cd /usr/local/src
    [root@test root]# tar -zxvf /root/vsftpd-1.2.0.tar.gz
    [root@test root]# cd vsftpd-1.2.0/
    # 在这个目录下有个 INSTALL 与 README 请务必察看喔!
     
    2. 开始编译与安装
    # vsftpd 默认安装的路径为:
    # 所有可执行文件放置在 /usr/local/sbin 里面;
    # man page 放置在 /usr/local/man/man5 与 /usr/local/man/man8
    # 若 super daemon 为 xinetd 时,会复制一份启动档案到 /etc/xinetd.d 去!
    [root@test vsftpd-1.2.0]# make
    # 编译的过程可能有 warning 的讯息,只要不是 Error 就可以不理他!
    [root@test vsftpd-1.2.0]# make install
    [root@test vsftpd-1.2.0]# cp vsftpd.conf /etc
    # 将 PAM 身份认证模块给他放进去系统里面!
    [root@test vsftpd-1.2.0]# cp RedHat/vsftpd.pam /etc/pam.d/vsftpd
    # 建立 ftp 这个用户以及他的家目录:
    # 若本来就存在 ftp 这个使用者,那就不需要进行新增!
    [root@test vsftpd-1.2.0]# useradd -M ftp -d /var/ftp
    [root@test vsftpd-1.2.0]# mkdir -p /var/ftp
    [root@test vsftpd-1.2.0]# chown root:root /var/ftp
    [root@test vsftpd-1.2.0]# chmod 755 /var/ftp
    # 建立 vsftpd 需要的特殊目录
    [root@test vsftpd-1.2.0]# mkdir -p /usr/share/empty
     
    3. 如果需要移除时:
    # 如果想要移除 vsftp 时,可以这样做
    [root@test vsftpd-1.2.0]# rm /usr/local/sbin/vsftpd
    [root@test vsftpd-1.2.0]# rm /usr/local/man/man5/vsftpd.conf.5
    [root@test vsftpd-1.2.0]# rm /usr/local/man/man8/vsftpd.8
    [root@test vsftpd-1.2.0]# rm /etc/xinetd.d/vsftpd
    [root@test vsftpd-1.2.0]# rm /etc/vsftpd.conf
    # 因为刚刚安装只有安装这几个档案而已说!所以啦, vsftpd 真的是挺安全的说!
     
    4. 测试:
    # 先确认一下 xinetd.d 有没有问题再说:
    [root@test root]# vi /etc/xinetd.d/vsftpd
    service ftp
    {
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/local/sbin/vsftpd
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
         disable                 = no
    }
    [root@test root]# /etc/rc.d/init.d/xinetd restart
    [root@test root]# ftp localhost
    ftp localhost
    Connected to localhost.
    220 (vsFTPd 1.2.0)
    530 Please login with USER and PASS.
    530 Please login with USER and PASS.
    KERBEROS_V4 rejected as an authentication type
    Name (localhost:root): anonymous
    # 这样就表示 vsftpd 已经可以正确的启动了,不过因为我们还没有设定好
    # /etc/vsftpd.conf ,所以会有无法登入的问题!没关系,
    # 等一下设定好就 OK 了!
     
    安装的过程真的是很简单,不过, vsftpd.conf 这个档案放置的地点在 RPM 与 Tarball 则可能有点不一样,需要给他特别留意呢!例如 Red Hat 9 预设放置在 /etc/vsftpd/vsftpd.conf ,而 Tarball 则预设放置在 /etc/vsftpd.conf 里面说!

大标题的图示Server 端的设定
    其实在 Server 端的设定蛮容易的,因为整个 vsftpd 的配置文件几乎可以说只有一个,那就是 vsftpd.conf 这个档案了。底下我们就来谈一谈整个 vsftpd 的套件结构与如何设定编辑 vsftpd.conf 这个配置文件吧! ^_^
     

    vsftpd 的套件结构
     
    vsftpd 的套件结构很简单,配置文件与执行档实在是不多,无论如何,我们还是得要了解一下:
     
    • /etc/vsftpd.conf 或 /etc/vsftpd/vsftpd.conf:这个就是 vsftpd 的主要配置文件了!也是等一下我们要设定的主要项目说。在这个配置文件里面,所有的设定项目都是以『参数=设定值』来设定的,注意一下,等号两边没有空白喔!至于 vsftpd.conf 的详细说明,其实在 vsftpd.conf 里面就已经相当的清晰了,如果还想要有其他的支持,可以使用『man 5 vsftpd.conf』来查阅喔!

    •  
    • /etc/pam.d/vsftpd 与 /etc/ftpusers 或 /etc/vsftpd.ftpusers:这个与 Wu FTP 是相同的作用啦!利用 pam 模块来进行身份确认的动作说!那么怎么知道使用 /etc/vsftpd.ftpusers 或 /etc/ftpusers 呢?看 /etc/pam.d/vsftpd 的内容即可!
    • [root@test root]# vi /etc/pam.d/vsftpd
      #%PAM-1.0
      auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers onerr=succeed
      auth       required     pam_stack.so service=system-auth
      auth       required     pam_shells.so
      account    required     pam_stack.so service=system-auth
      session    required     pam_stack.so service=system-auth
      上面的斜体字是同一行,注意到斜体字那一行,可以发现 file="檔名" 那个档名就是『限制使用者无法使用 vsftpd 』的主要配置文件案啰!
       
    • /etc/vsftpd.chroot_list:这个档案不见得会使用到,且与实体用户有关!当我们在 vsftpd.conf 里面设定好了实体用户的用户没有被 chroot 到自己的家目录下(也就是用户登入后不只能到自己的家目录,还可以跳到其他目录),不过,某些使用者您想让他无法离开家目录时,默认在 /etc/vsftpd.chroot_list 这个档案里面,就可以将该使用者限制在自己的家目录内了!一行一个账号。

    •  
    • /etc/vsftp.banned_emails:这个档案与匿名登录有关,不过也不见得会用到!当您允许匿名者 (anonymous) 登入您的 FTP 主机,不过却不允许某些 email address 登入,那么就可以将该 email address 写入到这个档案里面去喔!

    •  
    • /usr/local/sbin/vsftpd 或 /usr/sbin/vsftpd:这就是 vsftpd 的主要执行档咯!不要怀疑, vsftpd 只有这一个执行档而已啊!

    •  
    • /var/ftp:这个是 vsftpd 的默认匿名者登入的根目录喔!

    •  
    大致上就只有这几个档案需要注意而已呢!
     

    vsftpd.conf 设定值说明
     
    vsftpd.conf 是 vsftpd 的主要配置文件案,在这里我们约略来说明一下常见的 vsftpd.conf 里面的各个设定参数吧!
     
    关于主机的设定值
    connect_from_port_20=YES (NO)
     还记得 wu ftp 那篇文章提到的,关于主动联机的 ftp-data 吗?
     这个设定项目在启动主动联机的 port 20 咯!
    listen_port=21
     使用的 vsftpd 命令通道的 port number 设定,如果您想要使用非
     正规的 ftp port,在这个设定项目修改吧!
    dirmessage_enable=YES (NO)
     当用户进入某个目录时,会显示该目录需要注意的内容,显示的
     档案预设是 .message ,当然,可以使用底下的设定项目来修订!
    message_file=.message
     当 dirmessage_enable=YES 时,可以设定这个项目来让 vsftpd 
     寻找该档案来显示讯息!您也可以设定其他档名喔!
    listen=YES (NO)
     若设定为 YES 表示 vsftpd 是以 standalone 的方式来启动的!
    pasv_enable=YES (NO)
     启动被动式联机(passive mode),一定要设定为 YES 的啦!
    use_localtime=YES (NO)
     是否使用主机的时间?!预设使用 GMT 时间(格林威治),会比台湾
     时间晚 8 小时,一般来说,建议设定为 YES 吧!
    write_enable=YES (NO)
     是否允许使用者具有写入的权限?!这包括删除与修改等功能喔!
    connect_timeout=60
     单位是秒,如果 client 尝试连接我们的 vsftpd 命令通道超过 60 秒,
     则不等待,强制断线咯。
    accept_timeout=60
     当使用者以被动式 PASV 来进行数据传输时,如果主机启用 passive port 
     并等待 client 超过60 秒,那么就给他强制断线!您可以修改 60 这个数值。
    data_connection_timeout=300
     如果 client 与 Server 间的数据传送在 300 秒内都无法传送成功,
     那 Client 的联机就会被我们的 vsftpd 强制剔除!
    idle_session_timeout=300
     如果使用者在 300 秒内都没有命令动作,强制脱机!
    max_clients=0
     如果 vsftpd 是以 stand alone 方式启动的,那么这个设定项目可以设定
     同一时间,最多有多少 client 可以同时连上 vsftpd 哩!?
    max_per_ip=0
     与上面 max_clients 类似,这里是同一个 IP 同一时间可允许多少联机?
    pasv_max_port=0
    pasv_min_port=0
     上面两个是与 passive mode 使用的 port number 有关,如果您想要使用
     65400 到 65410 这 11 个 port 来进行被动式资料的连接,可以这样设定
     pasv_max_port=65410 以及 pasv_min_port=65400
    ftpd_banner=一些文字说明
     当使用者无法顺利连上我们的主机,例如联机数量已经超过 max_clients 
     的设定了,那么 client 的画面就会显示『一些文字说明』的字样,您可以修改
     
    关于实体用户登入者的设定值
    guest_enable=YES (NO)
     若这个值设定为 YES 时,那么任何非 anonymous 登入的账号,均会被
     假设成为 guest (访客) 喔!
    local_enable=YES (NO)
     这个设定值必须要为 YES 时,在 /etc/passwd 内的账号才能以
     实体用户的方式登入我们的 vsftpd 主机喔!
    local_max_rate=0
     实体用户的传输速度限制,单位为 bytes/second, 0 为不限制。
    chroot_local_user=YES (NO)
     将使用者限制在自己的家目录之内(chroot)!这个设定在 vsftpd 
     当中预设是 NO,因为有底下两个设定项目的辅助喔!
     所以不需要启动他!
    chroot_list_enable=YES (NO)
     是否启用将某些实体用户限制在他们的家目录内?!预设是 NO ,
     不过,如果您想要让某些使用者无法离开他们的家目录时,
     可以考虑将这个设定为 YES ,并且规划下个设定值
    chroot_list_file=/etc/vsftpd.chroot_list
     如果 chroot_list_enable=YES 那么就可以设定这个项目了!他里面可以规定
     那一个实体用户会被限制在自己的家目录内而无法离开!(chroot)
     一行一个账号即可!
    userlist_deny=YES (NO)
     若此设定值为 YES 时,则当使用者账号被列入到某个档案时,在该档案内
     的使用者将无法登入 vsftpd 服务器!该档案文件名与下列设定项目有关。
    userlist_file=/etc/vsftpd.user_list
     若上面 userlist_deny=YES 时,则这个档案就有用处了!在这个档案内的
     账号都无法使用 vsftpd 喔!
     
    关于匿名者登入的设定值
    anonymous_enable=YES (NO)
     设定为允许 anonymous 登入我们的 vsftpd 主机!预设是 YES ,底下的所有
     相关设定都需要将这个设定为 anonymous_enable=YES 之后才会生效!
    anon_world_readable_only=YES (NO)
     仅允许 anonymous 具有下载可读档案的权限,预设是 YES。
    anon_other_write_enable=YES (NO)
     是否允许 anonymous 具有写入的权限?预设是 NO!如果要设定为 YES,
     那么开放给 anonymous 写入的目录亦需要调整权限,让 vsftpd 的 PID
     拥有者可以写入才行!
    anon_mkdir_write_enable=YES (NO)
     是否让 anonymous 具有建立目录的权限?默认值是 NO!如果要设定为 YES,
     那么 anony_other_write_enable 必须设定为 YES !
    anon_upload_enable=YES (NO)
     是否让 anonymous 具有上传数据的功能,默认是 NO,如果要设定为 YES ,
     则 anon_other_write_enable=YES 必须设定。
    deny_email_enable=YES (NO)
     将某些特殊的 email address 抵挡住,不让那些 anonymous 登入!
     如果以 anonymous 登入主机时,不是会要求输入密码吗?密码不是要您
     输入您的 email address 吗?如果你很讨厌某些 email address ,
     就可以使用这个设定来将他取消登入的权限!需与下个设定项目配合:
    banned_email_file=/etc/vsftpd.banned_emails
     如果 deny_email_enable=YES 时,可以利用这个设定项目来规定那个
     email address 不可登入我们的 vsftpd 喔!在上面设定的档案内,
     一行输入一个 email address 即可!
    no_anon_password=YES (NO)
     当设定为 YES 时,表示 anonymous 将会略过密码检验步骤,
     而直接进入 vsftpd 服务器内喔!所以一般预设都是 NO 的!
    anon_max_rate=0
     这个设定值后面接的数值单位为 bytes/秒 ,限制 anonymous 的传输速度,
     如果是 0 则不限制(由最大带宽所限制),如果您想让 anonymous 仅有 
     30 KB/s 的速度,可以设定『anon_max_rate=30000』
    anon_umask=077
     限制 anonymous 的权限!如果是 077 则 anonymous 传送过来的档案
     权限会是 -rw------- 喔!
     
    关于系统安全的设定值:
    ascii_download_enable=YES (NO)
     如果设定为 YES ,那么 client 就可以使用 ASCII 格式下载文件。
     一般来说,由于启动了这个设定项目可能会导致 DoS 的攻击,因此预设是NO。
    ascii_upload_enable=YES (NO)
     与上一个设定类似的,只是这个设定针对上传而言!预设是 NO。
    async_abor_enable=YES (NO)
     如果您的 FTP client 会下达 "async ABOR" 这个指令时,这个设定才需要启用
     一般来说,由于这个设定并不安全,所以通常都是将他取消的!
    check_shell=YES (NO)
     如果您想让拥有任何奇怪的 shell 的使用者(在 /etc/passwd 的 shell 字段)
     可以使用 vsftpd 的话,这个设定可以设定为 NO 喔!
    one_process_model=YES (NO)
     这个设定项目比较危险一点~当设定为 YES 时,表示每个建立的联机
     都会拥有一支 process 在负责,可以增加 vsftpd 的效能。不过,
     除非您的系统比较安全,而且硬件配备比较高,否则容易耗尽系统资源喔!
     一般建议设定为 NO 的啦!
    tcp_wrappers=YES (NO)
     当然我们都习惯支持 TCP Wrappers 的啦!所以设定为 YES 吧!
    xferlog_enable=YES (NO)
     当设定为 YES 时,用户上传与下载文件都会被纪录起来。记录档案
     与下一个设定项目有关:
    xferlog_file=/var/log/vsftpd.log
     如果上一个 xferlog_enable=YES 的话,这里就可以设定了!
     这个是登录档的档名啦!
    xferlog_std_format=YES (NO)
     是否设定为 wu ftp 相同的登录档格式?!预设为 NO ,因为登录档会比较容易读!
     不过,如果您有使用 wu ftp 登录文件的分析软件,这里才需要设定为 YES
    nopriv_user=nobody
     我们的 vsftpd 预设以 nobody 作为此一服务执行者的权限。因为 nobody 的权限
     相当的低,因此即使被入侵,入侵者仅能取得 nobody 的权限喔!
    pam_service_name=vsftpd
     这个是 pam 模块的名称,我们放置在 /etc/pam.d/vsftpd 即是这个咚咚!
     
    上面这些是相当常见的 vsftpd 的设定参数,还有很多参数我没有列出来,您可以使用 man 5 vsftpd.conf 查阅喔!不过,基本上上面这些参数已经够我们设定 vsftpd 啰!
     

    最简单的 vsftpd.conf 设定
     
    如果您很懒的去设定 vsftpd 的话,那么可以使用很简单的设定值来规划您的 FTP 服务器。底下就是 Red Hat 9 的预设 vsftpd 的设定值,您可以使用这样的设定值来启动您的 FTP 服务器即可。这样的设定值有几个用处:
     
    • 任何在 /etc/vsftpd.ftpusers 里面的使用者账号均无法使用 vsftpd 喔!
    • 开放 anonymous 与 实体用户 登入 vsftpd ;
    • 实体用户登入主机时,可以跳至任何具有登入权限的目录当中(没有 chroot );
    • 使用 port 20 作为主动联机时的 ftp-data 传送埠口;
    • 利用 /etc/hosts.allow(deny) 来管理登入权限;
    • 当 Client 上传/下载文件时,该信息会记录在 /var/log/vsftpd.log 里面;
    • 其他的设定均已默认值来规范(如被动式 port number 等等)。
     
    [root@test root]# vi /etc/xinetd.d/vsftpd
    service ftp
    {
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/local/sbin/vsftpd
            server_args             = /etc/vsftpd.conf
    # 上面这个请依照您的主机环境来设定!尤其是 server_args 请设定您的
    # vsftpd.conf 所在目录的完整文件名(含目录名称)!
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
            disable                 = no
    }
    [root@test root]# vi /etc/vsftpd/vsftpd.conf  # (或 /etc/vsftpd.conf)
    # 关于主机与安全性的设定
    use_localtime=YES
    dirmessage_enable=YES
    connect_from_port_20=YES
    xferlog_enable=YES
    xferlog_std_format=YES
    pam_service_name=vsftpd
    tcp_wrappers=YES
    # 关于 anonymous 的设定
    anonymous_enable=YES
    # 关于 real user 的设定
    local_enable=YES
    write_enable=YES
    local_umask=022
    userlist_enable=YES
    # 以上设定值的意义请往前翻到 vsftpd.conf 设定值的意义 章节去察看!
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    这样您的最简易的 FTP 服务器就已经设定完成了!简单的很吧!而且还相当的安全呢!
     

    针对仅有开放实体用户登入的设定
     
    好了,这里我们再使用其他的设定值来修正我们的 vsftpd.conf 这个配置文件。因为开放 anonymous 毕竟不太安全,所以我们将 anonymous 的登入权限关闭,并且仅让 real user (实体用户) 登入我们的 vsftpd 时,要如何设定呢?我的要求如下:
     
    • 使用台湾本地的时间而不是 GMT 时间;
    • 所有在 /etc/passwd 里面出现的实体账号均能登入 vsftpd 主机;
    • 但是系统账号 (如 root 等, UID 小于 500 的账号)均不能使用 vsftpd ;
    • 而且由于 badbird 与 nogoodbird 这两个账号使用者比较不乖,我要让这两个使用者被关在自己的家目录当中(chroot);
    • 并且限制数据的传输速度为 100 Kbytes/second;
    • 当用户进入 /home 这个目录时,显示:『一般用户家目录』的字样在 Client 端的屏幕上;
    • 使用者可以进行上传、下载以及修改档案等等动作。
     
    1. 基础配置文件
    [root@test root]# vi /etc/vsftpd/vsftpd.conf (或 /etc/vsftpd.conf)
    # 关于主机与安全性的设定
    use_localtime=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    pam_service_name=vsftpd
    tcp_wrappers=YES
    # 关于 anonymous 的设定
    anonymous_enable=NO
    # 关于 Real User 的设定
    local_enable=YES
    write_enable=YES
    local_umask=022
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd.chroot_list
    userlist_deny=YES
    userlist_file=/etc/vsftpd.user_list
    local_max_rate=100000
    # 以上设定值的意义请往前翻到 vsftpd.conf 设定值的意义 章节去察看!
     
    2. 限制实体用户在自己的家目录内 (chroot) 的配置文件
    [root@test root]# vi /etc/vsftpd.chroot_list
    badbird
    nogoodbird
    # 没有写到这个档案内的其他用户,就可以离开自己的家目录,
    # 而到其他目录里面去浏览了!
     
    3. 以 PAM 模块限制某些账号无法登入主机的设定:
    [root@test root]# vi /etc/pam.d/vsftpd
    # 会发现这样的字句:
    auth ..... file=/etc/vsftpd.ftpusers ....
    # 那个 file=.. 后面接的文件名就是以 PAM 模块抵挡的账号内容了!
    [root@test root]# vi /etc/vsftpd.ftpusers
    # 底下列出的账号将无法使用 vsftpd 喔!与 wu ftp 的 /etc/ftpusers 相同功能
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    news
    uucp
    operator
    games
    nobody
     
    4. 以 userlist_file 抵挡某些账号的登入:
    # 事实上,这个功能与上面的 PAM 功能相似啦!只是 PAM 是外挂的,而
    # 这个设定是 vsftpd 预设提供的就是了!
    [root@test root]# vi /etc/vsftpd.user_list
    # 这个档案的设定与上面 /etc/vsftpd.ftpusers 相同即可!
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    news
    uucp
    operator
    games
    nobody
     
    5. 设定进入目录时,显示的讯息:
    [root@test root]# vi /home/.message
    一般用户家目录
     
    6. 重新启动 xinetd 啰!
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    上面的设定里面有很多重复的地方,比方说 /etc/vsftpd.ftpusers 与 /etc/vsftpd.user_list 就是重复的设定了!不过,这样是比较安全啦!因为 PAM 模块是外挂的程序,而另一个档案则是 vsftpd 提供的功能!但是请特别留意,因为很多使用者可能会一不小心仅修改了其中一个档案,另一个档案则忘记修订,会很麻烦喔! ^_^!至于也是重点之一的 /etc/vsftpd.chroot_list 就可以将使用者限制在他们自己的家目录内了!设定上很容易吧!附带说明,上面的档名都与 vsftpd.conf 的设定有关
     
    看过了上面关于实体用户的设定之后,咦!那么如何让 root 可以登入 vsftpd 主机呢?!呵呵!就是将 /etc/vsftpd.ftpusers 与 /etc/vsftpd.user_list 这两个档案里面的 root 拿掉就可以啦!不过,本人可是不建议这么搞的喔!
     

    针对仅有开放匿名用户登入的设定
     
    好了,上面一章节谈的是仅开放 Real User ,那么这个章节我们就来谈一谈,没有 Real user 仅有 anonymous 的登入说!我想要的功能是这样的:
     
    • 使用台湾本地的时间,而非 GMT 时间;
    • 仅开放 anonymous 的登入;
    • 文件传输的速限为 30 Kbytes/second;
    • 允许 anonymous 上传档案到 /var/ftp/upload 这个目录当中,并且允许 anonymous 建立目录;
    • 数据连接的过程 (不是命令通道!) 只要超过 60 秒没有回应,就强制 Client 断线!
    • 只要 anonymous 超过十分钟没有动作,就予以断线;
    • 被动式连接的埠口为 65400 到 65420 这几个 port number 即可;
    • 最大同时上线人数限制为 50 人,且同一 IP 来源最大联机数量为 5 人;
    • 不许使用 ASCII 格式上传或下载!
    • 不许以 linux.vbird.org 这个网址为 email address 的密码输入!
     
    OK!这样要如何设定呢!?
     
    1. 基础配置文件
    [root@test root]# vi /etc/vsftpd/vsftpd.conf (或 /etc/vsftpd.conf)
    # 与主机与安全性有关的设定
    use_localtime=YES
    write_enable=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    xferlog_file=/var/log/vsftpd.log
    data_connection_timeout=60
    idle_session_timeout=600
    max_clients=50
    max_per_ip=5
    ascii_upload_enable=NO
    ascii_download_enable=NO
    connect_from_port_20=YES
    pasv_min_port=65400
    pasv_max_port=65420
    pam_service_name=vsftpd
    tcp_wrappers=YES
    nopriv_user=ftp
    # 关于 anonymous 的设定
    anonymous_enable=YES
    anon_other_write_enable=YES
    anon_mkdir_write_enable=YES
    anon_upload_enable=YES
    deny_email_enable=YES
    banned_email_file=/etc/vsftpd.banned_emails
    anon_max_rate=30000
    # 关于 real user 的设定
    local_enable=NO
    # 以上设定值的意义请往前翻到 vsftpd.conf 设定值的意义 章节去察看!
     
    2. 建立抵挡不当 email address 的档案
    [root@test root]# vi /etc/vsftpd.banned_emails
    linux.vbird.org
    # 一行写一个 email 名称喔!
     
    3. 建立可以上传的目录!
    # 因为我们的 nopriv_user 设定为 ftp ,所以上传的目录拥有者为 ftp 喔
    [root@test root]# mkdir -p /var/ftp/upload
    [root@test root]# chown ftp /var/ftp/upload
     
    4. 重新启动 xinetd 啰!
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    经过上面的说明之后,您就可以很清楚的知道了 Real user 与 anonymous 在 vsftpd 当中的设定了,那么您就可以很轻易的就架设出一部 vsftpd 服务器了呢!赶紧尝试看看吧! ^_^

大标题的图示Client 端的设定:
Client 端并没有什么好设定的地方,主要就是 ftp 的使用了,请参考 wu FTP 主机设定一节!

大标题的图示安全相关方面
    有关安全性的设定方面,当然就是与登入以及防火墙有关啰!那就来谈一谈吧!
     

    防火墙抵挡
     
    要启用 vsftpd 自然就得要开放防火墙啰!所以您如果想要对 Internet 开放您的 FTP 服务器,就必须至少要有这一段 iptables 防火墙规则在您的规则列当中:
     
    /sbin/iptables -A INPUT -p TCP -i eth0 --dport 21 -j ACCEPT 
     
    当然,您可以设定的更严密,请参考简易防火墙一文来设定 iptables 喔!此外,您的 TCP Wrappers 如果想要抵挡 192.168.1.2 这个 IP 来源的话,可以这样做:
     
    [root@test root]# vi /etc/hosts.deny
    vsftpd: 192.168.1.2
     
    这个应该没有问题吧! ^_^
     

    Super daemon 的管理
     
    Super daemon 可以用来管理 Client 端的登入权限呢,这个重点没有忘记吧! ^_^ !那么我们如何设定呢?!举个简单的例子好了:假设我们的 vsftpd 只允许同一个 IP 来源可以拥有五个登入权限,而同一时间最多可以有 200 个 vsftpd 的联机,当超过 200 个 vsftpd 的联机时,将在 Client 端的画面当中显示『很抱歉,服务器忙碌中』的字样,该如何设定?
     
    [root@test root]# vi /etc/xinetd.d/vsftpd
    # vsftpd is the secure FTP server.
    service ftp
    {
            disable                 = no
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/local/sbin/vsftpd
            server_args             = /etc/vsftpd.conf 
    # 上面这个 server 的设定请依照您的主机环境来设定!
    # 至于 server_args 则请写入您的 vsftpd 的配置文件完整档名即可!
            per_source              = 5     # 与同一 IP 的联机数目有关
            instances               = 200   # 同一时间最多的联机数目
            no_access               = 192.168.1.3
            banner_fail             = /etc/vsftpd.busy_banner
    # 上面这个档案就是当主机忙碌中,则在 Client 端显示的内容!
            log_on_success          += PID HOST DURATION
            log_on_failure          += HOST
    }
     
    [root@test root]# vi /etc/vsftpd.busy.banner
    421 很抱歉,服务器忙碌中!
     
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    这样设定就可以啦!很简单的一个设定动作,就可以让您的 vsftpd 变的更安全一些喔!
     

    问题解决方案
     
    如果发生 vsftpd 的问题怎么办?!有几个可能的解决方案喔:
     
    • 如果在 Client 端上面发现无法联机成功,请检查:
      1. iptables 防火墙的规则当中,是否开放了 client 端的 port 21 登入?
      2. 在 /etc/hosts.deny 当中,是否将 client 的登入权限挡住了?
      3. 在 /etc/xinetd.d/vsftpd 当中,是否设定错误,导致 client 的登入权限被取消了?
       
    • 如果 Client 已经连上 vsftpd 服务器,但是却显示『 XXX file can't be opend 』的字样,请检查:
      1. 最主要的原因还是在于在 vsftpd.conf 当中设定了检查某个档案,但是您却没有将该档案设定起来,所以,请检查 vsftpd.conf 里面所有设定的档案档名,使用 touch 这个指令将该档案建立起来即可!
       
    • 如果 Client 已经连上 vsftpd 服务器,却无法使用某个账号登入,请检查:
      1. 在 vsftpd.conf 里面是否设定了使用 pam 模块来检验账号,以及利用 userlist_file 来管理账号?
      2. 请检查 /etc/vsftpd.ftpusers 以及 /etc/vsftpd.user_list 档案内是否将该账号写入了?!
       
    • 如果 Client 无法上传档案,该如何是好?
      1. 最可能发生的原因就是在 vsftpd.conf 里面忘记加上这个设定『write_enable=YES』这个设定,请加入;
      2. 是否所要上传的目录『权限』不对,请以 chmod 或 chown 来修订;
      3. 是否 anonymous 的设定里面忘记加上了底下三个参数:
        • anon_other_write_enable=YES
        • anon_mkdir_write_enable=YES
        • anon_upload_enable=YES
      4. 是否因为设定了 email 抵挡机制,又将 email address 写入该档案中了!?请检查!
      5. 是否设定了不许 ASCII 格式传送,但 Client 端却以 ASCII 传送呢?请在 client 端以 binary 格式来传送档案!
     
    上面是蛮常发现的错误,如果还是无法解决您的问题,请您务必分析一下这两个档案:/var/log/vsftpd.log 与 /var/log/messages ,里面有相当多的重要资料,可以提供给您进行除错喔!

大标题的图示对于 FTP 服务器软件选择的建议
    在玩过了 Wu FTP, ProFTPD 以及 vsFTPD 之后,发现其实三个服务器各有优缺点啦!没有说哪一个特别的好,因为各有其利用的主机环境说!不过,其实我们还是有选择的思考方向啦。
     
    • 考虑较为单纯的 FTP 设计,而且要求安全性:如果我们不要个别控制每个目录的流量、不必控制上传/下载比例、不必针对不同的实体用户或者是访客进行不同的权限设定,仅分 anonymous 与 real user 两种身份来让用户登入主机的话,那么上上之选应该是 vsftpd 这个服务器才对!因为他设定上真的比较简单,而且在整体套件的设计上又比较安全喔!

    •  
    • 多样化的设计,安全性要求亦不低:虽然 Wu FTP 与 Proftpd 可以达到的 FTP 服务器设定是一样的,不过 Proftpd 的设定又比 Wu FTP 简单一些,有点类似 Apache 的目录管理设定,此外, Proftpd 也可以达到控制上/下传比例、流量控制、针对不同的目录设定不一样的权限等设计,也比 Wu FTP 安全一些,所以,在多样化的 FTP 设计考虑下,可以选择 Proftpd 喔!

    •  
    • 考虑主机的要求:某些主机本来就是含有 Wu FTP 或者是 vsftpd 等不同的 FTP 服务器软件,您又不想重新安装其他的服务器软件,那么使用您的 Linux distributions 所提供的 FTP 软件来架设您的 FTP 即可啊!不需要考虑其他的 FTP 软件咯。不过,请记得将您的 FTP 软件更新到最新版喔!避免被恶意攻击说!
     
    事实上,也就是说,以 vsftpd 为主要的考虑依据,但是如果觉得 vsftpd 无法满足您的 FTP 服务器设计需求,就改以 Proftpd 来设计,最后,如果您也是懒人一族,使用 Wu FTP 就算了吧! ^_^

大标题的图示参考资源:
简易 vsftpd 服务器设定

2003/09/03:首次完成
2003/09/04:加入 FTP 服务器软件的选择建议
 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室