系统环境和预计目标

  1. CentOS 7.4
  2. ftp 根目录 : /data/ftp
  3. ftp 配置文件目录: /etc/vsftpd
  4. ftp 虚拟用户权限配置文件目录: /etc/vsftpd/vuser_config

操作步骤

  1. 安装vsftpd和db_load加密工具

    #修改配置文件
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 
    #临时关闭
    setenforce 0  
    #关闭防火墙
    systemctl stop firewalld.service 
    yum install vsftpd -y
  2. 创建本地用户用于映射虚拟用户

    # 创建ftp用户目录
    mkdir -p /data/ftp
    # 创建用户
    useradd -d /data/ftp vuser -s /sbin/nologin
    # 更改权限和主组权限
    chmod 755 /data/ftp
    chown vuser.root /data/ftp
  3. 创建虚拟用户文件

    vim /etc/vsftpd/vuser-list
    

用户名一行,密码一行

li
123123123
li1
123123123


4. 加密用户密码文件生成数据库文件
```bash
cd /etc/vsftpd
db_load -T -t hash -f ./vuser-list ./vuser-list.db
chmod 600 vuser-list.db
  1. 创建PAM认证文件
    vim /etc/pam.d/vuser.vu
    

PAM认证模块

#注意64位系统写/lib64这个路径,32位系统要写成/lib
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser-list
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser-list


6. 修改配置文件
```bash
# 先备份
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf-bak
vim /etc/vsftpd/vsftpd.conf


#是否开启匿名登陆
anonymous_enable=YES

local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#登陆日志地址
xferlog_file=/var/log/xferlog
xferlog_std_format=YES

listen=YES
listen_ipv6=NO

#修改ftp默认目录到/data/ftp下面
chroot_local_user=YES
#使用户不能离开主目录
chroot_list_enable=YES
#设定支持ASCII
ascii_upload_enable=YES
ascii_download_enable=YES
local_root=/data/ftp
anon_root=/data/ftp

#pam认证文件
pam_service_name=vuser.vu

#虚拟用户权限配置目录
user_config_dir=/etc/vsftpd/vuser_config
userlist_enable=YES
tcp_wrappers=YES

allow_writeable_chroot=YES
one_process_model=NO
#开启虚拟用户
guest_enable=YES
guest_username=vuser
  1. 创建虚拟用户权限的配置文件
    mkdir /etc/vsftpd/vuser_config
    cd /etc/vsftpd/vuser_config
    

mkdir -p /data/ftp/li
mkdir -p /data/ftp/li1
chmod 777 /data/ftp/li
chmod 777 /data/ftp/li1

vim li

[有所有权限]

#设置登录后禁锢的目录
local_root=/data/ftp/li
#开放写权限
write_enable=yes
#开放下载权限
anon_world_readable_only=no
#开放上传权限
anon_upload_enable=yes
#开放创建目录的权限
anon_mkdir_write_enable=yes
#开放删除和重命名的权限
anon_other_write_enable=yes

vim li1

[只有上传下载的权限]

local_root=/data/ftp/li1
anon_upload_enable=yes
anon_world_readable_only=no


8. 更改虚拟用户目录权限,目的是不让匿名用户进行访问
```bash
chmod 700 li
chmod 700 li1
  1. 设置ftp自启动systemctl enable vsftpd,打开ftp服务 systemctl start vsftpd,为了验证是否启动,使用systemctl status vsftpd.service查看是否已开启。

  2. 使用xftp或ftp命令进行测试,使用li时可以进行任何操作,包括新建文件夹;使用li1时只能上传和下载,不能新建文件夹,测试有问题则对6和7进行排错。

遇到的问题

  1. useradd可能会出现useradd: warning: the home directory already exists.,是因为默认配置home目录在 /home,导致冲突。第二是因为没有skel目录。没有太大的关系,用户已经成功创建。如果十分纠结这点可以对其建自己的home目录,手动拷贝skel相关文件到home目录下。
  2. 550 OOPS: Permission Denied上传失败或创建文件夹失败,可能是selinux的问题。
  • 关闭selinux:修改 /etc/selinux/config文件中的 SELINUX=""disabled,使用 setenforce 0重启,使用 getenforce查看是否成功disable掉。值得注意的是需要关闭ftp窗口,重新链接才能生效。
  • 不关闭selinux:修改selinux配置,详见参考文档2。
  1. 226 Transfer done (but failed to open directory),selinux和防火墙的问题,重新配置一下第一步。
  2. 500 OOPS vsftpd: refusing to run with writable root inside chroot(),配置文件中加入 allow_writeable_chroot=YES,创建相应文件
    touch /etc/vsftpd/chroot_list
    chmod 644 /etc/vsftpd/chroot_list
  3. 在操作过程中遇到 No such file or directory,表示不存在目录,可使用 mkdir -p进行创建。
  4. 遇到该问题时候,查看6修改配置处是否有错误,拼写错误也可能导致该错误。
    [root@localhost vsftpd]# systemctl status vsftpd.service
    ● vsftpd.service - Vsftpd ftp daemon
    Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
    Active: failed (Result: exit-code) since Mon 2018-01-08 16:22:04 CST; 3min 24s ago
    Process: 1202 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=2)
    

Jan 08 16:22:04 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon…
Jan 08 16:22:04 localhost.localdomain systemd[1]: vsftpd.service: control process exited, code=exited status=2
Jan 08 16:22:04 localhost.localdomain systemd[1]: Failed to start Vsftpd ftp daemon.
Jan 08 16:22:04 localhost.localdomain systemd[1]: Unit vsftpd.service entered failed state.
Jan 08 16:22:04 localhost.localdomain systemd[1]: vsftpd.service failed.

```
7. 出现pam验证通过,但是不能连接的可能是因为配置第七点有一个大坑,是每一行包括文件末尾不能有空格,命令行下会报 500 OOPS: bad bool value in config file for: anon_world_readable_only
8. 550 Create directory operation failed.:目录权限没给写权限,使用 chmod 777 /data/ftp/li即可

注意

  • ftp最好使用命令行,这样返回错误码和错误信息容易排错。
  • 多看日志判断信息。包括 tail -f /var/log/securesystemctl status vsftpd

参考文档