本博文分为两部分:
<一>:FTP服务理论篇
<二>:FTP服务架构篇
<一>:理论篇:
注:笔者还是在这里唠叨一句:理论很枯燥、很无趣,对以后要从事运维管理工作的人员来说,理论知识是必须掌握的,所以笔者希望博友能够认真阅读FTP的相关理论,这样在后续的服务构建篇当中,才会更容易理解并掌握每步操作的真实意义!
FTP服务器的相关概念:
- FTP简称文件传输协议,全称(File Transfer Protocol),FTP服务在互联网上任意两台计算机之间提供文件传输服务。无论是客户端(Client)、服务器(Server)
- 还是Linux、Windows等操作系统,只要支持FTP协议,就可以使用FTP服务来提供文件传输等功能。如今FTP已被Ineternet 3/1广大用户所使用的重要互联网服务之一。
- FTP(文件传输协议)是TCP/IP协议的一种具体应用,它工作在OSI(Open System Interconnection)七层模型的第七层(应用层),TCP/IP模型的第四层。
- FTP服务使用TCP传输,所以在使用FTP服务时,FTP客户端和服务器之间要建立连接,这个连接也就是我们熟悉的“三次握手”,之所以建立三次连接,是为了证明客户端
- 和服务端之间的连接是可靠的、安全的、面向连接的,为数据的传输提供了可靠、安全的保障。
FTP服务器的功能:
- FTP服务主要提供下载数据、上传数据,并且可以将远程的文件复制到本地计算机,以达到资源共享和传递信息的目的,FTP在传输文件时还支持断点续传功能。
- FTP服务归根基地提供两个功能:
- ①可以在两台完全不同的计算机之间进行文件数据传输。(支持传送二进制文件,如:文件、程序、数据、视频、图片等各种类型的文件传输)
- ②可以提供许多文件数据同时共享。
FTP服务器的工作原理:
- FTP标准在RFC959文档中说明,此协议定义了一个在远程计算机系统和本地计算机之间传输文件的标准。一般的讲,要进行文件的传输,
- 我们必须使用有效的用户名和密码来访问FTP服务器上的资源(默认匿名用户不要提供密码),在Internet互联网上FTP服务器提供了“guest user”来访问FTP服务。
- 1.控制连接
- 当客户端希望和FTP服务器通讯时,建立上传/下载文件数据传输时,服务器的TCP 21端口发送一个建立连接的请求:FTP服务器接受来自客户端的请求,
- 并通过TCP/IP完成连接请求,这样的连接称之为FTP控制连接
- 2.数据连接
- 当FTP控制连接建立完成后,客户端便可使用FTP服务进行传输文件(get、put...);
FTP服务器的登陆方式:
- FTP服务登录模式:
- 匿名用户登录模式:只需要输入用户anonymous/ftp,并将自己的E-mail作为口令即可登录FTP服务器,又称为(anonymousFTP服务器)
- 本地账户登录模式:当进入FTP登录窗口是,需要输入正确的用户名(user)和密码(passwd)即可登录FTP服务器。
- 虚拟用户登录模式:将登录用户映射到指定的系统账号(/sbin/nologin)来访问FTP资源,这样就起到安全的效果。
FTP服务传输数据分为三种传输模式:
主动模式(PORT)、被动模式(PASSIVE)、单端口模式
- 主动模式:
- 主动传输模式,有FTP服务器向客户端发送一个用于数据传输的连接,客户端的连接端口由服务器和客户端通过协商确定,
- 即FTP服务器用端口20与客户端的临时端口进行连接并传输数据,客户端用于接收状态。
- 被动模式:
- 被动传输模式,由客户端发送PASV命令使服务器处于被动模式,FTP的数据连接和控制连接方向一致,由客户端向服务器端发送一个用于数据传输的连接,
- 客户端的连接端口是发起该数据请求时使用的端口。
- 单端口模式:
- 单端口模式,由服务器端发起,使用该模式时,客户端的控制连接端口和数据连接端口一致,这种模式无法在短时间内连续输入数据并传送命令,
- 因此笔者不建议大家使用此模式。
FTP服务配置文件的结构:
- Vsftpd服务器的文件结构如下:
- # rpm -ql vsftpd ##查看在安装vftpd软件包时,所产生的配置文件。(这里只做常用的文件)
- /usr/sbin/vsftpd ##Vsftpd主程序
- /etc/rc.d/init.d/vsftpd ##用于启动终止脚本
- /etc/vsftpd/vsftpd.conf ##Vsftpd主配置文件
- /etc/pam.d/vsftpd ##PAM认证文件
- /etc/vsftpd.ftpusers ##禁止使用Vsftpd的用户列表
- /etc/vsftpd.user_list ##禁止或允许使用Vsftpd的用户列表
- /var/ftp ##匿名用户的下载目录
- /var/ftp/pub ##匿名用户默认访问目录
- /etc/logrotate.d/vsftpd.log ##vsftpd的日志文件
介绍vsftpd配置文件参数的设置信息
注:在构建FTP服务器,我们会经常更改vsftpd.conf中各个参数来完成需求,所以我们要完全了解每个参数后面的真实意义,这样在配置器服务时,才会运用自如。
- 当vsftpd软件包安装完成后,默认的主配置文件/etc/vsftpd/vsftpd.conf
- # vim /etc/vsftpd/vsftpd.conf
- #anonymous_enable=YES ##允许匿名访问,即anonymous账号访问FTP服务
- #local_enable=YES ##允许本地用户登录FTP服务器
- #write_enable=YES ##本地用户可以读写
- #local_umask=022 ##默认掩码为022,默认创建的文件权限为755
- #anon_upload_enable=YES ##允许匿名用户上传文件,基于安全因素考虑,默认vsftpd是注释此项
- #anon_mkdir_write_enable=YES ##是否允许匿名用户创建目录,基于安全因素考虑,默认vsftpd是注释此项
- dirmessage_enable=YES ##如果目录存在.message隐藏文件时,当进入此目录时,会显示.message里面的内容
- xferlog_enable=YES ##默认记录上传、下载的日志文件,是否开启此功能
- #xferlog_file=/var/log/xferlog ##Vsftpd的日志存放位置
- connect_from_port_20=YES ##从端口20连接,默认状态下,20端口为数据传输端口
- #chown_uploads=YES
- #chown_username=whoever ##此两选项必须同时出现,含义为,允许新上传文件的拥有者为whoever,默认这两行被注释到得。
- xferlog_std_format=YES ##使用标准格式上传/下载
- #data_connection_timeout=120 ##传输延时时间,当时间超过120秒后,会自动断开,默认是注释掉的。
- #nopriv_user=ftpsecure ##使用特殊用户ftpsecure,这里可以把ftpsecure账户作为一般访问用户,所有连接FTP服务器的用户都具有ftpsecure用户名。
- 基于安全因素考虑,可以在/etc/passwd中将ftpsecure的用户shell设置为/sbin/nologin(禁止登陆操作系统)
- #async_abor_enable=YES ##取消下载后客户端不挂起,一般不需要设置。
- #ascii_upload_enable=YES
- #ascii_download_enable=YES ##是否启用ASCII方式传送文件,一般我们不需要这个格式。
- #ftpd_banner=Welcome to blah FTP service. ##登陆FTP服务器,所提示的信息,默认注释掉的。
- #deny_email_enable=YES
- #banned_email_file=/etc/vsftpd/banned_emails ##若是启用以上两个选项,则可以在/etc/vsftpd/banned_emails中建立黑名单啦。
- #chroot_list_enable=YES
- #chroot_list_file=/etc/vsftpd/chroot_list ##当登陆FTP服务器时,被列在chroot_list文件中的用户,不可以访问FTP根目录以外的目录。
- #ls_recurse_enable=YES ##是否可以使用ls -R 命令,默认是注释掉的。
- listen=YES ##当此项为YES时,vsftpd运行于stand-alone模式下,默认是开启的。
- #listen_ipv6=YES ##是用IPv6,默认是注释掉的。
- pam_service_name=vsftpd ##列出与vsftpd相关的pam文件。
- userlist_enable=YES ##当此项设置为YES时,启用配置文件/etc/vsftpd.user_list.此时有两种情况:
- ①若没有userlist_deny=NO,则/etc/vsftpd.user_list中的用户不可以访问FTP服务器
- ②若有userlist_deny=NO,则仅接受/etc/vsftpd.user_list中的用户登陆请求,同时此用户也不可以存在/etc/vsftpd.ftpusers文件中。
- tcp_wrappers=YES ##支持TCP Wrappers
补充:(未出现在vsftpd.conf配置文件中的常用参数)
- guest_enable=YES
- guest_username=ftp
- guest用户名,即登陆不是匿名用户的用户,具有guest用户身份
- local_root=/var/ftp
- anon_root=/var/ftp
- 以上两个选项为本地用户和匿名用户默认访问的目录
- #pasv_enable=YES
- #port_enable=YES
- 以上两个选项是FTP服务器的工作模式,两者只能出现一个,而且另一个必须注释掉。
- use_localtime=YES
- 是否使用本机时间,若设置NO时,仅使用格林尼治时间。由于北京时间和格林尼治时间有8小时时差,所以建议设置为YES
- Idle_session_timeout=300
- 客户端若在300秒之内没有任何操作,则服务器自动断开。
- max_clinet=0
- 最大连接数量(stand-alone模式下)
- max_per_ip=0
- 每个客户端最大连接ftp服务器的连接数
- local_max_rate=0
- 本地用户登陆FTP服务器最大传输速率,单位为字节/秒
- anon_max_rate=0
- 匿名用户登陆FTP服务器最大传输速率,单位为字节/秒
<二>:FTP服务器架构篇
经过前面的介绍我们应该基本了解FTP的相关知识,比如FTP的功能及作用、工作原理、工作模式及登录方式,那下面就来如何实现构建FTP服务器,为内部网络提供文件共享服务呢。
配置思路:
实现匿名用户上传下载(SELinux、iptables)、定义上传文件的属主、禁锢本地用户、实现虚拟账户登录(基于PAM认证模式)
- 环境:VMware Workstation
- 版本:Redhat Enterprise 5.8
- FTP服务器的IP地址为172.16.88.1/16
- Linux测试机:172.16.88.2/16
- XP测试机IP地址:192.168.0.203/24
- 说明环境:172.16.0.0/16和192.168.0.203/24之间可以互相访问:
Seq1:检查当前系统是否安装vsftpd二进制软件包,如果没有安装,使用yum来进行安装vsftpd即可
- # rpm -q vsftpd
- # yum install vsftpd -y #对yum生疏的朋友们,可以查看笔者关于YUM和RPM的相关文章进行了解。
Seq2:启动vsftpd进程并开启开机自动启动vsftpd服务
- # service vsftpd restart
- # chkconfig vsftpd on
- # chkconfig --list vsftpd ##查看在那个级别上启动(默认为235级别)
- # cd /var/ftp/pub
- # echo "text file" > text.txt
下面用windows客户端来测试下,是否可以正常访问FTP服务器资源呢?
哎,奇怪了,为啥不能正常访问服务器呢?
说明:如果在这测试的话,只能在本机访问FTP服务,在其它客户端就不能正常访问FTP服务了,因为我们的防火墙默认拒绝所有端口访问滴。那来修改下iptables看看是否可以正常访问。
Seq3:设置防火墙(iptables)开启20:21端口
- #iptables -I INPUT 1 -p tcp --dport 20:21 -j ACCEPT
- #service iptables save ##保存iptables设置
- iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
在测试看看结果:
Seq4:如何实现匿名用户具有上传的权限呢?
我们创建一个由匿名用户上传的目录,并将属主、属组更改为FTP
- # mkdir -p /var/ftp/upload
- # chown ftp:ftp /var/ftp/upload
- 我们修改配置文件/etc/vsftpd/vsftpd.conf,确保有下列几行。
- write_enable=YES
- anon_upload_enable=YES ##开启匿名用户上传功能
- anon_mkdir_write_enable=YES ##允许匿名用户创建目录
- 然后重新启动vsftpd服务
- #service vsftpd restart
- 然后再进行测试,查看是否可以上传文件?(效果图)
貌似还不能上传,那我们查看下SELINUX关于ftp的定义并修改相应选项(如图)
Seq5:定义上传文件的属主
我们到服务器器上看看刚才上传windows.txt的属性信息:
- 编辑配置文件
- # vim /etc/vsftpd/vsftpd.conf
- 修改如下内容
- #chown_upload=YES
- #chown_username=hadoop
- 改为如下内容(如图)
注:当配置文件发生变化,一定不要忘记重启检测配置文件
# service vsftpd condrestart
在到windows客户机上(文件均是windows客户机文件)进行测试(测试结果图)
Seq6:使用本地用户登录FTP服务器及禁锢本地用户访问目录
- 编辑主配置文件
- # vim /etc/vsftpd/vsftpd.conf ##可以再末行模式下输入:set nu可以显示行号。
- 将96行和98行的#去掉,并在/etc/vsftpd/目录下创建chroot_list(凡是在此文件的用户,都禁锢在自己的家目录中)
- chroot_list_enable=YES
- 97# (default follows)
- chroot_list_file=/etc/vsftpd/chroot_list
- # touch /etc/vsftpd/chroot_list
- # echo "hadoop" > /etc/vsftpd/chroot_list ##将hadoop用户添加到chroot_list文件中。
- 然后再进行测试,看hadoop用户是否可以更换目录
总结:本地用户可以登录FTP服务器,并且登录后的默认目录为用户的家目录,而且还可以更改其默认目录,我们又知道ftp是明文传输的,如果出现中间人***的话,这将对于我们的服务器造成很大威胁,所以我们要禁止本地用户更改其默认目录。
如果禁锢所有本地用户,只需要在主配置文件中添加一行即可:chroot_local_user = YES
二、如何基于PAM认证实现虚拟账号登陆FTP服务器
- 虚拟用户和系统本地用户的区别是:本地用户在系统的/etc/passwd文件中有相应的记录,而虚拟用户时针对vsftpd本身产生的,所以与/etc/passwd没有关系。
- FTP服务器除了支持本地用户和匿名用户登录服务器,如果我们有许多用户来访问服务器的话,也支持虚拟用户的访问。那么我们为什么要使用虚拟账号呢,
- 因为匿名用户不能针对每个用户设置不同的权限,而且本地用户又存在安全问题,在这种情形下,虚拟用户就产生啦。
在配置之前我们需要安装db4和db4-utils组件,如果系统没有安装db4相关软件包的话,可以使用yum来安装 # yum install db4* -y
1、创建虚拟用户账号和密码(奇数行为用户名,偶数行为用户密码)
- # touch /etc/vsftpd/virtual.users
- # vim /etc/vsftpd/virtual.users
- user1 ##奇数为用户名
- redhat ##偶数为用户的密码
- user2
- 123456
2、使用db_load命令生成用户账户的数据库文件并设置相应的数据库文件权限。
- # db_load -T -t hash -f /etc/vsftpd/virtual.users /etc/vsftpd/vsftpd.login.db
- # chmod 600 /etc/vsftpd/vsftpd.login.db
3、配置PAM信息,在/etc/pam.d/创建一个文件,命名为vsftpd.pam(可自定义)
- # vim /etc/pam.d/vsftpd.pam
- auth required pam_userdb.so db=/etc/vsftpd/vsftpd.login
- account required pam_userdb.so db=/etc/vsftpd/vsftpd.login
4、配置vsftpd.conf,我们也可以自己专为虚拟用户所使用的配置文件,这里我们使用系统默认的配置文档:
# vim /etc/vsftpd/vsftpd.conf 添加如下内容
5、创建相应的虚拟用户目录,用于虚拟用户访问FTP服务所用到的默认目录
- # mkdir -p /var/ftp/virtual/{user1,user2}
- # chown ftp.ftp /var/ftp/virtual/{user1,user2}
- # touch /var/ftp/virtual/user2/user2.txt (测试)
6、我们使用user2虚拟账号登陆FTP服务器,看是否可以正常登陆,并且访问相应资源
总结:我们通过使用PAM认证来实现虚拟账户的登陆,而且每个虚拟账户对应的是一个普通系统用户,而且不能正常登陆FTP服务器,所以即被中间人***截取用户和密码,也没有任何意义的,因为获取的是一个虚拟账户,这样我们的服务器就相对安全了许多。