一、Install

install Vsftpd

    yum -y install vsftpd

install Pam:

    yum -y install pam

install DB4:

    yum -y install db4
二、 ftp虚拟用户
  1. 建立Vsftpd虚拟用户的宿主用户(也可以直接用nobody作为虚拟用户的宿主用户)
    useradd overlord -s /sbin/nologin
  1. 编辑虚拟用户名单文件:
    #(第一行账号,第二行密码,注意:不能使用root做用户名,系统保留)
    vim /etc/vsftpd/virtusers
    # 编辑内容,下面是 virtusers 内容
    test
    123456
  1. 添加到chroot管理列表
    vim /etc/vsftpd/chroot_list
    # 用户列表
    test
  1. 利用db_load命令生成数据文件
    db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
    # 设定PAM验证文件,并指定对虚拟用户数据库文件进行读取(权限r,w即可)
    chmod 600 /etc/vsftpd/virtusers.db
  1. vsftpd的虚拟用户的验证配置 /etc/pam.d/vsftpd
  1. 创建虚拟用户个人配置文件
    # 建立虚拟用户个人vsftp的配置文件
    mkdir -p /etc/vsftpd/vconf
    # 进入目录
    cd /etc/vsftpd/vconf

    # 创建并编辑用户的配置文件
    vim test

    # 用户 test 配置目录
    local_root=/home/www/test
    # 允许本地用户对FTP服务器文件具有写权限
    write_enable=YES
  1. 虚拟用户宿主用户需要是local_root目录的用户
    chown -R nobody:nobody /home/vsftpd
三、 配置vsftpd.conf

vsftpd.conf

四、设置防火墙/SELinux
    // 防火墙设置
    firewall-cmd --permanent --zone=public --add-service=ftp
    firewall-cmd --zone=public --add-port=30060-30090/tcp --permanent
    firewall-cmd --reload

    // 设置SELinux
    getsebool -a | grep ftp
    setsebool -P ftpd_full_access on

    // 设置开机自启
    systemctl enable vsftpd
    // 服务操作
    systemctl restart vsftpd.service  # 重启服务
    systemctl start vsftpd.service    # 启动服务
    systemctl status vsftpd.service   # 服务状态查看
参考资料

ftpfromxuzhongfei.zip

ftpAddUse

pamd_vsftpd

vsftpd

vsftpd配置文档

xuzhongfei

用户类型
  • 本地用户(local):用户在FTP服务器拥有账号,且该账号为本地用户的账号,可以通过自己的账号和口令进行授权登录,登录目录为自己的home目录$HOME
  • 虚拟用户(guest):用户在FTP服务器上拥有账号,但该账号只能用于文件传输服务。登录目录为某一特定的目录,通常可以上传和下载
  • 匿名用户(anonymous):用户在FTP服务器上没有账号,登录目录为/var/ftp

对于vsftpd默认配置是开启了本地用户和匿名用户,可以直接登录的。

本篇主要是介绍Vsftp的虚拟用户,虚拟用户并不是系统用户,也就是说这些FTP的用户在系统中是不存在的。他们的总体权限其实是集中 寄托在一个在系统中的某一个用户身上的,所谓Vsftpd的虚拟宿主用户,就是这样一个支持着所有虚拟用户的宿主用户。由于他支撑了 FTP的所有虚拟的用户,那么他本身的权限将会影响着这些虚拟的用户,因此,处于安全性的考虑,也要非分注意对该用户的权限的控制, 该用户也绝对没有登陆系统的必要,这里也设定他为不能登陆系统的用户。(这里插一句:原本在建立上面两个用户的时候,想连用户主路径也不打算给的。本来想加上 -d /home/nowhere 的,据man useradd手册上讲述:

    The new user will be created using HOME_DIR as the value for the
    user login directory. The default is to append the LOGIN name to
    BASE_DIR and use that as the login directory name. The directory
    -d, --home HOME_DIR 
    HOME_DIR does not have to exist but will not be created if it is missing.
连接模式

FTP的连接一般是有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接。FTP服务程序一般会支持两种不同的模式,一种是主动(Port)模式,一种是被动(Passive)模式(又称Pasv Mode),我先说说这两种不同模式连接方式的分别。先假设客户端为C,服务端为S。

  • 主动(Port)模式: 当客户端C向服务端S连接后,使用的是Port模式,那么客户端C会发送一条命令告诉服务端S(客户端C在本地打开了一个端口N在等着你进行数据连接),当服务端S收到这个Port命令后 就会向客户端打开的那个端口N进行连接,这种数据连接就生成了。

  • 被动(Pasv)模式: 当客户端C向服务端S连接后,服务端S会发信息给客户端C,这个信息是(服务端S在本地打开了一个端口M,你现在去连接我吧),当客户端C收到这个信息后,就可以向服务端S的M端口进行连接,连接成功后,数据连接也建立了。

防火墙管理

对于CentOS 7 它的默认防火墙已改为FireWall进行管理,但还是有用iptables的,以及SELinux。

  • firewall能够允许哪些服务可用,那些端口可用…. 属于更高一层的防火墙。 firewall的底层是使用iptables进行数据过滤,建立在iptables之上。 firewall是动态防火墙,使用了D-BUS方式,修改配置不会破坏已有的数据链接。

  • iptables用于过滤数据包,属于网络层防火墙. 在设置iptables后需要重启iptables,会重新加载防火墙模块,而模块的装载将会破坏状态防火墙和确立的连接。会破坏已经对外提供数据链接的程序。可能需要重启程序。

  • SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。它不是用来防火墙设置的。但它对Linux系统的安全很有用。Linux内核(Kernel)从2.6就有了SELinux。 SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。任何程序对其资源享有完全的控制权。假设某个程序打算把含有潜在重要信息的文件扔到/tmp目录下,那么在DAC情况下没人能阻止他。SELinux提供了比传统的UNⅨ权限更好的访问控制。