共计 4349 个字符,预计需要花费 11 分钟才能阅读完成。
vsFTP 介绍
ftp 是一种古老的明文传输协议,因为其明文传输的特性,也出现过很多重大的危机,进而逐渐演变为支持加密传输的 VSFTP(very security FTP),而 CentOS 默认自带的 FTP 就为 VSFTP。本文主要介绍下 VFSTP 的传输原理与搭建。为了避免干扰,实验前请关闭 Selinux 和 IPtables。
FTP 传输机制
FTP 通过 21 端口与 Client 端进行指令传输,通过 20 端口进行数据传输,根据工作模式的不同 VSFTP 分为主动模式和被动模式 2 种,大多是情况 VSFTP 是工作在被动模式下。
主动模特性为:
1.Client 端以一个大于 1024 的 随机端口 向 FTP 服务器的 21 号端口发出建立连接请求
2.Server 端收到请求后,会以 20 端口主动去链接 Client 端的 随机端口 +1号端口,如果该端口被占用,则回去找随机端口 + 2 号端口以此类推,直到找 Client 端空闲的端口
3.Client 端与 Server 端通过 20 端口进行数据传输
被动模式特性为:
1.Client 端以一个大于 1024 的 随机端口 向 FTP 服务器的 21 号端口发出建立连接请求
2.Server 端会通过 21 号端口给 Client 端发送一个类似(xyz,ab)的数值来告诉 Client 端打开的随机端口,同时打开 xyz*256+ab 端口
3.Client 端再通过一个随机端口连接 Server 端的 xyz*256+ab 端口进行数据传输
而现实环境中无论是 Client 端还是 Server 端都是在防火墙后面,在主动模式下 VSFTP 会链接 Client 端的随机 + 1 号端口,Client 端显然不会将防火墙上所有随机端口开放;而在被动下问题同样的问题仍然会摆在 Server 端的防火墙面前,这就需要 Server 端的防火墙开启连接追踪功能,即放行与 21 号端口有关联的端口访问请求,这也就是为什么大部分情况下 VSFTP 是以被动模式工作
安装 VSFTP
了解了 VSFTP 的工作原理后,下面就来介绍下 VSFTP 的搭建,使用命令
yum -y install vsftpd 安装 VSFTP 服务
使用 rpm -qc vsftp 查看 VSFTP 的配置文件
/etc/logrotate.d/vsftpd 滚动日志配置文件
/etc/pam.d/vsftpd 认证文件,pam 全称为 Plugable Authentication
Module 插件式认证模块,该文件名必须和 /etc/vsftpd/vsftpd.conf 中
pam_service_name 后的文件名保持一致
/etc/vsftpd/ftpusers 控制登陆系统用户的机制,出现在该文件中的用户不允许使用 ftp 服务器,这是在 /etc/pam.d/vsftpd 中定义的
/etc/vsftpd/user_list 配合 /etc/vsftpd/vsftpd.conf 中的 userlist_enable=YES 和 userlist_deny=YES|NO 实现黑白名单此处 需要注意 的是:黑白名单的前提是 /etc/vsftpd/vsftpd.conf 配置文件中 userlist_enable=YES,userlist_deny 选项默认为 YES(黑名单),即该文件中出现的用户不允许登陆 VSFTP,就算手动添加 userlist_deny=NO(白名单)即只允许该文件中出现的用户允许登陆 VSFTP,在 VSFTP 启动时依然会去检查 /etc/vsftpd/ftpusers 文件并且禁止该文件中的用户登录
/etc/vsftpd/vsftpd.conf VSFTP 主配置文件,所有的配置选项必须 顶格 写,配置文件中 #后带空格的是说明,不带空格的是注释掉的配置选项
VSFTP 的登陆类型
VSFTP 提供了系统用户、匿名用户、和虚拟用户三种不同的登陆方式。所有的虚拟用户会映射成一个系统用户,访问时的文件目录是为此系统用户的家目录;匿名用户也是虚拟用户,映射的系统用户为 ftp,详细信息可以通过 man nsftpd.conf 查看
匿名用户登陆配置
在 /etc/vsftpd/vsftpd.conf 配置文件中设置 anonymous_enable=YES,就可以允许虚拟用户登陆,即使系统用户的设置为 local_enable=NO 也可以登陆,但除了查看和下载到本地外,无任何其他操作权限
此时还需要在配置文件中设置其他四个选项:
anonymous_enable=YES 启动虚拟用户登录
anon_upload_enable=YES 允许虚拟用户有写权限
anon_other_write_enable=YES 允许虚拟用户有删除权限
anon_mkdir_write_enable=YES 允许虚拟用户创建文件夹权限
添加完后重启 VSFTP 服务,再次尝试发现结果和上次一样,原因是系统用户 ftp 对 pub 目录没有写入权限
更改 pub 目录权限后一切正常,所以 最终生效的权限取决于服务权限与系统权限的交集
通过上面知道匿名用户访问的文件目录为 /var/ftp/pub,但是匿名用户自己却认为在 / 目录下,说明默认情况下匿名用户就是被 chroot 的
另外需要 注意 的一点是:更改系统权限的时候只能针对 var/ftp/ 下的 pub 目录,如果更改的是 /var 下的 ftp 目录权限,此时就算配置文件中允许匿名用户登录,访问时依然会提示你输入用户名和密码
系统用户登录配置
系统用户即为存在于 /etc/passwd 中的用户,在 /etc/vsftpd/vsftpd.conf 文件中设置项为 local_enable=YES,使用系统用户登录后文件夹为该用户的家目录,默认不做其他设置时用户可以从自己的家目录切换到其他任意目录下,会有一定的安全隐患
所以在使用系统用户作为 VSFTP 的登录用户时,推荐执行以下 2 个步骤:
1. 添加用户时使用命令 useradd -s /sbin/nologin userName 禁止该用户登录系统
2. 启用 chroot_local_user=YES 选项,这样该用户登录 FTP 后就会禁锢在自己的家目录
需要说明的一点是,我们看到 /etc/vsftpd/vsftpd.conf 配置文件中 chroot_list_enable=YES 和 chroot_list_file=/etc/vsftpd/chroot_list 两项默认也是被注销的,它的功能是指定一个chroot_list 文件,只有写在该文件中的用户会被 chroot,其他用户不会被 chroot,该功能和 chroot_local_user 选项不能同时存在
显然,无论是匿名用户还是系统用户,安全性上都存在一定隐患,所以对于安全性要求较高的场景还可以使用虚拟用户的方式,它是对一个文件中存放的用户及密码进行认证,认证通过后再将其重映射为一个虚拟用户,存放用户及密码的文件可以是 hash 编码的文件,也可以是关系型数据库
虚拟用户登陆配置
首先在 /etc/vsftpd/vsftpd.conf 配置文件中添加guest_enable=YES 选项,它的作用是将一个非匿名用户重映射为系统用户, 默认为 ftp,或者 可以指定映射的系统用户名,被指定的系统用户必须存在,且在 /home/ 下有和该用户同名的目录
以 vsftp 作为重映射的系统用户举例来说:
1. 输入 useradd -s /sbin/nologin vsftp 创建用户且不允许登录系统
2.mkdir /home/vsftp 创建 vsftp 用户家目录
3.chown vsftp:vsftp /home/vsftp 修改目录所有权
4. 在 /etc/vsftpd/vsftp.conf 主配置文件中启用下面两个配置项
在 /home/vsftp 目录下创建一个 hahaha 文件,再使用系统用户登录,会发现已经被重映像到 vsftp 的用户家目录中
关于虚拟用户登陆配置需要注意的 2 点是:
1.虚拟用户默认继承主配置文件中匿名用户的权限,只有在开启匿名用户权限情况下虚拟用户才有修改权限
2. 虚拟用户是映射为一个系统用户,必须设置为 local_enable=YES,否则当 anonymous_enable=NO 时将无法登陆,这点和 当 local_enable=NO 时匿名用户仍可登录 不一样,虽然匿名用户是映射为系统的 ftp 用户
在生产环境中推荐使用安全性更高的虚拟用户登陆,但有时我们有希望对虚拟用户的权限可以进行划分,允许某些用户有特定权限,这就需要用到 user_config_dir 配置项了
通过该选项说明,可以知道如果需要对虚拟用户进行权限划分的步骤为:
1. 关闭主配置文件中匿名用户的更改权限
2. 在主配置文件添加启该选项并指明该选项所在的目录位置
3. 使用命令 mkdir /etc/vsftpd/user_conf 创建该目录
4. 在 /etc/vsftpd/user_conf 中为每个虚拟用户创建一个与用户名相同的配置文件,此处以 asd 和 qwe 用户为例
验证虚拟用户权限
分别设置每个用户的操作权限,空白表示没有任何权限,此处仅对 asd 用户添加权限,用户 qwe 的文件中保持空白
分别使用 asd 和 qwe 虚拟用户登录,可以看到虽然都是被重映射到同一目录内,但是只有 asd 用户有权限进行修改操作,至此测试完成
玩转 vsftpd 服务器的四大高级配置:http://www.linuxidc.com/Linux/2013-09/90565.htm
vsFTPd 配置教程:http://www.linuxidc.com/Linux/2013-09/90562.htm
Ubuntu 实用简单的 FTP 架设 http://www.linuxidc.com/Linux/2012-02/55346.htm
Ubuntu 上架设 FTP 服务器和 Apache 服务器 http://www.linuxidc.com/Linux/2011-04/35295.htm
Ubuntu 13.04 安装 LAMP\vsftpd\Webmin\phpMyAdmin 服务及设置 http://www.linuxidc.com/Linux/2013-06/86250.htm
RHEL6 平台下 SeLinux 和 vsftpd 的匿名上传的简单案例 http://www.linuxidc.com/Linux/2013-04/82300.htm
Linux 系统 vsftpd 源码安装 http://www.linuxidc.com/Linux/2013-03/81475.htm
openSUSE 13.2/13.1 下安装配置 FTP 服务器 vsftpd http://www.linuxidc.com/Linux/2014-12/110070.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-10/136144.htm