zoukankan      html  css  js  c++  java
  • vsftp网络服务

    1. vsftp概述

      FTP是File Transfer Protocol(文本传输协议)的简称,用于Internet上的文件的双向传输。使用FTP传输时,具有一定程度的危险性,因为数据在因特网上面是完全没有受到保护的明文传输方式。

      VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,全称是Very Secure FTP,从名称定义上可以看出,这是为了解决FTP的安全传输问题的。

    1.1 安全特性

      1)vsftp程序的运行者一般是普通用户,降低了相应进程的权限,提高了安全性

      2)任何需要执行较高权限的指令都需要上层程序的许可

      3)ftp所需要使用的绝大多数命令都被整合到了vsftp中,基本不需要系统额外提供命令

      4)拥有chroot功能,可以改变用户的根目录,限制用户只能在自己的家目录

    2. vsftp连接类型

      控制连接(持续连接)-->TCP 21(命令信道)-->用户收发ftp命令

      数据连接(按需连接)-->TCP 20(数据信道)-->用于上传下载数据

    3. vsftp工作模式

    Port模式

    ftp客户端首先和服务器的TCP 21端口建立连接,用来发送命令,客户端需要接受数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接受数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server 必须和客户端建立一个新的连接用来传送数据。

     

    Passive模式

    FTP客户端首先和服务器的TCP 21端口建立连接,用来建立控制通道发送命令,但建立连接后客户端发送Pasv命令。服务器端收到Pasv命令后,打开一个临时端口(端口大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器的临时端口,然后FTP服务器将通过这个端口传输数据。

    注意:由于vsftp的被动模式是随机端口进行数据传输,在设置防火墙时需要刻意放行。

    4. vsftp传输模式

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

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

    Linux的红帽发行版中vsftp默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用

    切换模式:在ftp>提示符下输入ascii即可转换到ASCII模式,输入bin,即转换到Binary模式

    5. vsftp软件信息

    服务端软件名:vsftpd

    客户端软件名:ftp、filezilla..

    服务名:vsftpd

    端口号:20、21、指定范围内随机端口号

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

    6. 登录验证方式

    匿名用户验证:

      用户账号名称:ftp或anonymous

      用户账号密码:无密码

      工作目录:/var/ftp

      默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)

    本地用户验证:

      用户账号名称:本地用户(/etc/passwd)

      用户账号密码:用户密码(/etc/shadow)

      工作目录:登录用户的宿主目录

      权限:最大权限(drwx------)

    虚拟(virtual)用户验证:

      1. 创建虚拟用户用来代替本地用户,减少本地用户曝光率

      2. 使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制

      3. 能够设置严格的权限(为每一个用户生成单独的配置文件)

    7. vsftp部署

    开放端口

    [root@centos2 ~]# firewall-cmd --zone=public --add-port=20/tcp
    [root@centos2 ~]# firewall-cmd --zone=public --add-port=20/tcp --permanent
    [root@centos2 ~]# firewall-cmd --zone=public --add-port=21/tcp
    [root@centos2 ~]# firewall-cmd --zone=public --add-port=21/tcp --permanent

    安装

    [root@centos2 ~]# yum install vsftpd

    7.1 匿名用户验证

    匿名权限控制:

    anonymous_enable=YES            #启用匿名访问
    anon_umask=022                  #匿名用户所上传文件的权限掩码
    anon_root=/var/ftp              #匿名用户的FTP目录
    anon_upload_enable=YES          #允许上传文件
    anon_mkdir_write_enable=YES     #允许创建目录
    anon_other_write_enable=YES     #开放其他写入权限(删除、覆盖、重命名)
    anon_max_rate=0                 #限制最大传输速率(0为不限速,单位:bytes/s)

    试验需求和流程:

    1. 实现可以上传

      a. anon_upload_enable=YES
    
      b. 在/var/ftp/下创建上传目录
    
      c. 修改上传目录的权限或所有者,让匿名用户有写入权限
    [root@centos2 /etc/vsftpd]# vim vsftpd.conf
    添加一行anon_upload_enable=YES
    或者把#anon_upload_enable=YES注释去掉
    
    之后重启服务
    
    [root@centos2 /etc/vsftpd]# systemctl restart vsftpd
    [root@centos2 ~]# cd /var/ftp/
    
    [root@centos2 /var/ftp]# mkdir test
    #新建试验目录
    [root@centos2 /var/ftp]# chown -R ftp:ftp test/
    #修改目录的所有者,所属组

    2. 实现创建目录和文件其他操作

    anon_mkdir_write_enable=YES        #允许创建目录
    anon_other_write_enable=YES        #删除文件、文件改名、文件覆盖
    [root@centos2 /etc/vsftpd]# vim vsftpd.conf
    #在文件默认加上下述两行内容
    #anon_mkdir_write_enable=YES
    #anon_other_write_enable=YES
    
    [root@centos2 /etc/vsftpd]# systemctl restart vsftpd
    #重启服务

    3. 用户进入某个目录时,弹出相应的说明

    a. 在对应目录下创建 .message 文件,并写入相应内容
    b. 确认dirmessage_enable=YES是否启用
    c. 尝试切换目录查看效果(同一次登录仅提示)

    4. 实现上传的文件可下载

      默认情况下开放上传权限后,上传的文件是无法被下载的,因为文件的其他人没有r权限,设置anon_mask=022,可以让上传的文件其他人拥有r权限,然后才能被其他人下载。

    7.2 本地用户验证

    本地用权限控制:

    local_enable=YES                #是否启用本地系统用户
    local_umask=022                #本地用户所上传文件的权限掩码
    local_root=/var/ftp                #设置本地用户的FTP根目录
    chroot_local_user=YES                #是否将用户禁锢在主目录
    local_max_rate=0                #限制最大传输速率
    ftpd_banner=Welcome                #用户登录时显示的欢迎信息
    userlist_enable=YES & userlist_deny=YES                
    #禁止/etc/vsftpd/user_list文件中出现的用户登录FTP
    userlist_enable=YES & userlist_deny=NO
    #仅允许/etc/vsftpd/user_list文件中出现的用户登录FTP
    
    配置文件:ftpusers
    #禁止/etc/vsftpd/ftpusers文件中出现的用户登录FTP,权限比user_list更高,即时生效

    实验需求与流程:

    1. 服务端创建用户并设置密码(创建的用户不需要登录操作系统,仅用来登录vsftpd)

    [root@centos2 /var/ftp]# useradd -s /sbin/nologin user1

    2.将所有的用户禁锢在自己的家目录下

    注:默认是没有禁锢的,客户端登录后可以随意切换目录,查看文件所在位置和文件名

    chroot_local_enable=YES

    #开启用户家目录限制,限制所有用户不能随意切换目录

    [root@centos2 /etc/vsftpd]# vim vsftpd.conf
    
    #找到#chroot_local_user=YES,并把注释去掉
    #之后重启服务
    #需取消用户家目录写权限

    3. 将部分用户禁锢在自己的家目录下

    chroot_list_enable=YES

    #开启白名单功能,允许白名单中的用户随意切换目录

    chroot_list_file=/etc/vsftpd/chroot_list

    #白名单文件所在位置(需自己创建)

    [root@centos2 /etc/vsftpd]# vim vsftpd.conf
    
    #找到
    #chroot_list_enable=YES
    #chroot_list_file=/etc/vsftpd/chroot_list
    #将其注释去掉,保存退出
    
    [root@centos2 /etc/vsftpd]# vim chroot_list
    #在里面写入允许的用户
    
    
    #之后重启服务

    4. 配置文件:/etc/vsftpd/ftpusers

    所有写入文件内的用户名都不允许登录ftp,立即生效

    5. 修改被动模式数据传输使用端口

    pasv_enable=YES
    pasv_min_port=30000
    pasv_max_port=32000

    7.3 虚拟用户验证

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

    vim vsftpd.user
    #该文件名可随便定义,文件内容格式:奇数行用户,偶数行密码
    
    db_load -T -t hash -f vsftpd.user vsftpd.db
    #将用户密码的存放文件转化为数据库类型,并使用hash加密
    
    chmod 600 vsftpd.db
    #修改文件权限为600,保证其安全性

    2. 创建FTP虚拟用户的映射用户,并制定其用户家目录

    useradd -d /var/ftproot -s /sbin/nologin virtual
    #创建 virtual 用户作为FTP的虚拟用户的映射用户

    3. 建立支持虚拟用户的PAM认证文件,添加虚拟用户支持

    cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam
    #使用模板生成自己的认证配置文件,方便调用

    编辑新生成的文件vsftpd.pam(清空原来的内容,添加下述两行)

    auth    required    pam_userdb.so    db=/etc/vsftpd/vsftpd
    account    required    pam_userdb.so    db=/etc/vsftpd/vsftpd

    在vsftpd.conf文件中添加支持配置

    修改:

    修改:
        pam_service_name=vsftpd.pam
    
    添加:
        guest_enable=YES
        guest_username=virtual
        user_config_dir=/etc/vsftpd/dir

    4. 为虚拟用户建立独立的配置文件,启动服务并测试

    注:做虚拟用户配置文件设置时,将主配置文件中自定义的匿名用户相关设置注释掉

    用户可以上传:
        anon_upload_enable=YES        #允许上传文件
    
    用户可以创建目录或文件
        anon_mkdir_write_enable=YES        #允许创建目录
    
    用户可以修改文件名
        anon_upload_enable=YES        #允许上传文件(为了覆盖而开启)
        anon_other_write_enable=YES        #允许重命名和删除文件、覆盖

    注:给映射用户的家目录 设置 o+r 让虚拟用户有读权限

    [root@centos2 /etc/vsftpd]# vim vsftpd.user 
    a
    123456
    b
    123456
    c
    123456
    #文件名随意,内容格式:奇数行用户,偶数行密码
    
    [root@centos2 /etc/vsftpd]# db_load -T -t hash -f vsftpd.user vsftpd.db
    #将用户名密码的存放文件转化为数据库类型,并使用hash加密
    [root@centos2 /etc/vsftpd]# chmod 600 vsftpd.db
    #修改文件权限,保证安全性
    
    [root@centos2 /etc/vsftpd]# useradd -d /home/virtual -s /sbin/nologin virtual
    #创建 virtual 用户作为FTP的虚拟用户的映射目录
    
    [root@centos2 /home/virtual]# cd /etc/pam.d/
    [root@centos2 /etc/pam.d]# cp -a vsftpd vsftpd.pam
    #生成模板
    [root@centos2 /etc/pam.d]# vim vsftpd.pam 
    #%PAM-1.0
    auth       required     pam_userdb.so    db=/etc/vsftpd/vsftpd
    account    required     pam_userdb.so    db=/etc/vsftpd/vsftpd
    
    [root@centos2 /etc/vsftpd]# vim vsftpd.conf
    
    pam_service_name=vsftpd.pam
    
    guest_enable=YES
    guest_username=virtual
    user_config_dir=/etc/vsftpd/dir
    
    [root@centos2 /etc/vsftpd]# mkdir dir
    [root@centos2 /etc/vsftpd/dir]# vim a
    anon_upload_enable=YES
    
    [root@centos2 /etc/vsftpd/dir]# vim b
    anon_mkdir_write_enable=YES
    
    [root@centos2 /etc/vsftpd/dir]# vim c
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES

    #给映射用户的家目录 设置 o+r 让虚拟用户有读权限
    #映射目录需取消写权限
    #chmod a-w /home/virtual

     7.4 openssl+vsftpd 加密验证

    使用 tcpdump 工具进行指定端口抓包,抓取ftp登录过程中的数据包

    tcpdump -i ens33 -nn -X -vv tcp port 21 and ip host 来源ip
        
        -i        interface:指定tcpdump需要监听的接口
        -n        对地址以数字方式显示,否则显示为主机名
        -nn        除了-n的作用外,还把端口显示为数值,否则显示端口服务名
        -X        输出包的头部数据,会以16进制和ASCII两种方式同时输出
        -vv        产生更详细的输出

    1. 查看是否安装了 OpenSSL

    rpm -q openssl

    2. 查看vsftpd 是否支持openssl

    ldd /usr/sbin/vsftpd | grep libssl

    3. 生成加密信息的秘钥和证书文件

    存放位置:/etc/ssl/certs

    openssl genrsa -out vsftpd.key 2048
    #创建私钥,生成RSA密钥
    
    openssl req -new -key vsftpd.key -out vsftpd.csr
    
    openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
    #使用CA服务器签发证书,设置证书的有效期等信息

    注:生成秘钥和证书文件后,将目录(/etc/ssl/certs)的权限修改为500

    注:实验环境可以用命令生成测试,生产环境必须要在https证书厂商注册,否则浏览器不识别

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

    ssl_enable=YES
    #启用ssl认证
    ssl_tlsv1=YES
    ssl_sslv2=YES
    ssl_sslv3=YES
    #开启tlsvl1、sslv2、sslv3都支持
    allow_anon_ssl=YES
    #允许匿名用户{虚拟用户}
    force_anon_logins_ssl=YES
    force_anon_data_ssl=YES
    #匿名登录和传输时强制使用ssl
    force_local_logins_ssl=YES
    force_local_data_ssl=YES
    #本地登录和传输时强制使用ssl
    rsa_cert_file=/etc/ssl/certs/vsftpd.crt
    #rsa格式证书
    rsa_private_key_file=/etc/ssl/certs/vsftpd.key
    #rsa格式密钥

    注:密钥文件在配置文件中单独声明

    5. 重启服务

    systemctl restart vsftpd

    6. 测试(使用第三方客户端连接)

    连接测试时选择:

      服务器类型:显示TLS/SSL

      登录类型:一般或匿名

    [root@centos2 ~]# rpm -q openssl
    openssl-1.0.2k-19.el7.x86_64
    [root@centos2 ~]# ldd /usr/sbin/vsftpd | grep libssl
        libssl.so.10 => /lib64/libssl.so.10 (0x00007f8972e6c000)
    [root@centos2 ~]# ldd /usr/sbin/vsftpd 
        linux-vdso.so.1 =>  (0x00007fffd7e73000)
        libssl.so.10 => /lib64/libssl.so.10 (0x00007f9065826000)
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f906561b000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f9065401000)
        libpam.so.0 => /lib64/libpam.so.0 (0x00007f90651f2000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007f9064fed000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f9064de9000)
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f9064986000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f90645b8000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f906436b000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f9064082000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f9063e7e000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f9063c4b000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f9063a35000)
        libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f906380c000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007f9063607000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f9065cc3000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f90633f7000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f90631f3000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f9062fda000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9062dbe000)
        libcap-ng.so.0 => /lib64/libcap-ng.so.0 (0x00007f9062bb8000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f9062991000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f906272f000)
    
    [root@centos2 /etc/ssl]# cd certs/
    
    [root@centos2 /etc/ssl/certs]# openssl genrsa -out vsftpd.key 2048
    Generating RSA private key, 2048 bit long modulus
    ...................................................................................................+++
    ...................................+++
    e is 65537 (0x10001)
    [root@centos2
    /etc/ssl/certs]# openssl req -new -key vsftpd.key -out vsftpd.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HH Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:GXKJ Organizational Unit Name (eg, section) []:OP Common Name (eg, your name or your server's hostname) []:ss Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
    [root@centos2
    /etc/ssl/certs]# openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt Signature ok subject=/C=CN/ST=HH/L=ZZ/O=GXKJ/OU=OP/CN=ss Getting Private key
    [root@centos2
    /etc/pki/tls]# chmod 500 certs
    [root@centos2
    /etc/pki/tls/certs]# cd /etc/vsftpd/
    [root@centos2 /etc/vsftpd]# vim vsftpd.conf anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_umask=022 #guest_enable=YES #guest_username=virtual #user_config_dir=/etc/vsftpd/dir ssl_enable=YES ssl_tlsv1=YES ssl_sslv2=YES ssl_sslv3=YES allow_anon_ssl=YES 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 [root@centos2 /etc/vsftpd]# systemctl restart vsftpd
  • 相关阅读:
    SpringBoot整合ActiveMQ同时支持P2P和发布订阅模式(三)
    SpringBoot整合ActiveMQ的publish/subscribe发布订阅模式(二)
    Windows启动ActiveMQ报Wrapper Stopped错误
    IDEA从远程仓库克隆项目
    Git的安装
    IDEA上传项目到使用github上
    Mybaits的逆向工程
    posman测试接口需要登录验证的使用
    SSM整合SpringSecurity
    SpringBoot整合MongoDB的连接用户名和密码问题
  • 原文地址:https://www.cnblogs.com/sswind/p/11981278.html
Copyright © 2011-2022 走看看