vsftpd介绍

VSFTP是一个在UNIX/Linux操作系统上运行的FTP服务器,安全性是它的一个最大的特点。它可以运行在诸如Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开发源代码的FTP服务器软件,支持很多其他的FTP服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。

本文所有配置是在CentOS 5.8-64位系统上进行,配置的是vsftp虚拟用户模式,虚拟用户的特点是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源。所以,如果想让用户对FTP服务器站内具有写权限,但又不允许访问系统其它资源,可以使用虚拟用户来提高系统的安全性。

安装vsftpd和db_load加密工具

#要关闭selinux 和防火墙或者开启允许的端口,不然访问会有问题
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
#关闭防火墙
#centos6
service iptables stop
#centos7
systemctl stop firewalld.service
#安装vsftp和db_load
yum install vsftpd db4-utils -y

添加宿主用户

新建系统用户vsftpd,用户目录为/home/vsftpd, 用户登录终端设为/bin/false(即使之不能登录系统)

useradd vsftpd -d /home/vsftpd -s /bin/false

所配置的虚拟用户其实都是映射成配置的宿主用户。

建立虚拟用户名单文件

touch /etc/vsftpd/virtusers

编辑虚拟用户名单文件:

单行为账号,双行为密码,注意:不能使用root做用户名,系统保留

vi /etc/vsftpd/virtusers

生成虚拟用户数据文件

db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db

修改认证方式

修改/etc/pam.d/vsftpd配置文件

#%PAM-1.0
#session    optional     pam_keyinit.so    force revoke
#auth       required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth       required    pam_shells.so
#auth       include password-auth
#account    include password-auth
#session    required     pam_loginuid.so
#session    include password-auth

auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers

注意:如果系统为32位,上面lib64改为lib,否则配置不生效。

建立虚拟用户个人Vsftp的配置文件

建立目录

mkdir /etc/vsftpd/vconf
cd /etc/vsftpd/vconf

编辑虚拟用户配置文件

配置文件名必须为虚拟用户名

touch ftp01
vi ftp01

添加以下内容

#虚拟用户登录后的根目录
local_root=/home/vsftpd/ftp01
anon_umask=022
#开放虚拟用户的下载权限。
anon_world_readable_only=YES
#开放虚拟用户的写权限
write_enable=YES
#开放虚拟用户的下载权限
anon_world_readable_only=YES
#开放虚拟用户的上传权限
anon_upload_enable=YES
#开放虚拟用户创建目录的权限
anon_mkdir_write_enable=YES
#开放虚拟用户删除和重命名的权限
anon_other_write_enable=YES

配置vsftpd

编辑/etc/vsftpd/vsftpd.conf文件

#修改默认21端口为5151,可不用修改
listen_port=5151
#设定不允许匿名访问 
anonymous_enable=NO
#设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问 
local_enable=YES
#使用户不能离开主目录
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
#设定支持ASCII模式的上传和下载功能 
ascii_upload_enable=YES
ascii_download_enable=YES
#PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证
pam_service_name=vsftpd
#下面的配置在vsftpd.conf中末尾手动添加
#设定启用虚拟用户功能 
guest_enable=YES
#指定虚拟用户的宿主用户
guest_username=vsftpd
#设定虚拟用户个人vsftp的FTP服务文件存放路径。
user_config_dir=/etc/vsftpd/vconf
allow_writeable_chroot=YES
virtual_use_local_privs=YES

重启vsftpd服务器

# 生成chroot_list文件
touch /etc/vsftpd/chroot_list
#centos6
service vsftpd restart 
#centos7
systemctl restart vsftpd.service

其他配置

虚拟目录配置

比如:

把/home/a 映射为 ftp://localhost/a

把/home/b/c 则为 ftp://localhost/c

解决办法

[root@localhost ~]# mount --bind 原有的目录 新目录

操作

# 创建新目录
[root@localhost ~]# mkdir /home/public/soft
# 然后执行mount命令  
[root@localhost ~]# mount --bind /mnt/soft /home/public/soft 

查看是否挂载成功:进入/home/public/soft目录,查看内容是否和/mnt/soft下面的内容一致,如果一致则映射成功。

按照上面的设置在服务器重新启动的时候,mount 就会失效,我们再配置开机自动mount

[root@localhost etc]# vi /etc/fstab    
# 将下面的语句添加到/etc/fstab文件的末尾 
/mnt/soft /home/public/soft   auto bind 0 0 

修改vsftp端口

1.在文件/etc/vsftpd/vsftpd.conf末尾添加listen_port=2121

2.修改/etc/services,将将其中的 ftp 21/tcp 改为 ftp 2121/tcp , ftp 21/udp改为 ftp 2121/udp,即

ftp   21/tcp   ------->       ftp      2121/tcp
ftp   21/udp   ------->       ftp      2121/udp

常见问题

上传文件的权限配置

设置上传之后文件的权限,有两种情况:

  1. 如果使用vsftp的是本地用户,则要修改配置文件中的 local_umask 的值。
  2. 如果使用vsftp的是虚拟用户,则要修改配置文件中的 anon_umask 的值。

登陆ftp服务器,报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()

原因在于,从vsftpd_2.3.5版开始,取消了登陆用户的根目录的可写权限。

解决办法1:

去掉该用户根目录的写的权限,再新建一目录,以后用新目录

解决办法2:

保持旧版的管理策略,ftp用户根目录还是可以设置为可写权限。

在vsftpd.conf中添加如下配置

allow_writeable_chroot=YES