文档

如何搭建VSFTP及配置虚拟用户

更新时间:

概述

本文主要讲述如何搭建VSFTP及配置虚拟用户。

详细信息

说明

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改

VSFTP服务支持三种用户模式。

  • 匿名用户 默认VSFTP是支持匿名用户的,该用户登录FTP服务使用anonymous用户直接登录,不需要输入密码。

  • 系统用户 可以使用Linux系统本身存在的用户,作为FTP用户,具体哪些用户可以登录FTP,可以通过配置文件指定。

  • 虚拟用户 虚拟用户的特点是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源。所以,如果想让用户对FTP服务器站内具有写权限,但又不允许访问系统其它资源,可以使用虚拟用户来提高系统的安全性。

说明

说明:虚拟用户在登录过程中会被隐射成匿名用户,因为匿名用户的权限是统一配置的,那么如果想区分匿名用户的权限,默认情况是无法实现的。

环境及目标

  • 阿里云公共镜像,Centos 7.6 64位, Linux Version 3.10.0-957.21.3.el7.x86_64

  • vsftpd-3.0.2-25.el7.x86_64

  • 目标是搭建一个FTP,可以使用虚拟用户vuser1登录ftp,支持主动和被动模式。

搭建过程

说明

说明:CentOS 6与CentOS 8操作系统版本结束了生命周期(EOL),按照社区规则,CentOS 6/8的源地址内容已移除。当您在CentOS 6/8系统内继续使用默认配置的源地址时会发生报错。建议您先切换CentOS 6/8的源地址,然后再进行操作。具体操作,请参见CentOS 6 EOL如何切换源?CentOS 8 EOL如何切换源?

  • 执行以下命令安装vsftpd服务。

    yum install vsftpd -y

  • 执行以下命令确认pam_userdb.so模块的位置。

    说明

    说明:cenos7.6 64位系统的位置一般是/lib64/security/pam_userdb.so。

    ls -l /lib64/security/pam_userdb.so

  • 建立虚拟宿主用户。 虚拟用户并不是系统用户,也就是说这些FTP的用户在系统中是不存在的。他们的总体权限其实是集中映射在一个系统用户身上,所谓vsftpd的[虚拟宿主用户],就是这样一个支持着所有虚拟用户的宿主用户。执行以下命令将虚拟用户映射在virtusers这个用户上。

    mkdir /data
    useradd -d /data/ftproot virtusers -s /sbin/nologin
    说明

    -d:指定家目录,这里指定已经创建的ftp根目录 /data/ftproot,具体请以实际情况为准 。 -s:指定系统用户登录的shell,nologin即不允许系统login登录。

  • 建立FTP相关工作目录,以及权限管理。 最新版vsftpd不允许用户主目录有w权限,因此在主目录下新建一个子目录。所有上传、下载、删除、重命名等操作只能在子目录中进行,虚拟用户vuser1的ftp目录是/data/ftproot/vuser1/rootdir,没有w权限,设置权限为500,以下是相关目录权限设置参考。

    /data                                                  #数据目录,便于后期数据备份
    └── [drwxr-xr-x]  ftproot                              #FTP服务目录
        └── [dr-x------]  vuser1                           #虚拟用户主目录,后期可以增加vuser2、vuser3...
            └── [drwxr-xr-x]  rootdir                      #虚拟用户FTP工作目录,可以在此目录读写操作
    说明
    • 此处通过命令 tree -p /data/ 查看/data目录结构树与目录权限。

    • 执行以下命令创建目录。

      mkdir -p /data/ftproot/vuser1/rootdir

    • 执行以下命令进行权限设置。

      chown -R virtusers.virtusers /data/ftproot
      chmod 500 /data/ftproot/vuser1

配置虚拟用户

  • 执行以下命令生成虚拟用户列表。

    vi /etc/vsftpd/vuserlist
    • 虚拟用户列表的内容

      vuser1
      123456
      说明
      • 奇数行为用户名,此处行号1为用户名。

      • 偶数行为用户密码,此处行号2为用户密码。

      • 设置用户密码时,建议将密码设置复杂些。

    • Esc键,输入:wq,按Enter键关闭并保存配置文件

  • 用系统的db_load工具来生成db文件,出于安全角度修改vuserlist.db为600权限。

    db_load -T -t hash -f /etc/vsftpd/vuserlist /etc/vsftpd/vuserlist.db
    chmod 600 /etc/vsftpd/vuserlist.db

  • 修改PAM验证。 修改/etc/pam.d/vsftpd配置参数,/etc/pam.d/vsftpd这个文件名与/etc/vsftpd/vsftpd.confpam_service_name=vsftpd服务名称 vsftpd 要相对应。

    说明

    注释掉/etc/pam.d/vsftpd配置文件中所有参数,在最后面加入以下两行内容。

    • auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuserlist
      account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuserlist
    • Esc键,输入:wq,按Enter键关闭并保存配置文件

  • 创建及配置虚拟用户的配置文件。

    • 创建虚拟用户的配置文件

      mkdir /etc/vsftpd/vuser_conf/

    • 配置虚拟用户的配置文件

      vi /etc/vsftpd/vuser_conf/vuser1

    • 添加以下配置信息

      local_root=/data/ftproot/vuser1
      anon_upload_enable=YES
      anon_world_readable_only=NO
      anon_mkdir_write_enable=YES
      anon_other_write_enable=YES

    • Esc键,输入:wq,按Enter键关闭并保存配置文件

  • 创建文件/etc/vsftpd/chroot_list,并且在文件中添加ftp用户,否则连接ftp会报错。

    touch /etc/vsftpd/chroot_list
    说明

    若不限制虚拟用户访问ftp站点根目录以外的目录,请按照如下步骤操作。此处虚拟用户为vuser1。

    修改文件,文件中添加ftp用户,本文档示例中的ftp虚拟用户是vuser1

    vim /etc/vsftpd/chroot_list

    添加的用户列表内容

    vuser1

    Esc键,输入:wq,按Enter键关闭并保存配置文件。

  • 配置VSFTP的/etc/vsftpd/vsftpd.conf主配置文件。

    • 配置配置项

      #修改如下参数:
      listen=YES
      listen_ipv6=NO
      
      #末尾添加如下参数:
      allow_writeable_chroot=YES
      chroot_local_user=YES
      chroot_list_enable=YES
      chroot_list_file=/etc/vsftpd/chroot_list
      virtual_use_local_privs=YES
      guest_enable=YES
      guest_username=virtusers
      user_config_dir=/etc/vsftpd/vuser_conf
      pasv_enable=YES
      pasv_min_port=30100
      pasv_max_port=30200
      pasv_address=X.X.X.X
      

      说明

      参数说明:

      listen=YES #开启IPv4监听

      listen_ipv6=NO #关闭IPV6监听

      allow_writeable_chroot=YES#开启主目录写入权限

      chroot_local_user=YES #全部用户被限制在主目录

      chroot_list_enable=YES #启用例外用户名单

      chroot_list_file=/etc/vsftpd/chroot_list #指定列表中用户不被锁定在主目录访问其他目录

      virtual_use_local_privs=YES #虚拟用户使用本地用户的权限

      guest_enable=YES #开启虚拟用户

      guest_username=virtusers #指定虚拟用户的宿主用户

      user_config_dir=/etc/vsftpd/vuser_conf #指定虚拟用户配置文件目录

      pasv_enable=YES #开启被动模式

      pasv_min_port=30100 #被动模式最小端口,本示例设置为30100

      pasv_max_port=30200 #被动模式最大端口,本示例设置为30200

      pasv_address=X.X.X.X #被动模式的IP地址,VPC环境下需要设置为服务器公网地址X.X.X.

    • Esc键,输入:wq,按Enter键关闭并保存配置文件。

  • 重启vsftpd服务生效配置。

    sudo systemctl restart vsftpd

结果测试

使用Filezilla等FTP客户端测试,虚拟用户vuser1可以选择主动或被动模式正常访问FTP,并且在工作目录rootdir下可以正常读写文件,创建删除修改目录。

说明

说明:如果被动模式无法访问,请检查安全组是否放行被动模式的端口。

适用于

  • 云服务器ECS