FTP服务:使用 vsftpd 服务传输文件

1.文件传输协议

  今天的互联网是由几千万台个人计算机、工作站、服务器、小型机、大型 机、巨型机等具有不同型号、不同架构的物理设备共同组成的,而且即便是个人计算机,也 可能会装有 Windows、Linux、UNIX、Mac 等不同的操作系统。为了能够在如此复杂多样的 设备之间解决问题解决文件传输问题,文件传输协议(FTP)应运而生。 

  FTP 是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用 20、21 号端口,其中端口 20(数据端口)用于进行数据传输,端口 21(命令端口)用于接受客户端 发出的相关 FTP 命令与参数。FTP 服务器普遍部署于内网中,具有容易搭建、方便管理的特点。FTP 协议的传输拓扑如图 11-1 所示:

  FTP 服务器是按照 FTP 协议在互联网上提供文件存储和访问服务的主机,FTP 客户 端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP 协议有下面两种工作模式:

  ➢主动模式:FTP 服务器主动向客户端发起连接请求。
  ➢被动模式:FTP 服务器等待客户端发起连接请求(FTP 的默认工作模式)。

防火墙一般是用于过滤从外网进入内网的流 量,因此有些时候需要将 FTP 的工作模式设置为主动模式,才可以传输数据。 vsftpd(very secure ftp daemon,非常安全的 FTP 守护进程)是一款运行在 Linux 操作系 统上的 FTP 服务程序。

1.1 FTP安装及其主配置文件参数

第一步:配置妥当 Yum 软件仓库之后,就可以安装 vsftpd 服务程序

    yum  install  vsftpd

第二步:iptables 防火墙管理工具默认禁止了 FTP 传输协议的端口号,清空 iptables 防火墙的默认策 略,并把当前已经被清理的防火墙策略状态保存下来

    iptables -F

    service  iptables  save

第三步:查看vsftpd 服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)

     grep 命令后面添加-v 参数,过滤并反选出没有包含井号(#)的参数。既过滤所有包含(#)的参数。

第四步:vsftpd 服务程序主配置文件中常用的参数以及作用

2.vsftpd 服务程序 

  vsftpd 作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到 FTP 服务器上:

  ➢ 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到 FTP 服务器。 

  ➢ 本地用户模式:是通过 Linux 系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可 以畅通无阻地登录 FTP 服务器,从而完全控制整台服务器。   

  ➢ 虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为 FTP 服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在 服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。

ftp 是 Linux 系统中以命令行界面的方式来管理 FTP 传输服务的客户端工具。我们首先手 动安装这个 ftp 客户端工具,以便在后续实验中查看结果。

 

2.1匿名开放模式 

    匿名开放模式是最不安全的一种认证模式。任何人都可以无需密码验证而直接登录到 FTP 服务器。这种模式一般用来访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。

    vsftpd 服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下 载文件的权限,以及让匿名用户创建、删除、更名文件的权限。需要注意的是,针对匿名用户 放开这些权限会带来潜在危险。不建议在生产环境中如此行事。表 11-2 罗列了可以向匿名用户开放的权限参数以及作用。

在 vsftpd 服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启 vsftpd 服务程序,让新的配置参数生效。

现在就可以在客户端执行 ftp 命令连接到远程的 FTP 服务器了。在 vsftpd 服务程序的匿 名开放认证模式下,其账户统一为 anonymous,密码为空。而且在连接到 FTP 服务器后,默 认访问的是/var/ftp 目录。我们可以切换到该目录下的 pub 目录中,然后尝试创建一个新的目 录文件,以检验是否拥有写入权限: 

系统显示拒绝创建目录!我们明明在前面清空了 iptables 防火墙策略,而且也在 vsftpd 服 务程序的主配置文件中添加了允许匿名用户创建目录和写入文件的权限啊。在 vsftpd 服务程序的匿名开放认证模式下,默认访问的是/var/ftp 目录。查看 该目录的权限得知,只有 root 管理员才有写入权限。怪不得系统会拒绝操作呢!下面将目录 的所有者身份改成系统账户 ftp 即可(该账户在系统中已经存在),这样应该可以了吧: 

再次报错,由此我们猜测可能是SELinux在搞鬼,下面使用 getsebool 命令查看与 FTP 相关的 SELinux 域策略都有哪些:

我们可以根据经验(需要长期培养,别无它法)和策略的名称判断出是 ftpd_full_access--> off 策略规则导致了操作失败。接下来修改该策略规则,并且在设置时使用-P 参数让修改过的策略永 久生效,确保在服务器重启后依然能够顺利写入文件。 

现在便可以顺利执行文件创建、修改及删除等操作了。 

2.2本地用户模式 

  相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单。如果大家之前用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。针对本地用户模式的 权限参数以及作用如表 11-3 所示。 

在 vsftpd 服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启 vsftpd 服务程序,让新的配置参数生效。在执行完上一个实验后还原了虚拟机的读者,还需要将配 置好的服务添加到开机启动项中,以便在系统重启自后依然可以正常使用 vsftpd 服务。

按理来讲,现在已经完全可以本地用户的身份登录 FTP 服务器了。但是在使用 root 管理 员登录后,系统提示如下的错误信息:

vsftpd 服务程序为了保证服务器的安全性而默认禁止了 root 管理员和大多数 系统用户的登录行为,这样可以有效地避免黑客通过 FTP 服务对 root 管理员密码进行暴力破 解。可见,在我们输入root管理员的密码之前,就已经被系统拒绝访问了。这是因为 vsftpd 服务 程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers 和 user_list)。该名单为禁止访问的名单。

在采用本地用户模式登录 FTP 服务器后,默认访问的是该用户的家目录,也就是说,访 问的是/home/wenhewen 目录。而且该目录的默认所有者、所属组都是该用户自己,因此不存 在写入权限不足的情况。但是当前的操作仍然被拒绝,是因为我们刚才将虚拟机系统还原到 最初的状态了。为此,需要再次开启 SELinux 域中对 FTP 服务的允许策略:

在配置妥当后再使用本地用户尝试登录下 FTP 服务器,分别执行文件的创建、重命名及 删除等命令。操作均成功!如果想用root用户登陆,需要在/etc/vsftp 中的ftpusers 和 user_list

总结:如果你想给某个用户分配一个账号供它去访问FTP服务器中的资源时,可以现在Linux中新建用户和设置其密码,并且注意在/etc/vsftpd/user_list或者/etc/vsftpd/ftpusers文件中允许登陆的用户名删除,否则无法登陆FTP服务器。(密码都不给输入,直接拒绝登陆)。

useradd  test_name

passwd  test_name    (假设密码设置为123456)

vim  /etc/vsftp/user_list        #删除用户 test_name

客户端登陆测试即可。

 

2.3  虚拟用户模式 

    第一步:创建用于进行 FTP 认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。例如,我们分别创建出 zhangsan 和 lisi 两个用户,密码均为 redhat

    但是,明文信息既不安全,也不符合让 vsftpd 服务程序直接加载的格式,因此需要使 用 db_load 命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低 数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件 删除。

    第二步:创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP 服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。

        由于 Linux 系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三” 新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此, 需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录 到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于 这个系统本地用户,从而避免 Linux 系统无法处理虚拟用户所创建文件的属性权限。 

        为了方便管理 FTP 服务器上的数据,可以把这个系统本地用户的家目录设置为/var 目录 (该目录用来存放经常发生改变的数据)。并且为了安全起见,我们将这个系统本地用户设置 为不允许登录 FTP 服务器,这不会影响虚拟用户登录,而且还可以避免黑客通过这个系统本 地用户进行登录。

    第三步:建立用于支持虚拟用户的 PAM 文件.       

        PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的 API 把系统提 供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。通俗来讲,PAM 是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认 证方式,而不必对应用程序进行任何修改。PAM 采取了分层设计(应用程序层、应用接口层、 鉴别模块层)的思想,其结构如图 11-2 所示。 

新建一个用于虚拟用户认证的 PAM 文件 vsftpd.vu,其中 PAM 文件内的“db=”参数为 使用 db_load 命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀: 

    第四步:在 vsftpd 服务程序的主配置文件中通过 pam_service_name 参数将 PAM 认证文件的名称修改为 vsftpd.vu,PAM 作为应用程序层与鉴别模块层的连接纽带,可以让应用程 序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要 PAM 认证时,则需要在 应用程序中定义负责认证的 PAM 配置文件,实现所需的认证功能。

        例如,在 vsftpd 服务程序的主配置文件中默认就带有参数 pam_service_name=vsftpd,表 示登录 FTP 服务器时是根据/etc/pam.d/vsftpd 文件进行安全认证的。现在我们要做的就是把 vsftpd 主配置文件中原有的 PAM 认证文件 vsftpd 修改为新建的 vsftpd.vu 文件即可。该操作中 用到的参数以及作用如表 11-4 所示。

    第五步:为虚拟用户设置不同的权限。虽然账户 zhangsan 和 lisi 都是用于 vsftpd 服务程序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、修 改、查看、删除文件,只允许李四查看文件。这可以通过 vsftpd 服务程序来实现。只需新建 一个目录,在里面分别创建两个以 zhangsan 和 lisi 命名的文件,其中在名为 zhangsan 的文件 中写入允许的相关权限(使用匿名用户的参数):

然后再次修改 vsftpd 主配置文件,通过添加 user_config_dir 参数来定义这两个虚拟用户 不同权限的配置文件所存放的路径。为了让修改后的参数立即生效,需要重启 vsftpd 服务程 序并将该服务添加到开机启动项中: 

    第六步:设置 SELinux 域允许策略,然后使用虚拟用户模式登录 FTP 服务器。相信大家可以猜到,SELinux 会继续来捣乱。所以,先按照前面实验中的步骤开启 SELinux 域的允许策略,以免再次出现操作失败的情况:

此时,不但可以使用虚拟用户模式成功登录到 FTP 服务器,还可以分别使用账户 zhangsan 和 lisi 来检验他们的权限。实验测试结果如下:

【注意】用户lisi创建文件夹test时被拒绝,但是zhangsan可以成功创建文件夹test。原因参考第五步!

 

posted @ 2019-01-02 18:13  802.11  阅读(1607)  评论(0编辑  收藏  举报