FTP文件传输服务
1. vshpd服务基础
1.1 FTP服务概述
FTP(File Transfer Protocol,文件传输协议)是典型的C/S结构的应用层协议,需要由服务端软件,客户端软件两个部分共同实现文件传输功能。关于FTP服务,可以从以下几个方面进行了解。
1.FTP连接及传输模式
FTP服务器默认使用TCP协议的20、21端口与客户端进行通信。20端口用于建立数据连接,并传输文件数据;21端口用于建立控制连接,并传输FTP控制命令。根据FTP服务器在建立数据连接过程中的主、被动关系,FTP数据连接分为主动模式和被动模式,两者的含义及主要区别如下。
➣ 主动模式:服务器主动发起数据连接。首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,客户端以PORT命令告知服务器”我打开了某端口,你过来连接我“,于是服务器从20端口向客户端的该端口发送请求并建立数据连接。
➣ 被动模式:服务器被动等待数据连接,如果客户机所在网络的防火墙禁止主动模式连接,通常会使用被动模式。首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,服务器以PASV命令告知客户端“我打开了某端口,你过来连接我”,于是客户端向服务器的该端口(非20)发送请求并建立数据连接。
上传或下载文件了。在传输文件时,根据是否进行字符转换,分为文本模式和二进制模式。
➣ 文本模式:又称为ASCII(American Standard Code for Information Interchange,美国信息交换标准码)模式,这种模式在传输文件时使用ASCII标准字符序列,一般只用于纯文本文件的传输。
➣ 二进制模式:又称为Binary模式,这种模式不会转换文件中的字符序列,更适合传输程序、图片等非纯文本字符的文件。使用二进制模式比文本模式更有效率,大多数FTP客户端工具可以根据文件类型自动选择文件传输模式,而无需用户手工指定。
2.FTP用户类型
ftp或anonymous,提供任意密码(包括空密码)都可以通过服务器的验证,这样的用户称为“匿名用户“:匿名用户一般用于提供公共文件的下载,如提供一些免费软件、学习资料下载的站点。
账号来进行验证,这些用户通常被称为“本地用户”。在RHEL5系统中,匿名用户也有对应的本地系统用户账号“ftp“,但对于vsftpd服务来说,本地用户指的是除了匿名用户以外的其他系统用户。
用户账号。这些位于独立数据库文件中的FTP用户账号,通常被称为“虚拟用户”。通过使用虚拟用户,将FTP账户与Linux系统账户的关联性降至最低,可以为系统提供更好的安全性。
3.FTP服务器软件的种类
可以选择proftpd、pureftpd、vsftpd等软件,这些FTP服务器软件都有各自的特点。其中vsftpd是目前在Linux/UNIX领域应用十分广泛的一款FTP服务软件,本课程将以vsftpd 为例进行讲解。
该软件针对安全特性方面做了大量的设计.除了安全性以外,vsftpd在速度和稳定性方面的表现也相当突出,根据ftp.redhat.com服务器反映的数据,vsftpd可以支持15000个用户并发连接。
4.FTP客户端工具的种类
自带有ftp命令程序,可以连接到FTP服务器进行交互式的上传,下载通信。
CuteFTP,FlashFXP、LeapFTP、Filezilla等,Linux中较常用的有gftp,kuftp等。在图形化的客户端程序中,用户通过鼠标和菜单即可访问,管理FTP资源而不需要掌握FTP交互命令,因此使用户的操作更加简单,易于使用。
持通过FTP协议下载文件,但因不具备FTP上传等管理功能,通常不称为FTP客户端工具。
1.2 vsftpd的配置文件
构建过程。vsftpd的官方网站位于http://vsftpd.beasts.org/,若希望获取最新的源码安装版本,用户可以从该站点中下载。
通过RPM方式安装的vsftpd软件包,将会自动添加名为vsftpd的系统服务因此启动,停止vsftpd服务变得非常方便。构建vsftpd服务器的关键在于熟悉相关的配置文件。vsftpd服务的配置文件位于/etc/vsftpd/目录下,包括用户列表文件(ftpusers、use_list)和主配置文件(vsftpd.conf)等。下面主要介绍这两类配置文件。
1.用户列表文件ftpusers和user_list
在ftpusers,user_list文件中,各自记录了若干个FTP用户的账号名称,两个列表文件都用于FTP登录控制,但是控制方式存在一些差别。
➣ ftpusers文件:此文件中列出的用户将禁止登录vsftpd服务器,不管该用户是否在use_list文件中出现。默认已包括root、bin、daemon等用于系统运行的特殊用户。
➣ user_list文件:此文件中包含的用户可能被禁止登录,也可能被允许登录,具体取决于主配置文件vsftpd.conf中的设置。当存在“userlist_enable=YES"的配置项时,user_list列表文件方可生效;若指定"userlist_deny=YES"则仅禁止此列表中的用户登录;若指定”userlist_deny=No,则仅允许列表中的用户登录。
ftpusers文件相当于黑名单,为vsftpd服务器提供了一份禁止登录的用户列表,而user_list文件提供了一份可以灵活控制的用户列表。二者相互结合,为FTP账号的登录控制提供了便捷的途径。
2.主配置文件vsftpd.conf
在vsftpd的主配置文件中,配置行采用”配置项=参数“的格式.下面列出最常见的一些配置项及其含义说明(如下所示)。
常用的全局配置项:
listen=YES 是否以独立运行的方式监听服务
listen_address=192.168.4.1 设置监听的IP地址
listen_port=21 设置监听FTP服务的端口号
write_enable=YES 是否启用写入权限
download_enable=YES 是否允许下载文件
userlist_enable=YES 是否启用user_list列表文件
userlist_deny=YES 是否禁用user_list中的用户
max_clients=0 限制并发客户端连接数
max_per_ip=0 限制同一IP地址的并发连接数
常用的匿名FTP配置项:
anonymous_enable=YES 启用匿名访问
anon_umask=022 匿名用户所上传文件的权限掩码
anon_root=/var/ftp 匿名用户的FTP根目录
anon_upload_enable=YES 允许上传文件
anon_mkdir_write_enable=YES 允许创建目录
anon_other_write_enable=YES 开放其他写入权
anon_max_rate=0 限制最大传输速率(字节/秒)
常用的本地用户FTP配置项
local_enable=YES 是否启用本地系统用户
local_umask=022 本地用户所上传文件的权限掩码
local_root=/var/ftp 设置本地用户的FTP根目录
chroot_local_user=YES 是否将用户禁锢在主目录
local_max_rate=0 限制最大传输速率(字节/秒)
2 基于系统用户的FTP服务
vsftpd服务可以使用Linux主机中的系统用户账号作为登录FTP的账号,包括匿名访问和用户验证两种形式。下面分别讲解这两种FTP服务器的构建方法。
2.1 匿名访问的FTP服务
访问匿名FTP服务器时,不需要密码验证任何人都可以使用,非常方便。当需要提供公开访问的文件下载资源(如ftp.redhat.com),或者让用户上传一些不需要保密的数据资料时,可以选择搭建匿名FTP服务器。
1.准备匿名FTP访问的目录
在RHEL5系统中,FTP匿名用户对应的系统用户为ftp,其宿主目录/var/ftp/也就是匿名访问vsftpd服务时所在的FTP根目录。基于安全性考虑,FTP根目录的权限不允许匿名用户或其他用户有写入权限(否则访问时会报500错误)。
为了后续测试方便,可以在/var/ftp/目录下创建一个用于下载的测试文件。例如,执行以下操作创建一个压缩包文件作为测试。
|
/var/ftp/目录下默认设置了一个名为pub的子文件夹,可以给匿名访问FTP提供上传文件使用。执行以下操作可以使匿名用户ftp对该目录拥有写入权限,以便上传数据。
[root@sky ~]
# chown ftp /var/ftp/pub/
[root@sky ~]
# ls -ld /var/ftp/pub/
drwxr
-xr
-x
. 2 ftp root 4096 10月 18 2014 /var/ftp/pub/
2.开放匿名用户配置,并启动vsftpd服务
配置vsftpd服务时,是否开放匿名FTP访问取决于配置项”anonymous_enable“,只要将其设为“YES”,即表示允许匿名用户访问,反之表示禁用。启用匿名用户后,默认情况下只具有读取权限,匿名用户可以完成目录列表,下载文件等基本的FTP任务.
若要进一步放开权限,允许匿名用户上传文件,则需要开放更多的配置。主要涉及到以下几个配置项,分别对应不同的FTP操作权限。
➣ write_enable:用于启用,禁止vsftpd服务的写人权限,是全局性的选项不管是匿名用户,本地用户还是虚拟用户,若要允许其上传都必须启用此配置项。
➣ anon_upload_enable:用于允许,禁止匿名用户在现有的可写入目录中上传文件。
➣ anan_mkdir_write_enable:用于允许,禁止匿名用户在现有的可写目录中创建文件夹,即上传目录。
➣ anon_otherwrite_enable:用于允许,禁止匿名用户的其他写入权限,包括删除,改名,覆盖等操作。
上述四个配置项应根据匿名FTP服务器的实际应用需求来选择设置。若只要求能够上传文件则只需启用”write_enable”和“anan_upload_enable”就足够了;若还要求能够上传文件夹则需进一步启用“anan_mkdip_wnte_enable”。只有在希望匿名用户能够对上传的文件和目录进行覆盖删除等管理操作时,才需要启用"anan_other_write_enable"。
例如,若要设置vsftpd服务器提供匿名访问,允许匿名用户上传,下载,但禁止使用删除操作,可以参考以下步骤修改配置文件。
|
在上述配置内容中,还使用了”anon_umask“配置项,此配置项用于设置匿名用户所上传文件或目录的权限掩码。权限掩码的作用与子网掩码的作用有点类似,用于去掉特定的权限。例如,若上传权限掩码设为022,则所上传的文件或目录将减去022对应的这部分权限。实际结果是所上传的文件默认权限为644,目录权限755。
确认配置无误后,就可以启动vsftpd服务了,使用netstat命令可以确认监听状态。
|
3.测试匿名FTP服务器
配置好vsftpd并启动服务以后就可以使用FTP客户端工具进行验证了。Windows 主机中可以直接在"我的电脑"地址栏内输入URL地址访问
ftp://192.168.1.10。在Linux的字符界面中,可以使用ftp命令进行测试。例如,执行以下操作可以匿名登录到FTP服务器192.168.1.10。
|
成功登录FTP服务器以后,将进入到显示“ftp”提示符的交互式操作环境。在此操作界面中,可以执行实现各种FTP操作的交互指令(执行?或help命令可查看指令帮助)。例如,以下操作过程依次展示了列表查看、下载文件,上传文件等相关的操作。
|
在已经知道要下载文件的完成URL地址的情况下,用户也可以使用Wget命令工具直接下载文件,省去了交互式登陆过程。
[root@localhost ~]
# wget ftp://192.168.1.10/vsftpdconf.tar.gz
--2015-05-15 12:55:02-- ftp://192.168.1.10/vsftpdconf.tar.gz
=> “vsftpdconf.tar.gz”
Connecting to 192.168.1.10:21... connected.
Logging in as anonymous ... Logged in!
==> SYST ... done. ==>
PWD
... done.
==>
TYPE
I ... done. ==> CWD not needed.
==> SIZE vsftpdconf.tar.gz ... 2631
==> PASV ... done. ==> RETR vsftpdconf.tar.gz ... done.
Length: 2631 (2.6K) (unauthoritative)
100%[==================================================>] 2,631 --.
-K
/s in 0s
2015-05-15 12:55:02 (7.58 MB/s) - “vsftpdconf.tar.gz” saved [2631]
2. 2 用户验证的FTP服务
vsftpd可以直接使用Linux主机的系统用户作为FTP账号,提供基于用户名/密码的登录验证。用户使用系统用户账号登录FTP服务器后,将默认位于自己的宿主目录中,且在宿主目录中拥有读写权限。
1.基本的本地用户验证
使用基本的本地用户验证,只需打开local_enable,write_enable两个配置项。为了提高上传文件的权限,可以将权限掩码设为077(仅属主用户拥有权限)。若还希望将所有的宿主目录禁锢在其宿主目录中,可以添加chroot_local_user配置项,否则用户将能够任意切换到服务器的/var/、/etc/、/boot/等宿主目录以外的文件夹,这样一来便存在安全隐患。
|
在访问要求用户验证的FTP服务器时,如果使用URL地址的形式,必须指定FTP账号名称,如访问:“ftp://laya@192.168.1.10", 可以根据提示输入密码进行验证,当然也可以在URL地址中直接指定密码,如访问"ftp"//laya:123456@192.168.1.10。
通过ftp命令访问FTP服务器时,只需输入正确的用户名,密码验证即可。例如,以下操作将以系统用户laya登录到FTP服务器192.168.1.10,并进行上传文件测试。
|
2. 使用user_list用户列表文件
当vsftpd服务器开放了“local_enable”配置项以后,默认情况下所有的系统用户都可以登录到此FTP服务器。若只希望对一小部分系统用户开放FTP服务,则需要开放用户列表控制的相关配置项,其中主要包括userlist_enable、userlist_deny。例如,执行以下操作后vsftpd服务器将只允许laya、vanko、hunter这三个用户登录。
|
2.3 vsftpd服务的其他常用配置
前两个小节中分别学习了匿名访问,用户验证的FTP服务器的基本配置,除此以外还有以下一些其他的常用配置项,也需要我们有一定的了解。
1. 修改vsftpd服务的监听地址,端口
|
2.允许使用FTP服务器的被动模式
|
[root@sky ~]
# service vsftpd reload
3.限制FTP连接的并发数、传输速度
|
[root@sky ~]
# service vsftpd reload
3 基于虚拟用户的FTP服务
在vsftpd服务器中,使用虚拟用户的主要好处在于:可以将FTP登录的账号与系统登录的账号区分开用户名,密码都不相同,从而进一步增强了FTP服务器的安全性,本节将学习为vsftpd服务器设置使用虚拟用户账号的过程。
3. 1 建立虚拟用户的账号数据库
vsftpd服务使用Berkeley DB格式的数据库文件来存放虚拟用户账号。建立这种数据库文件需要用到db_load工具,db_load工具由db4-utils软件包提供,而db4-utils软件包需要先从RHEL5光盘目录中进行安装其安装可以执行以下操作。
|
1.创建文本格式的用户名、密码列表
首先需要建立文本格式的用户名/密码列表文件,奇数行为用户名,偶数行为上一行中用户所对应的密码。例如若要添加两个用户mike,John密码分别为123,456 可以执行以下操作。
|
2.创建BerkeleyDB格式的数据库丈件
有了文本格式的用户名/密码列表文件以后,以此文件为数据源通过db_load工具创建出Berkeley DB格式的数据库文件。
|
在db_load命令中,”-f“选项用于指定数据源文件,”-T”选项允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件,“-t hash’选项指定读取数据文件的基本方法。为了提高虚拟用户账号文件的安全性应将文件权限设置为600,以避免数据外泄. 其具体操作如下。
|
3.添加虚拟用户的映射账号、创建FTP根目录
vsftpd服务器对虚拟用户的控制采用了映射的控制方式,将所有的虚拟用户对应到同一个系统用户,该系统用户宿主目录作为所有虚拟用户登录后共用的FTP根目录,因此还需要添加一个对应的系统用户账号(此账号无需设置密码及登录Shell),例如,若要将使用的FTP根目录设为/var/ftproot/,映射账号的名称为virtual,可以执行以下操作:
|
3.2 为vsftpd服务添加虚拟用户支持
创建好虚拟用户的账号数据文件以后,还需要对vsftpd服务的配置做相应调整以便识别并读取新的用户信息。在vsftpd服务器中,用户认证是通过PAM(Pluggable Authentication Module,可插拔认证模块)机制来实现的,该机制包含灵活的选择认证方式。
1.为虚拟用户建立PAM认证文件
vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux主机的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,就需要创建新的PAM 认证配置。例如,可以参考以下内容在/ete/pam.d/目录下建立一个名为vsftpd.vu的PAM认证文件,用于虚拟用户认证控制。
|
上述PAM配置内容中,通过"db=/etc/vsftpd/vusers“参数指定了要使用的虚拟用户数据库文件位置(省略了.db扩展名) 即对应为/etc/vsftpd/vusers.db文件。
2.修改vsftpd配置,添加虚拟用户支持
在vsftpd.conf配置文件中添加guest_enable,guest_username配置项,将访问FTP服务的所有虚拟用户对应到同一系统用户账号virtual,并修改pam_service_name配置项,指向上一步建立的/ete/pam.d/vsftpd.vu认证文件。
|
在vsftpd服务中,虚拟用户被默认作为匿名用户进行处理以降低权限,因此对应的配置项通常以anon_开头。例如,在设置虚拟用户所上传文件的默认权限掩码时应采用配置项为anon_umask而不是local_umask。
3.为不同的虚拟用户建立独立的配置文件
通过前面的几个步骤,实际上已经可以重新加载vsftpd并提供服务了,使用任一个虚拟用户账号都可以登录FTP服务器并下载文件。但因为所有的虚拟用户都映射到同一个系统用户账号,因此FTP访问权限也是相同的,要么都只能下载,要么都能够上传。
若要为不同的虚拟用户账号设置不同的访问权限,可以通过为每个虚拟用户建立单独的配置文件来实现。为FTP用户启用独立配置文件,需要修改vsftpd.conf配置文件,添加"user_config_dir"配置项。例如,以下设置表示将从/etc/vsftpd/vusers_dir/目录中查找每个用户的独立配置文件。
|
有了上述配置以后,就可以在/etc/vsftpd/vusers_dir/目录中为每个虚拟用户分别建立配置文件了。例如,若要使虚拟用户john能够上传文件、创建目录,而mike仍然只有默认的下载权限,可以执行以下操作。
|
在vsftpd.conf文件中启用了“user_config_dir”配置项以后,应该为每一个虚拟用户都建立一个单独的配置文件(可以是空文件) 否则该用户可能会无法登录。在每个用户的独立配置文件中,可以添加新的配置项来限制访问权限、下载速率等。
有了虚拟用户数据文件,并为vsftpd正确添加了虚拟用户支持以后,就可以重新加载vsftpd服务程序了。用户可以使用FTP客户程序访问该FTP服务器,以虚拟用户账号进行测试。根据之前的配置过程,至少应确认以下结果。
➣ mike用户可以登录,并能够正常浏览、下载文件,但不能上传文件。
➣ john用户可以登录,且可以正常浏览、下载文件,也可以上传文件。
➣ Linux主机中的系统用户将无法登录。