• vsftpd基本概念

    背景

    vsftpd - very secure FTP daemon ,顾名思义,非常安全的FTP进程。 官网宣称的三大重要特性:

    安全 | 性能 |稳定 :

    yy

    何以证明它的牛逼呢? 看看都有哪些用它吧 ——

    yy

    还需要人家再解释什么吗?  这些牛逼的都在用。。。

    那么问题来了,他到底哪些地方体现了安全,性能和稳定呢?  看一下官网的介绍吧:

    1. 它避免了wu-ftpd, proftpd and even bsd-ftpd 用root用户的安全隐患。

    2. 它使用了chroot等安全功能。

    3. 它有效的避免内存泄露。

    4. 它的速度是BSD-ftpd的两倍

    …………

    概念

    首先,我们来说一下vsftp用的ftp协议是怎么回事。大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。但FTP协议却是例外,它使用双向的多个连接 ,而且使用的端口很难预计。

    FTP连接包括:

    一个控制连接 (control connection)这个连接用于传递客户端的命令和服务器端对命令的响应。它使用服务端周知的TCP 21端口,生存期是整个FTP会话时间

    N个数据连接 (data connection)这些连接用于传输文件和其它数据,这种连接在需要数据传输时建立,而一旦数据传输完毕就关闭,每次使用的端口也不一定相同。FTP工作方式的不同,数据端口并不总是20。这就是主动与被动FTP的最大不同之处

    FTP有两种模式,以下是他们的区别:

    (1)PORT(主动)模式

    所谓主动模式,指的是FTP服务器“主动”去连接客户端的数据端口来传输数据,其过程具体来说就是:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口(即tcp 21端口),紧接着客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。然后服务器会从它自己的数据端口(20)“主动”连接到客户端指定的数据端口(N+1),这样客户端就可以和ftp服务器建立数据传输通道了。

    (2)PASV(被动)模式

    所谓被动模式,指的是FTP服务器“被动”等待客户端来连接自己的数据端口,其过程具体是:当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。(注意此模式下的FTP服务器不需要开启tcp 20端口了)。

    两种模式的比较:

    (1)PORT(主动)模式模式只要开启服务器的21和20端口,而PASV(被动)模式需要开启服务器大于1024所有tcp端口和21端口。

    (2)从网络安全的角度来看的话似乎ftp PORT模式更安全,而ftp PASV更不安全,那么为什么RFC要在ftp PORT基础再制定一个ftp PASV模式呢?其实RFC制定ftp PASV模式的主要目的是为了数据传输安全角度出发的,因为ftp port使用固定20端口进行传输数据,那么作为黑客很容使用sniffer等探嗅器抓取ftp数据,这样一来通过ftp PORT模式传输数据很容易被黑客窃取,因此使用PASV方式来架设ftp server是最安全绝佳方案。

    因此:如果只是简单的为了文件共享,完全可以禁用PASV模式,解除开放大量端口的威胁,同时也为防火墙的设置带来便利。

    不幸的是,FTP工具或者浏览器默认使用的都是PASV模式连接FTP服务器,因此,必须要使vsftpd在开启了防火墙的情况下,也能够支持PASV模式进行数据访问。

    ——————————嘟嘟嘟嘟嘟嘟嘟嘟嘟嘟———————————

    那么问题来了,当我们在实际配置vsftp服务的时候,为了安全起见我们应该怎样配合不同的模式进行iptables防火墙的设置呢?

    主动模式,客户连接 TCP/21,服务器通过 TCP/20 连接客户的随机端口 :

    iptables -A INPUT -m state –state NEW,RELATED,ESTABLISHED -j ACCEPT

    —— NEW: 该包想要开始一个新的连接(重新连接或连接重定向)

    —— RELATED:该包是属于某个已经建立的连接所建立的新连接。如FTP的数据传输连接和控制连接之间就是RELATED关系。

    —— ESTABLISHED:该包属于某个已经建立的连接。

    —— INVALID:该包不匹配于任何连接,通常这些包被DROP。

    被动模式下,客户连接 TCP/21,客户再通过其他端口连接服务器的随机端口,卡住的原因,是因为服务器在被动模式下没有打开临时端口让 client 连过来。

    -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

    -A INPUT -p tcp -m state –state NEW -m tcp –dport 21 -j ACCEPT

    -A INPUT -p tcp –dport start:stop  -j ACCEPT

    注: 上面的start:stop就对应服务端的随机响应端口,我们要配合vsftpd的配置文件去限定它:

    pasv_enable=YES

    pasv_min_port=start

    pasv_max_port=stop

    vsftpd安装

    安装很简单,我们这里直接用yum来解决依赖关系:

    yum install vsftpd

    yy

    …………中间省略文档部分………….

    yy

    注1:如上图2中的最后两行它指定了我们vsftpd的默认的根路径。 也就是说 /var/ftp就是默认提供给我们上传和下载的路径。 但vsftpd为了安全起见,/var/ftp目录默认只有root用户才具有读写权限.  所以它也给我们指定了/var/ftp/pub这个公用目录可以方便我们进行权限调整和使用。

    注2:  如图1中,我们用yum安装它默认将配置文件放在了 /etc/vsftpd/目录地下。 而且我们发现在图1的第二行它默认提供了pam的验证路径。 所以我们接下来要也要安装pam相关程序包:

    yum install pam*

    //pam验证,概念和配置可参考   http://www.2cto.com/os/201303/198419.html

    yum install db4*

    //支持文件数据库,配合pam进行身份验证。

    vsftpd配置

    因为配置文件里面很多都是围绕着三种用户配置的,所以首先我们来说一下可以访问vsftpd的三种用户:

    1. 匿名用户: 顾名思义,就是未纳入vsftpd管理的用户。

    2. 系统用户: linux本身存在的用户,是我们通过useradd等方式添加的。

    3. 虚拟用户:本身不存在的用户,只是依赖于系统用户来访问的。

    如果只是这么解释,大家一定还是不太懂,接下来为们详细结合实践解释一下:

    现在,我们先以默认的配置文件启动vsftpd服务:

    service vsftpd start

    然后,我们就可以开始简单的测试和认证了,假设我这台安装vsftpd的服务器地址是10.23.34.45(随便给的):

    如上,我们发现vsftpd默认是允许匿名用户去访问的,而匿名用户访问的是经过chroot的/var/ftp路径,不是我们传统意义是的linux / 目录。  如果我是用我自己的账户如wangxinyu登录的,那么我pwd应该是/home/wangxinyu,也就是说vsftpd默认会将链接过来的用户的访问路径放在了他们各自的家目录。 (匿名用户默认放在了/var/ftp下)

    结合pam和db4创建vsftpd虚拟用户访问:

    1.  首先,我创建一个虚拟用户名单文件:

    cat  /etc/vsftpd/virtualuser

    kobe                                            // 虚拟用户名

    kobebryant                               //虚拟用户密码

    这里virtualuser只是一个普通的文件而已,我们怎么让他纳入到系统的权限认证和vsftpd的管理呢?

    首先, 将刚添加的virtualuser虚拟用户口令文件转换成系统识别的口令认证文件:

    db_load -T -t hash -f /etc/vsftpd/virtualuser /etc/vsftpd/virtualusers.db       //这里的db_load来自于db4

    选项-T允许应用程序能够将文本文件转译载入进数据库。由于我们之后是将虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个应用程序能够通过文本来载入用户数据,必须要使用这个选项。

    子选项-t,追加在在-T选项后,用来指定转译载入的数据库类型。-t可以指定的数据类型有Btree、Hash、Queue和Recon数据库。这里,接下来我们需要指定的是Hash型。

    然后,设定PAM验证文件,并指定虚拟用户数据库文件进行读取 /etc/pam.d/vsftpd:

    yy

    auth是指对用户的用户名口令进行验证。

    accout是指对用户的帐户有哪些权限哪些限制进行验证。

    required   表示根据auth或者account进行验证:

    —— 如果没有通过 ,验证失败  。

    —— 如果通过 ,且还要看后续模块的验证。

    最后,我根据之前对配置文件项的更改整理出如下一份配置文件:

    yy

    yy

    测试成功!

     

    参考:

    http://www.cnblogs.com/kuliuheng/p/3209744.html

    http://wuhaoshu.blog.51cto.com/845270/489292

    https://segmentfault.com/a/1190000000438443  //虚拟用户配置