Linux学习(十)使用Vsftpd服务传输文件

1. 文件传输协议

  FTP 是一种在互联网中进行文件传输的协议,基于客户端/服务端模式,默认使用 20、21 号端口,其中端口 20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关 FTP 命令与参数。FTP 协议有下面两种工作模式。

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

防火墙一般是用于过滤从外网进入内网的流量,因此有些时候需要将FTP的工作模式设置为主动模式,才可以传输数据。

1.1 安装 vsftpd 服务

vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序。

# 安装 vsftpd 服务
[root@localhost html]# yum -y install vsftpd

# 开机自启
[root@localhost html]# systemctl enable vsftpd

vsftpd 主配置文件(/etc/vsftpd/vsftpd.conf)中常用的参数以及作用:

参数作用
listen=[YES|NO]是否以独立运行的方式监听服务
listen_address=IP地址设置要监听的IP地址
listen_port=21设置FTP服务的监听端口
download_enable=[YES|NO]是否允许下载文件
userlist_enable=[YES|NO]
userlist_deny=[YES|NO]
设置用户列表为“允许”还是“禁止”操作
max_clients=0最大客户端连接数,0为不限制
max_per_ip=0同一IP地址的最大连接数,0为不限制
anonymous_enable=[YES|NO]是否允许匿名用户访问
anon_upload_enable=[YES|NO]是否允许匿名用户上传文件
anon_umask=022匿名用户上传文件的umask值
anon_root=/var/ftp匿名用户的FTP根目录
anon_mkdir_write_enable=[YES|NO]是否允许匿名用户创建目录
anon_other_write_enable=[YES|NO]是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限)
anon_max_rate=0匿名用户的最大传输速率(字节/秒),0为不限制
local_enable=[YES|NO]是否允许本地用户登录FTP
local_umask=022本地用户上传文件的umask值
local_root=/var/ftp本地用户的FTP根目录
chroot_local_user=[YES|NO]是否将用户权限禁锢在FTP目录,以确保安全
local_max_rate=0本地用户最大传输速率(字节/秒),0为不限制

1.2 Vsftpd 服务程序

vsftpd 允许用户以三种认证模式登录到FTP服务器上。

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

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

虚拟用户模式:最安全的一种认证模式,需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

1.2.1 匿名访问模式

  vsftpd 默认开启了匿名模式,可以查看文件。我们要做的是开放匿名用户的上传、下载、创建、删除、修改等权限。针对匿名用户放开这些权限会带来潜在危险,我们只是为了练习而放开了这些权限,不建议在生产环境中操作。

向匿名用户开放的权限参数以及作用:

参数作用
anonymous_enable=YES允许匿名访问模式
anon_upload_enable=YES允许匿名用户上传文件
anon_mkdir_write_enable=YES允许匿名用户创建目录
anon_other_write_enable=YES允许匿名用户修改目录名称或删除目录
anon_root匿名用户FTP根目录,默认/var/ftp
# 备份配置文件
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf.bak

# 编辑配置文件,修改以下配置
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_root=/var/ftp

# 重启 vsftpd 服务
[root@localhost vsftpd]# systemctl restart vsftpd

重启服务后,新建文件发现权限错误,经检查FTP根目录没有读写权限。这里有个问题,如果直接 /var/ftp/ 赋予 o+w 的权限后,会导致 ftp 服务访问不了。

# 修改本地用户的FTP根目录权限
[root@localhost ftp]# chmod o+wr /var/ftp/pub/

1.2.2 本地用户模式

  相对于匿名模式,本地用户模式要更安全,配置起来也很简单。如果大家之前用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。

本地用户模式使用的权限参数以及作用:

参数作用
anonymous_enable=NO禁止匿名访问模式
local_enable=YES允许本地用户模式
write_enable=YES设置可写权限
local_umask=022本地用户模式创建文件的umask值
userlist_deny=YES启用“禁止用户名单”,名单文件为ftpusers和user_list
userlist_enable=YES开启用户作用名单文件功能
local_root=/var/ftp/pub系统用户默认FTP根目录,如果不配置会默认用户的 home 目录为根目录。
# 编辑配置文件,修改以下配置
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
  
  local_root=/var/ftp/pub
  anonymous_enable=NO
  local_enable=YES
  write_enable=YES
  local_umask=022

# 重启服务
[root@localhost ftp]# systemctl restart vsftpd

  按理来讲,现在已经完全可以本地用户的身份登录FTP服务器了。但是我们使用root管理员登录时被系统拒绝访问了。这是因为vsftpd 服务程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers 和 user_list)。我们查看文件 user_list ,发现 vsftpd 服务程序为了保证服务器的安全性而默认禁止了root管理员。

[root@localhost /]# cat /etc/vsftpd/user_list 
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
......

vsftp 还可以为不同用户配置不同的根目录。详情参考

1.2.3 虚拟用户模式

虚拟用户模式是这三种模式中最安全的一种认证模式,配置流程也稍微复杂一些。

# 第1步:创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。分别创建出zhangsan和lisi两个用户,密码均为redhat:
[root@localhost /]# vim /etc/vsftpd/vuser.list

zhangsan
redhat
lisi
redhat

# 使用 db_load 命令用哈希(hash)算法将明文信息转换成数据库文件
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@localhost vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@localhost vsftpd]# chmod 600 vuser.db
# 删除 vuser
[root@localhost vsftpd]# rm -f vuser.list

# 新建一个用于虚拟用户认证的PAM文件vsftpd.vu
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser

# 创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户
[root@localhost vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@localhost vsftpd]# chmod -Rf 755 /var/ftproot/

# 新建一个用于虚拟用户认证的PAM文件vsftpd.vu
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser

修改 vsftpd 服务程序的主配置文件,利用PAM文件进行认证时使用的参数以及作用。

参数作用
anonymous_enable=NO禁止匿名开放模式
local_enable=YES允许本地用户模式
guest_enable=YES开启虚拟用户模式
guest_username=virtual指定虚拟用户账户
pam_service_name=vsftpd.vu指定PAM文件
allow_writeable_chroot=YES允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
pam_service_name=vsftpd.vu

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

[root@localhost vsftpd]# mkdir /etc/vsftpd/vusers_dir/
[root@localhost vsftpd]# cd /etc/vsftpd/vusers_dir/
[root@localhost vusers_dir]# touch lisi
[root@localhost vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

# 通过添加 user_config_dir 参数来定义这两个虚拟用户不同权限的配置文件所存放的路径
[root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://dukec.cn/archives/linux学习十使用vsftpd服务传输文件

Buy me a cup of coffee ☕.