• vsftp


    一、相关文档:

    1.官方文档:http://vsftpd.beasts.org/vsftpd_conf.html

    2.参考文章:https://blog.51cto.com/viong/261291

    2.参考视频:https://www.bilibili.com/video/BV1Vt411M7Pz?p=10

    [root@localhost vsftpd]# yum -y install ftp vsftpd    # ftp客户端、vsftp服务端
    [root@localhost yum.repos.d]# setenforce 0    
    [root@localhost yum.repos.d]# getenforce 
    Permissive
    [root@localhost yum.repos.d]# systemctl stop firewalld.service 
    [root@localhost yum.repos.d]# systemctl disable firewalld.service 
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    #!/bin/bash
    
    cd /etc/yum.repos.d/
    wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
    wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-3.4.3-163.el7.centos.noarch.rpm
    wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-52.el7.noarch.rpm
    wget http://mirrors.163.com/centos/7/os/x86_64/Packages/python-iniparse-0.4-9.el7.noarch.rpm
    wget http://mirrors.163.com/centos/7/os/x86_64/Packages/python-urlgrabber-3.10-9.el7.noarch.rpm
    
    rpm -ivh yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
    rpm -ivh python-iniparse-0.4-9.el7.noarch.rpm
    rpm -ivh python-urlgrabber-3.10-9.el7.noarch.rpm
    rpm -ivh yum-3.4.3-163.el7.centos.noarch.rpm  yum-plugin-fastestmirror-1.1.31-52.el7.noarch.rpm
    wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
    vim CentOS7-Base-163.repo
    :1,$s/$releasever/7
    yum clean all
    yum makecache
    [root@localhost svt]# systemctl start vsftpd
    [root@localhost svt]# systemctl enable vsftpd
    Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

    下面用匿名账号anonymous或ftp登陆,小试牛刀~

    [root@localhost vsftpd]# pwd
    /etc/vsftpd                  #登录前的目录,为客户端
    [root@localhost vsftpd]# ftp 127.0.0.1  #登陆回环地址
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 3.0.2)
    Name (127.0.0.1:root): anonymous    #匿名用户,登录账号为anonymous或者ftp,密码为空
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> pwd
    257 "/"            #登录后的目录,为服务端。引号""表示/的实际位置不确定,匿名用户的根目录,默认在/var/ftp
    ftp> get pub.sh       #匿名用户,默认拥有下载权限
    local: pub.sh remote: pub.sh
    227 Entering Passive Mode (127,0,0,1,153,174).
    150 Opening BINARY mode data connection for pub.sh (29 bytes).
    226 Transfer complete.
    29 bytes received in 9e-05 secs (322.22 Kbytes/sec)
    ftp> put vsf.jpg       #匿名用户,默认没有上传权限。连上传都不允许,更不用说删除、复制、更名等权限了。所以说,匿名用户在默认情况下权限很低!
    local: vsf.jpg remote: vsf.jpg
    227 Entering Passive Mode (127,0,0,1,231,236).
    550 Permission denied.

    3.FTP原理

    21端口用于连接,20端口用于传输数据。默认采用明文传输
    进行FTP文件传输中,客户端首先连接到FTP服务器的21端口,进行用户的认证,认证成功后,要传输文件时,服务器会开20端口来进行传输数据文件。
    也就是说,端口20才是真正传输所用到的端口,端口21只用于版FTP的登陆认证。我们平常下载文件时,会遇到下载到99%时,文件不完成,不能成功的下载。
    其实是因为文件下载完毕后,还要在21端口再行进行用户认证,而下载文件的时间如果过长,客户机与服务器的21端口的连接会被服务器认为是超时连接而中断掉,就是这个原因。解决方法就是设置21端口的响应时间。

    为什么使用2个端口呢?
    因为数据传输会长时间占用端口,如果只用1个端口,其他用户可能会登陆不上~所以21端口一直处于listen监听状态,20端口在传输数据时才活跃。这就是控制连接和数据连接分离。

    4.VSFTP简介

    vsftpd 是“ very secure FTP daemon ”的缩写,安全性是它的一个最大的特点,但是并没有加密传输,只是改善了权限验证功能~.~。 可以结合SSL配合使用~它是一个服务器软件
    vsftpd是一个UNIX类操作系统上运行的服务器的名字,它可以运行在诸如 Linux 、 BSD 、 Solaris 、HP UNIX 等系统上面,是一个完全免费的、开放源代码的 ftp 服务器软件,支持很多其他的FTP 服务器所不支持的特征。

    服务端软件名:vsftpd
    客户端软件名:ftp
    服务名:vsftp
    端口号:20、21、指定范围内随机端口
    配置文件:/etc/vsftpd/vsftpd.conf
    登陆方式:匿名用户登录、本地用户登录、虚拟用户登陆
    匿名用户验证:
    用户账号:ftp或anonymous
    用户密码:空
    工作目录:/var/ftp
    默认权限:只可下载(连上传都不行);上传权限由两部分组成(主配置文件和文件系统w);
    
    本地用户验证:
    用户账号:本地用户(/etc/passwd)
    用户密码:用户密码(/etc/shadow)
    工作目录:用户的家目录
    权限:最大权限700(drex)


    5.两种模式

    PORT模式(主动方式)

    FTP 客户端首先和FTP ServerTCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口(一个大于1024的端口)接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。
           控制链路    数据链路    
    服务端: 21端口    发起方20端口
    客户端: 发起方    PORT命令告知    

    PASV模式(被动方式)

    在建立控制通道的时候和PORT模式类似,当客户端通过这个通道发送 PASV 命令的时候,FTP server打开一个位于10245000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接传送数据。
           控制链路    数据链路    
    服务端: 21端口   PASV命令告知
    客户端: 发起方     发起方    
      Port模式:ftp server:tcp 21 <------client:dynamic     ftp server:tcp 20 ------>client:dynamic
      Pasv模式:ftp server:tcp 21 <-----client:dynamic     ftp server:tcp dynamic <----client:dynamic
      Linux的RedHat发行版中,VSFTP默认采用PORT主动模式(20、21端口)。

    6.VSFTP传输模式

      (1)Binary模式:不对数据进行任何处理,适合可执行文件(脚本)、压缩文件、图片等

      (2)ASCII模式:进行文本传输时,自适应目标操作系统的结束符,如回车符等

      Linux的RedHat发行版中,VSFTP默认采用Binary模式。

    7.VSFTP的内置命令

    ftp> ?
    Commands may be abbreviated.  Commands are:

    二、匿名用户登录

      1.默认配置:匿名用户默认只支持下载权限

    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    pam_service_name=vsftpd
    userlist_deny=YES
    tcp_wrappers=YES

      配置文件:/etc/vsftp/vsftpd.conf

      2.相关参数:匿名用户增加上传、创建目录文件的权限(比如开启后,大家可以上传文件进行知识分享-.-)

    anon_upload_enable=YES        #上传权限
    anon_mkdir_write_enable=YES    #创建目录权限

      3.相关参数:匿名用户增加权限,如删除、更名、复制的权限(一般不开启!!你希望自己的东西被恶意删除吗?)

    anon_other_write_enable=YES     #删除、更名、覆盖权限,需要配合anon_upload_enbale=YES一起使用~
    If set to YES, anonymous users will be permitted to perform write operations other than upload and create directory, such as deletion and renaming.
    This is generally not recommended but included for completeness. Default: NO
    anno_root=/var/ftp        #匿名用户的FTP根目录,其下有个pub目录
    anno_max_rate=0            #限制最大传输速录(0表示不限速,byte/s)

      4.最后将/etc/vsftp/vsftpd.conf备份后,清空内容并复制下述配置。带#的为注释行,便于以后查看和修改参数。

    [root@localhost vsftpd]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.backup
    [root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    #anon_upload_enable=YES
    #anon_mkdir_write_enable=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    #chown_uploads=YES
    #chown_username=whoever
    #xferlog_file=/var/log/vsftpd.log
    xferlog_std_format=YES
    #idle_session_timeout=600
    #data_connection_timeout=120
    #nopriv_user=ftpsecure
    #async_abor_enable=YES
    #ascii_upload_enable=YES
    #ascii_download_enable=YES
    #ftpd_banner=Welcome to blah FTP service.
    #deny_email_enable=YES
    #banned_email_file=/etc/vsftpd/banned_emails
    #chroot_list_enable=YES
    #chroot_list_file=/etc/vsftpd/chroot_list
    #ls_recurse_enable=YES
    listen=YES
    #listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES

       这是初始配置参数,记得自己检查一遍,不要在每行最后留有空格、复制时首字母有可能漏。

       匿名用户只有下载权限。

    三、本地用户登录

      1.关闭匿名用户登录

    [root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
    anonymous_enable=NO                      #关闭匿名用户登录,anon开头的参数也都注释掉。
    #anon_upload_enable=YES                  
    #anon_mkdir_write_enable=YES
    [root@localhost vsftpd]# systemctl restart vsftpd    #重启vsftpd服务,并重新登录,使配置生效。
    [root@localhost nDPI]# ftp 127.0.0.1    
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 3.0.2)
    Name (127.0.0.1:root): ftp                 #ftp和anonymous都是匿名用户哦!一样的。
    331 Please specify the password.
    Password:
    530 Login incorrect.
    Login failed.
    按Ctrl+z退出

     在私人ftp场合下,匿名登录不安全。所以取消匿名登录,采用本地用户登录。

      2.创建本地用户登录

    [root@localhost ~]# useradd -s /sbin/nologin -d /tmp/temporary new_account      # -s表示用户的类型,-d表示用户的家目录位置(如不指认,则默认在/home下),new_account代表用户名
    [root@localhost vsftpd]# passwd new_account                      #为刚刚创建的用户增加密码  
    Changing password for user new_account.
    New password: 123
    BAD PASSWORD: The password is shorter than 8 characters
    Retype new password: 123
    passwd: all authentication tokens updated successfully.
    [root@localhost vsftpd]# ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 3.0.2)
    Name (127.0.0.1:root): new_account
    331 Please specify the password.
    Password:123
    230 Login successful.
    (1)创建nologin型账号new_account,本地用户目录默认在家目录/home,无法使用bash或其他shell来登陆系统
    (
    2)/sbin/nologin:虽然用户无法使用bash或其他shell来登陆系统,但是可以使用一些系统资源。举例来说,各个系统账号中,打印作业有lp这个账号管理,web服务器有apache这个账号管理,他们都可以进行系统程序的工作,           但就是无法登陆主机而已。假如有账号试图连接我的主机取得shell,我们就可以拒绝。    (3)如果想要让/sbin/nologin类型的用户知道,他们不能登陆主机的提示语。可以新建/etc/nologin.txt这个文件,在文件内面写上不能登陆的原因,当用户登录失败时,屏幕上就会出现这个文件里面的内容。


    [root@localhost vsftpd]#
    echo cannot login for security > /etc/nologin.txt [root@localhost vsftpd]# cat /etc/nologin.txt cannot login for security [root@localhost vsftpd]# su new_account cannot login for security
    [root@localhost vsftpd]# ll
    -rw-r--r-- 1 root root   21 Apr 13 17:09 vsf.jpg    #客户端  /etc/vsftpd/   文件为vsf.jpg     登陆前的所在路径
    
    [root@localhost vsftpd]# ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 3.0.2)
    Name (127.0.0.1:root): mm
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    
    ftp> pwd                          #服务端 /tmp/temporary  文件为jiamylu.txt  家目录在useradd创建用户时用-d选项改变了,默认情况在/home下哦!
    257 "/tmp/temporary"
    
    ftp> put vsf.jpg                                #从客户端上传文件
    local: vsf.jpg remote: vsf.jpg
    227 Entering Passive Mode (127,0,0,1,104,134).
    150 Ok to send data.
    226 Transfer complete.
    21 bytes sent in 0.0001 secs (210.00 Kbytes/sec)
    
    ftp> get jiamylu.txt                              #从服务端下载文件
    local: jiamylu.txt remote: jiamylu.txt
    227 Entering Passive Mode (127,0,0,1,101,118).
    150 Opening BINARY mode data connection for jiamylu.txt (47 bytes).
    226 Transfer complete.
    47 bytes received in 0.000394 secs (119.29 Kbytes/sec)
    
    
    ftp> ls                                    #查看服务端有哪些文件
    227 Entering Passive Mode (127,0,0,1,220,62).
    150 Here comes the directory listing.
    -rw-r--r--    1 1008     1009           47 Apr 13 10:04 jiamylu.txt
    -rw-r--r--    1 1008     1009           21 Apr 13 10:03 vsf.jpg
    226 Directory send OK.
    
    ftp> mkdir mulu                               #创建文件夹
    257 "/tmp/temporary/mulu" created
    
    ftp> rmdir mulu                               #删除文件夹 
    250 Remove directory operation successful.
    ftp> delete vsf.jpg                              #删除文件
    250 Delete operation successful.
    
    ftp> rename rename jiamulu.txt jia.txt                  #重命名
    350 Ready for RNTO.
    250 Rename successful.     .
    ftp> cd /home/new_account                          #不能访问其他用户的家目录,如/home/new_account
    550 Failed to change directory.
    ftp> cd /tmp/                                #可以访问/tmp目录        250 Directory successfully changed.

    本地用户的默认权限:上传文件、下载文件、创建和删除文件夹及文件、重命名

              不能访问其他用户的家目录,但是可以访问其他普通目录

    发现并不安全。我们需要安全设置! 

    Attention:文件的chown可能影响权限~如果遇到不能上传或下载,记得在客户端处,更改chown哦~ 

    四、本地用户安全设置

    1.限制本地用户锁定在家目录

    [root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
    chroot_list_enable=YES            #将下面3行加入配置文件中
    chroot_list_file=/etc/vsftpd/chroot_list
    allow_writeable_chroot=YES

    由于chroot_list文件默认不存在,需要创建,并导入本地用户。(把本地用户加入黑名单呗,防止黑客窜用root,限制本地用户在家目录内)

    [root@localhost vsftpd]# touch /etc/vsftpd/chroot_list
    [root@localhost vsftpd]# cut -d: -f1 /etc/passwd >> /etc/vsftpd/chroot_list

    chroot_list这个文件里的用户只能访问家目录   "/" 

    chroot_list_enable是开关:YES表示list里的系统用户与默认策略互斥

    chroot_local_user是默认策略:YES表示用户被限制,NO表示用户不被限制。默认值为NO不受限制。

    所以,chroot_list_enable=YES,chroot_local_user=NO意思是,本地用户不被家目录限制,但是list里的用户除外。开启黑名单~

    [root@localhost vsftpd]# !sys
    systemctl restart vsftpd                      #改完配置文件,一定要重启服务啊~
    [root@localhost vsftpd]# !ftp
    ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 3.0.2)
    Name (127.0.0.1:root): mm
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> cd /tmp/
    550 Failed to change directory.
    ftp> cd /home/new_account
    550 Failed to change directory.
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    #anon_upload_enable=YES
    #anon_mkdir_write_enable=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    #chown_uploads=YES
    #chown_username=whoever
    #xferlog_file=/var/log/vsftpd.log
    xferlog_std_format=YES
    #idle_session_timeout=600
    #data_connection_timeout=120
    #nopriv_user=ftpsecure
    #async_abor_enable=YES
    #ascii_upload_enable=YES
    #ascii_download_enable=YES
    #ftpd_banner=Welcome to blah FTP service.
    #deny_email_enable=YES
    #banned_email_file=/etc/vsftpd/banned_emails
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    allow_writeable_chroot=YES
    #ls_recurse_enable=YES
    listen=YES
    #listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES

    2.限制重要本地用户不能登录ftp权限

    [root@localhost vsftpd]# echo new_account >> /etc/vsftpd/ftpusers
      ftpusers里的用户会被限制登录。没啥好讲的,就是登陆黑名单。下面讲登陆白名单~

    3.利用ftp用户策略允许登录ftp的本地用户

    [root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf
    userlist_deny=NO
    userlist_file=/etc/vsftpd/user_list

         userlist_enable在最开始时已经设置为YES了。

      userlist_enable是开关:YES表示list里的系统用户与默认策略互斥

      userlist_deny是默认策略:YES表示系统用户默认能登陆ftp,NO系统用户默认不能登陆ftp。默认值为YES能登陆。

      所以,userlist_enable=YES、userlist_deny=NO意思是:本地用户默认不能登陆ftp,但是list里的用户例外。开启白名单呗~

    [root@localhost vsftpd]# !sys
    systemctl restart vsftpd                      #改完配置文件,一定要重启服务啊~
    write_enable=YES
    local_umask=022
    #anon_upload_enable=YES
    #anon_mkdir_write_enable=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    #chown_uploads=YES
    #chown_username=whoever
    #xferlog_file=/var/log/vsftpd.log
    xferlog_std_format=YES
    #idle_session_timeout=600
    #data_connection_timeout=120
    #nopriv_user=ftpsecure
    #async_abor_enable=YES
    #ascii_upload_enable=YES
    #ascii_download_enable=YES
    #ftpd_banner=Welcome to blah FTP service.
    #deny_email_enable=YES
    #banned_email_file=/etc/vsftpd/banned_emails
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    allow_writeable_chroot=YES
    #ls_recurse_enable=YES
    listen=YES
    #listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES    #黑名单是默认开启的,添加下面2行是启用白名单功能。其逻辑参看防火墙策略~.~搞懂的后面学习其他很顺~
    userlist_deny=NO
    userlist_file=/etc/vsftpd/user_list
    tcp_wrappers=YES
    root
    bin
    daemon
    adm
    lp
    sync
    shutdown
    halt
    mail
    news
    uucp
    operator
    games
    nobody
    #这是user_list的默认参数,因为本来它是登陆黑名单的。我们现在讲的是登陆白名单,应该把它全删了,只加入自己创建的本地用户。
    [root@localhost vsftpd]# cat -n user_list > user_list 
    cat: user_list: input file is output file
    [root@localhost vsftpd]# echo mm >> user_list 
    [root@localhost vsftpd]# cat user_list 
    mm
    #此时user_list里面只有我们的账号mm
    [root@localhost vsftpd]# !ftp
    ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 3.0.2)
    Name (127.0.0.1:root): mm
    331 Please specify the password.
    Password:
    230 Login successful.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    #发现可以登陆,白名单有用~接下来我们把账号mm从白名单删掉,看能不能登陆?
    [root@localhost vsftpd]#
    cat -n user_list > user_list cat: user_list: input file is output file
    [root@localhost vsftpd]# !sys
    systemctl restart vsftpd                      #改完配置文件,一定要重启服务啊~
    [root@localhost vsftpd]# !ftp
    ftp 127.0.0.1
    Connected to 127.0.0.1 (127.0.0.1).
    220 (vsFTPd 3.0.2)
    Name (127.0.0.1:root): mm
    530 Permission denied.
    Login failed.
    #cat那条命令是清空文件,然后这时白名单内容为空,账号mm不能登陆!嘻嘻~

    4.设置登录ftp目标的ip地址(没啥必要,看看就会了)

     https://blog.51cto.com/viong/261342

    五、虚拟用户登陆

     虚拟用户:人为创建,生成数据库文件,找一个本地用户作为虚拟用户的映射用户,借助本地用户的家目录作为默认登陆点。每一个虚拟用户的权限都可以单独定制。

    1.建立FTP虚拟用户的用户数据库文件(在/etc/vsftp目录下)

    [root@localhost vsftpd]# vim vsftpd.virtualuser     #创建虚拟用户账号和密码。奇数行账号,偶数行密码
    [root@localhost vsftpd]# db_load -T -t hash -f vsftpd.virtualuser vsftpd.db    #将上述文本转为数据库类型。-T生成db文件,-t选择加密方式,-f选择加密文件。生成文件名任意指定,db后缀不能改。
    [root@localhost vsftpd]# chmod 600 vsftpd.db       #赋予数据库文件600权限,只有root可以读写。保证安全性,否则会报错。

    2.创建FTP虚拟用户的映射用户,并制定用户家目录(映射用户不用设置密码)

    3.建立支持虚拟用户的PAM认证文件,添加虚拟用户支持(让主配置文件来找它)

    [root@localhost vsftpd]# vim vsftpd.virtualuser     #创建虚拟用户账号和密码。奇数行账号,偶数行密码
    [root@localhost vsftpd]# db_load -T -t hash -f vsftpd.virtualuser vsftpd.db    
    #创建数据库,将上虚拟用户账号和密码进行加密。-T生成db文件,-t选择加密方式,-f选择加密文件。生成文件名任意指定,db后缀不能改。
    [root@localhost vsftpd]# chmod 600 vsftpd.db    #赋予数据库文件600权限,只有root可以读写。保证安全性,否则会报错。
    
    [root@localhost vsftpd]# useradd -s /sbin/nologin -d /var/ftp/root virtual    #创建一个本地用户作为虚拟用户的映射,用于虚拟用户登陆位置。这个本地用户不用设置密码~

      [root@localhost dir]# chmod o+r /var/ftp/root/                  #other组即针对虚拟用户,使得虚拟用户对家目录具有读权限。否则虚拟用户登陆进去啥也看不到

    [root@localhost dir]# cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam        #更改复制后的文件,之后将这个文件作为/etc/vsftpd.conf里的pam_service_name参数路径就行。让主配置文件来找它~
    [root@localhost dir]# cat /etc/pam.d/vsftpd.pam > /etc/pam.d/vsftpd.pam      #清空里面文件,并将下面两行复制进去
    [root@localhost dir]# vim /etc/pam.d/vsftpd.pam 
    auth    required        pam_userdb.so   db=/etc/vsftpd/vsftpd
    account required        pam_userdb.so   db=/etc/vsftpd/vsftpd
    [root@localhost vsftpd]# vim vsftpd.conf                      #打开匿名登录anony_enable=YES【虚拟账户和匿名账户同配置】,并将其他anon开头的参数都注释掉【之后单独为虚拟用户建立子配置文件,防止主配置文件对子配置文件进行覆盖】。
    pam_service_name=vsftpd.pam                           #更改pam认证路径; 打开虚拟用户登录; 指定虚拟用户的映射用户; 指定虚拟用户的配置目录. 如果想换回本地用户登陆,记得把这个路径改回去,否则本地用户登录不了~                  
    guest_enable=YES                                                     
    guest_username=virtual
    user_config_dir=/etc/vsftpd/dir

    4.为虚拟用户建立独立的子配置文件,重启服务进行测试(匿名用户默认只有下载权限

    [root@localhost vsftpd]# mkdir /etc/vsftpd/dir
    [root@localhost vsftpd]# cd dir
    [root@localhost dir]# touch a{1..3}
    
    [root@localhost dir]# vim a1
    anon_upload_enable=YES                #允许上传文件 
    
    [root@localhost dir]# vim a2
    anon_mkdir_write_enable=YES             #允许创建目录
    
    [root@localhost dir]# vim a3            
    anon_upload_enable=YES      
    anon_other_write_enable=YES             #允许重命名、删除、覆盖文件 
    [root@localhost dir]# chmod o+r /var/ftp/root/  #再次确认,如果虚拟用户(other型),对其映射用户virtual的家目录/var/ftp/root(自己设置的)没有读(r)权限,则FTP登陆进去啥也看不见~
    [root@localhost dir]# !sys
    systemctl restart vsftpd
    [root@localhost
    dir]# !ftp ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): a1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put dir.txt local: dir.txt remote: dir.txt 227 Entering Passive Mode (127,0,0,1,72,135). 150 Ok to send data. 226 Transfer complete. 56 bytes sent in 0.000115 secs (486.96 Kbytes/sec) ftp> put dir.txt local: dir.txt remote: dir.txt 227 Entering Passive Mode (127,0,0,1,140,132). 553 Could not create file. ftp> mkdir abc 550 Permission denied.
    [root@localhost dir]# !ftp ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): a2 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put dir.txt local: dir.txt remote: dir.txt 227 Entering Passive Mode (127,0,0,1,51,67). 550 Permission denied. ftp> mkdir ss 257 "/ss" created
    [root@localhost dir]# !f ftp 127.0.0.1 Connected to 127.0.0.1 (127.0.0.1). 220 (vsFTPd 3.0.2) Name (127.0.0.1:root): a3 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put dir.txt local: dir.txt remote: dir.txt 227 Entering Passive Mode (127,0,0,1,209,205). 150 Ok to send data. 226 Transfer complete. 56 bytes sent in 9e-05 secs (622.22 Kbytes/sec) ftp> delete dir.txt 250 Delete operation successful.

     六、SSL+vsftp加密验证

     1.使用tcpdump工具进行制定端口抓包,抓取ftp登陆过程中的数据包

    [root@localhost vsftpd]# tcpdump -i ens33 -nn -X -vv port 21 and ip host 10.0.0.10

    说明:

      (1)-i  #interface

      (2)-nn  对地址显示为数字方式,否则显示为主机名;还把端口显示为数值,否则显示端口服务名

      (3)-X   输出包的头部数据,会以16进制和ASCII两周方式同时输出

      (4)-vv  产生更详细的输出

      (5)10.0.0.10是客户端地址,使用WinSCP来访问~

     

    [root@localhost vsftpd]# tcpdump -i ens33 -nn -X -vv port 21 and ip host 10.0.0.10
    tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
    ****************************************************************************************************************************************

    15:54:11.469507 IP (tos 0x0, ttl 64, id 10147, offset 0, flags [DF], proto TCP (6), length 49)
    10.0.0.10.49433 > 10.0.0.100.21: Flags [P.], cksum 0xda82 (correct), seq 1:10, ack 21, win 16420, length 9: FTP, length: 9
    USER mm
    0x0000: 4500 0031 27a3 4000 4006 feb6 0a00 000a E..1'.@.@.......
    0x0010: 0a00 0064 c119 0015 1bfd e64a d360 b7b7 ...d.......J.`..
    0x0020: 5018 4024 da82 0000 5553 4552 206d 6d0d P.@$....USER.mm.
    0x0030: 0a .
    15:54:11.469615 IP (tos 0x0, ttl 64, id 756, offset 0, flags [DF], proto TCP (6), length 40)
    10.0.0.100.21 > 10.0.0.10.49433: Flags [.], cksum 0x1488 (incorrect -> 0x4bea), seq 21, ack 10, win 229, length 0
    0x0000: 4500 0028 02f4 4000 4006 236f 0a00 0064 E..(..@.@.#o...d
    0x0010: 0a00 000a 0015 c119 d360 b7b7 1bfd e653 .........`.....S
    0x0020: 5010 00e5 1488 0000 P.......
    15:54:11.471684 IP (tos 0x0, ttl 64, id 757, offset 0, flags [DF], proto TCP (6), length 74)
    10.0.0.100.21 > 10.0.0.10.49433: Flags [P.], cksum 0x14aa (incorrect -> 0x049f), seq 21:55, ack 10, win 229, length 34: FTP, length: 34
    331 Please specify the password.
    0x0000: 4500 004a 02f5 4000 4006 234c 0a00 0064 E..J..@.@.#L...d
    0x0010: 0a00 000a 0015 c119 d360 b7b7 1bfd e653 .........`.....S
    0x0020: 5018 00e5 14aa 0000 3333 3120 506c 6561 P.......331.Plea
    0x0030: 7365 2073 7065 6369 6679 2074 6865 2070 se.specify.the.p
    0x0040: 6173 7377 6f72 642e 0d0a assword...
    15:54:11.472322 IP (tos 0x0, ttl 64, id 10148, offset 0, flags [DF], proto TCP (6), length 48)
    10.0.0.10.49433 > 10.0.0.100.21: Flags [P.], cksum 0x3bc3 (correct), seq 10:18, ack 55, win 16411, length 8: FTP, length: 8
    PASS
    0x0000: 4500 0030 27a4 4000 4006 feb6 0a00 000a E..0'.@.@.......
    0x0010: 0a00 0064 c119 0015 1bfd e653 d360 b7d9 ...d.......S.`..
    0x0020: 5018 401b 3bc3 0000 5041 5353 2020 0d0a P.@.;...PASS....
    15:54:11.513422 IP (tos 0x0, ttl 64, id 758, offset 0, flags [DF], proto TCP (6), length 40)
    10.0.0.100.21 > 10.0.0.10.49433: Flags [.], cksum 0x1488 (incorrect -> 0x4bc0), seq 55, ack 18, win 229, length 0
    0x0000: 4500 0028 02f6 4000 4006 236d 0a00 0064 E..(..@.@.#m...d
    0x0010: 0a00 000a 0015 c119 d360 b7d9 1bfd e65b .........`.....[
    0x0020: 5010 00e5 1488 0000 P.......
    15:54:11.591459 IP (tos 0x0, ttl 64, id 759, offset 0, flags [DF], proto TCP (6), length 63)
    10.0.0.100.21 > 10.0.0.10.49433: Flags [P.], cksum 0x149f (incorrect -> 0x6a28), seq 55:78, ack 18, win 229, length 23: FTP, length: 23
    230 Login successful.
    0x0000: 4500 003f 02f7 4000 4006 2355 0a00 0064 E..?..@.@.#U...d
    0x0010: 0a00 000a 0015 c119 d360 b7d9 1bfd e65b .........`.....[
    0x0020: 5018 00e5 149f 0000 3233 3020 4c6f 6769 P.......230.Logi
    0x0030: 6e20 7375 6363 6573 7366 756c 2e0d 0a n.successful...

    ***************************************************************明文传输账号密码,不安全********************************************************

    2.CA证书服务器

      (1)秘钥:私钥,解密数据包

      (2)证书:公钥,加密数据包(加密类型,加密长度)

      (3)签字后的正数:有一定有效期、有加密类型、有加密长度

      (4)生产环境中的CA服务需要花钱买,个人可以找点免费的使用,比如OpenSSL

     3.采用SSL加密传输

    1.查看是否安装了openssl(免费的CA服务器)

    [root@localhost ~]# rpm -qa | grep openssl  
    openssl-libs-1.0.2k-12.el7.x86_64
    xmlsec1-openssl-1.2.20-7.el7_4.x86_64
    openssl-1.0.2k-12.el7.x86_64

    2.查看vsftpd是否支持openssl

    [root@localhost ~]# which vsftpd 
    [root@localhost ~]# ldd /usr/sbin/vsftpd | grep ssl
            libssl.so.10 => /lib64/libssl.so.10 (0x00007f209d7d5000)

    3.生成加密信息的密钥对(秘钥和证书文件应在:/etc/ssl/certs/)

    [root@localhost ~]# cd /etc/ssl/certs/
    [root@localhost certs]# openssl genrsa -out vsftpd.key 1024                               #建立秘钥,加密类型为rsa,长度1024
    [root@localhost certs]# openssl req -new -key vsftpd.key -out vsftpd.csr                        #建立证书文件,输入相关信息。如果为了https申请,必须和域名吻合!
    [root@localhost certs]# openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt  #设置签字证书颁发格式、有效期、加密类型、加密长度、指定使用的秘钥和证书文件~

    ***************************************************************注意/etc/ssl/certs的权限应该为500********************************************************

    4.修改主配置文件(/etc/vsftpd/vsftpd.conf)

    [root@localhost ~]# cd /etc/vsftpd/
    [root@localhost vsftpd]# vim vsftpd.conf
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    #anon_upload_enable=YES
    #anon_mkdir_write_enable=YES
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    #chown_uploads=YES
    #chown_username=whoever
    #xferlog_file=/var/log/vsftpd.log
    xferlog_std_format=YES
    #idle_session_timeout=600
    #data_connection_timeout=120
    #nopriv_user=ftpsecure
    #async_abor_enable=YES
    #ascii_upload_enable=YES
    #ascii_download_enable=YES
    #ftpd_banner=Welcome to blah FTP service.
    #deny_email_enable=YES
    #banned_email_file=/etc/vsftpd/banned_emails
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    allow_writeable_chroot=YES
    #ls_recurse_enable=YES
    listen=YES
    #listen_ipv6=YES
    pam_service_name=vsftpd
    guest_enable=YES
    guest_username=virtual
    user_config_dir=/etc/vsftpd/dir
    userlist_enable=YES
    #userlist_deny=NO
    #userlist_file=/etc/vsftpd/user_list
    tcp_wrappers=YES
    ssl_enable=YES                    #启用ssl认证
    ssl_tlsv1=YES                    #指定ssl的3个版本
    ssl_sslv2=YES
    ssl_sslv3=YES
    allow_anon_ssl=YES                 #强制匿名用户/虚拟用户、本地用户,在登录和数据传输时,使用ssl
    force_anon_logins_ssl=YES
    force_anon_data_ssl=YES
    force_local_logins_ssl=YES
    force_local_data_ssl=YES
    rsa_cert_file=/etc/ssl/certs/vsftpd.crt          #指定签字证书的路径
    rsa_private_key_file=/etc/ssl/certs/vsftpd.key     #指定秘钥的路径

    5.重启vsftpd服务,使得配置生效,并开启监听

    [root@localhost vsftpd]# !sys
    systemctl restart vsftpd 
    [root@localhost vsftpd]# tcpdump -i ens33 -nn -X -vv port 21 and ip host 10.0.0.10

     

     

     现在全是加密信息了,不信你把信息重定向到文本,用grep来找找看~~

    七、报错总结

    1./etc/vsftpd.conf里的配置参数,最后面有空格

    2./etc/vsftpd.conf里的配置参数,ipv6=YES

    3.FTP服务21端口被占用

    4.防火墙和SELinux没有关

    5./etc/vsftpd.conf的名字不正确,少个字母d变成/etc/vsftp

    6./etc/vsftpd.conf的权限不正确,不属于root,或者没有读写权限

    *****************
  • 相关阅读:
    luogu P3376 【模板】网络最大流
    cogs 774. [USACO Open09] 捉迷藏
    1002. A+B for Polynomials (25) (浮点数判0)
    1001. A+B Format (20) (%0nd)
    7-28 搜索树判断(25 分)
    7-27 家谱处理(30 分)
    7-26 Windows消息队列(25 分)(堆排序)
    7-25 朋友圈(25 分)(并查集)
    7-24 树种统计(25 分)(二叉排序的应用)
    7-23 还原二叉树(25 分)
  • 原文地址:https://www.cnblogs.com/ytdyz/p/12681631.html
Copyright © 2020-2023  润新知