FTP协议就是文件传输控制协议。它可以使文件通过网络从一台主机传送到同一网络的另一台主机上,而不受计算机类型和操作系统类型的限制。无论是PC机、服务器、大型机,还是DOS操作系统、Windows操作系统、Linux操作系统,只要双方都支持FTP协议,就可以方便地传送文件。
二:FTP的工作原理FTP服务的具体工作过程如下。
① 当FTP客户端发出请求时,系统将动态分配一个端口(如1032)。
② 若FTP服务器在端口21侦听到该请求,则在FTP客户端的端口1032和FTP服务器的端口21之间建立起一个FTP会话连接。
③ 当需要传输数据时,FTP客户端再动态打开一个连接到FTP服务器的端口20的第2个端口(如1033),这样就可在这两个端口之间进行数据的传输。当数据传输完毕后,这两个端口会自动关闭。
④ 当FTP客户端断开与FTP服务器的连接时,客户端上动态分配的端口将自动释放掉。
三:主动模式和被动模式在主动模式中,FTP客户端随机开启一个大于1024的端口X向服务器的21号端口发起控制连接请求,然后开放X+1号端口进行监听;FTP服务器接受请求并建立控制连接会话。如果客户端在控制会话中发送数据连接请求,那么服务器在接收到命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口X+1进行数据传输 。
被动模式的控制连接和数据连接都是由FTP客户端发起的。首先FTP客户端随机开启一个大于1024的端口X向服务器的21端口发起连接,同时会开启X+1端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口Y进行监听,然后用PORT Y命令通知客户端,自己的数据端口是Y。客户端收到命令后,会通过X+1号端口连接服务器的端口Y,然后在两个端口之间进行数据传输。这样就能使防火墙知道用于数据连接的端口号,而使数据连接得以建立。
四:配置
预备知识:
安装vsftpd服务:
rpm -ivh vsftpd-2.0.5-16.el5.i386.rpm
修改权限使之支持匿名账号上传:
chmod o+wt /var/ftp/pub/
修改文件/etc/vsftpd/vsftpd.conf
设置拒绝服务攻击:
第一部分:建立基于本地用户的vsftpd服务
1.匿名FTP
访问匿名FTP服务器时不需要密码,只要使用用户名“ftp”或“anonymous”即可通过验证。当需要提供公开访问的文件下载资源,或者让用户上传一些无需保密的数据资料时,可以选择搭建匿名FTP服务器。搭建的步骤如下所示:
1>.调整匿名上传目录权限。
在RHEL5系统中,匿名用户对应的系统帐户为ftp,其宿主目录为“/var/ftp”,该目录也就是匿名用户访问vsftpd服务时所在的根目录(可通过anon_root配置项更改)。
说明:将其中pub子目录的属主修改为ftp,并保留其可写权限,可提供给匿名用户上传文件使用。我们给/var/ftp/创建一个文件到/var/ftp/目录下,以便稍后的测试。
2>.修改vsftpd.conf配置文件,开放匿名用户访问、上传许可。
说明:如果希望匿名用户在上传目录中能够进行覆盖、删除、重命名文件等写入操作,还可以添加“anon_other_write_enable=YES”的配置项。此项配置可能带来安全性问题,所以应谨慎使用。
注意:由于匿名FTP根目录“/var/ftp/”的默认权限为755,因此不要将该目录的属主更改为ftp,否则匿名访问时可能会报错“500 OOPS:vsftpd:refusing to run with writable anonymous root”,此错误会导致访问失败。
3>.重新启动vsftpd服务
4>.此时,我们到客户机上访问FTP服务器,测试下载及上传功能。
可以看到,用户使用匿名用户FTP,不但可登录,并且可以下载FTP服务器上的资源。
2.本地用户FTP
Vsftpd可以直接使用Linux系统的本地用户作为FTP用户,提供基于用户名/密码的登录验证。使用本地用户登录FTP服务器后,默认将位于自己的宿主目录中,且在宿主目录中拥有读写权限,并允许切换到其他目录。使用chroot_local_user配置项可以将本地用户禁锢在宿主目录中(不允许切换到其他目录),使用local_root配置项可以将本地用户的FTP根目录设置为同一个文件夹。
下面我们配置一个基于本地用户并进行用户限制的FTP服务器步骤如下:
1>.添加FTP测试用户(也就是本地用户)。新建一个文件file1以便测试。
2>.修改vsftpd.conf配置文件,开放本地用户。
说明:配置“chroot_local_user=YES”项,可以有效提高FTP服务器的安全性。否则,默认将允许用户切换到服务器中的“/var/”、“/etc/”、“/boot/”等宿主目录以外的文件夹,可能带来安风险。如果启用“local_root=/var/ftproot”的配置选项时,本地用户登录该FTP服务器后,根目录将更改为指定的文件夹。该选项适用于FTP根目录需要保持固定的情况。如果希望vsftpd服务 只对特定的本地用户开放,可以使用userlist_enable、userlist_deny配置项并结合用户列表文件“/etc/vsftpd/user_list”实现,此处不做演示。
3>.重新启动vsftpd服务。
4>.在客户端访问FTP服务器,测试下载及上传功能。
可以看到用户登录和下载服务器上的资源都没有问题
第二部分:建立基于虚拟用户的vsftpd服务
1. 建立虚拟用户的用户名/密码数据库
Vsftpd服务的虚拟用户数据库是使用Berkeley DB格式的数据文件。建立该数据库文件需要用到db_load命令工具,从RHEL5光盘中安装db4-utils-4.3.29-9.fc6.i386.rpm软件包后可获得该工具。
首先建立文本格式的用户名/密码列表文件,奇数行为用户名,偶数行为上一行中用户所对应的密码。
说明:此处建立了两个密码都为123.com的虚拟用户zpp001和zpp002.
然后用db_load工具将列表文件转化为DB数据库文件。
说明:在db_load命令中,“-f”选项用于指定用户名/密码列表文件,“-T”选项允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件,“-t hash”选项指定读取数据文件的基本方法。将文件vusers.db的权限降底为600是为了安全性考虑。关于db_load命令的详细说明可参阅“/usr/share/doc/db4-utils-4.3.29/utility/db_load.html”文件。
2. 建立FTP访问的根目录及虚拟用户对应的系统帐号
说明:Vsftpd虚拟用户需要有一个对应的系统用户帐号(该帐号不需要设置密码及登录Shell),该用户帐号的宿主目录作为所有虚拟用户登录后的共同FTP根目录。
3. 建立PAM认证文件
说明:PAM配置文件主要用于为程序提供用户认证控制,vsftpd服务使用的默认PAM配置文件为“/etc/pam.d/vsftpd”,s可以参考该文件的格式建立新的PAM配置文件,用于虚拟用户的认证控制。配置时请注意将db选项指定为先前建立的虚拟用户数据文件vusers(省略.db扩展名)
4. 修改vsftpd.conf配置文件,添加虚拟用户支持
在vsftpd.conf配置文件中,添加guest_enable、guest_userusername配置项,将访问FTP服务的所有虚拟用户对应到同一系统用户帐号virtual,并修改pam_service_name配置项,指向上一步建立的PAM配置文件“/etc/pam.d/vsftpd.vu”。
说明:在vsftpd服务中,虚拟用户账户默认作为匿名用户处理以降低权限,因此对应的权限设置通常使用以anon_开头的配置项,
5. 为不同的虚拟用户建立独立的配置文件
通过前面的四步,实际上已经可以重启vsftpd并提供服务了,使用虚拟用户帐号可以登录FTP服务器并下载文件。此步骤介绍如何为个别虚拟用户设置不同的访问权限。
假如现在有这样的要求:zpp001用户只有浏览和下载的权限,而zpp002可以浏览、下载、改名、删除文件、建立和删除目录的权限,可以按如下的步骤实现:
1>.修改vsftpd.conf主配置文件,添加用户配置目录支持。
说明:添加此行配置,指定用户配置目录的位置。
2>.为用户zpp001和zpp002建立独立的配置目录及文件。
说明:如果需要禁用或者允许一部分虚拟用户帐号,同样可以使用“/etc/vsftpd/user_list”列表文件。需要注意的是,在“/etc/vsftpd/ftpusers”文件中加入虚拟用户名,并不能禁用对应的系统帐号。
6. 重新启动vsftpd服务
7.使用虚拟用户帐户访问FTP服务
说明:现在可以看到,虚拟用户zpp001只有浏览和下载的权限,并没有创建目录等其它权限。
说明:可以看到,用户zpp002不但有浏览和下载权限,同时也具备创建目录等