zoukankan      html  css  js  c++  java
  • FTP服务

    DAS、SAN 、NAS

    存储基础知识---存储网络

    直接存储(Direct Attached Storage)

    存储设备与主机的紧密相连

    •管理成本较低,实施简单
    •储时直接依附在服务器上,因此存储共享受到限制
    •CPU必须同时完成磁盘存取和应用运行的双重任务,所以不利于CPU的指令周期的优化,增加系统负担

    网络连接存储(Network Attached Storage)

    通过局域网在多个文件服务器之间实现了互联,基于文件的协议( FTP、NFS、SMB/CIFS等 ),实现文件共享  

    •集中管理数据,从而释放带宽、提高性能
    •可提供跨平台文件共享功能
    •可靠性较差,适用于局域网或较小的网络
    

    存储区域网络(Storage Area Networks,SAN)

    利用高速的光纤网络链接服务器与存储设备,基于SCSI,IP,ATM等多种高级协议,实现存储共享

    •服务器跟储存装置两者各司其职
    •利用光纤信道来传输数据﹐以达到一个服务器与储存装置之间多对多的高效能、高稳定度的存储环境
    •实施复杂,管理成本高
    

    文件传输协议FTP

    File Transfer Protocol 早期的三个应用级协议之一
    基于C/S结构
    双通道协议:数据和命令连接
    数据传输格式:二进制(默认)和文本

    两种模式:服务器角度

    主动(PORT style):服务器主动连接

    命令(控制):客户端:随机port --- 服务器:tcp21
    数据:客户端:随机port ---服务器:tcp20

    原理:服务器端一开始监听的是TCP21端口,服务端主动连接客户端,将数据传送给客户端,此时服务器端打开TCP20端口号,但是在连接过程中,服务器不知道客户端端口是多少,客户端会主动连接服务端的端口号tcp21端口,发起一个命令通道(YYYY端口),告诉服务端,客户端的端口号是YYYY随机端口,此时服务端就可以通过YYYY随机端口来连接客户端,如果客户端有防火墙,客户端连接服务端可以,但是服务端直接连接客户端传输数据,就会被防火墙阻挡,无法传输。

    被动(PASV style):客户端主动连接

    命令(控制):客户端:随机port --- 服务器:tcp21
    数据:客户端:随机port ---服务器:随机port

    原理:服务端默认打开监听端口TCP21端口号,客户端配置TCP21端口主动去连接服务端的防火墙打开的tcp21端口,并通过命令通道发起一个YYYY的随机端口,此时服务器端的防火墙要有连接跟踪功能(link track),会分析客户端发起TFP协议,可以分析出命令通道的YYYY端口,进而服务端的防火墙会对应打开YYYY随机端口。

    服务器被动模式数据端口示例:

    227 Entering Passive Mode (172,16,0,1,224,59)
    服务器数据端口为:224*256+59
    

    FTP软件介绍

    FTP服务器:

    Wu-ftpd,Proftpd,Pureftpd,ServU,IIS
    vsftpd:Very Secure FTP Daemon,CentOS默认FTP服务器
          高速,稳定,下载速度是WU-FTP的两倍
          ftp.redhat.com数据:单机最多可支持15000个并发

    客户端软件:

    ftp,lftp,lftpget,wget,curl
    ftp -A ftpserver port -A主动模式 -p 被动模式
    lftp –u username ftpserver
    lftp username@ftpserver
    lftpget ftp://ftpserver/pub/file
    gftp:GUI centos5 最新版2.0.19 (11/30/2008)
    filezilla,CuteFtp,FlashFXP,LeapFtp
    IE ftp://username:password@ftpserver
    

    FTP服务

    状态码:

    1XX:信息 125:数据连接打开
    2XX:成功类状态 200:命令OK 230:登录成功
    3XX:补充类 331:用户名OK
    4XX:客户端错误 425:不能打开数据连接
    5XX:服务器错误 530:不能登录

    用户认证:

    匿名用户:ftp,anonymous,对应Linux用户ftp
    系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
    虚拟用户:特定服务的专用用户,独立的用户/密码文件
           nsswitch:network service switch名称解析框架
           pam:pluggable authentication module 用户认证
           /lib64/security /etc/pam.d/ /etc/pam.conf
    

    FTP命令常见选项:

    -d:详细显示指令执行过程,便于排错或分析程序执行的情况;
    -i:关闭互动模式,不询问任何问题;
    -g:关闭本地主机文件名称支持特殊字符的扩充特性;
    -n:不使用自动登录;
    -v:显示指令执行过程。
    

    实例:

    FTP>ascii: 设定以ASCII方式传送文件(缺省值)
    FTP>bell: 每完成一次文件传送,报警提示.
    FTP>binary: 设定以二进制方式传送文件.
    FTP>bye: 终止主机FTP进程,并退出FTP管理方式.
    FTP>case: 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母.
    FTP>cd: 同UNIX的CD命令.
    FTP>cdup: 返回上一级目录.
    FTP>chmod: 改变远端主机的文件权限.
    FTP>close: 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除.
    FTP>delete: 删除远端主机中的文件.
    FTP>dir [remote-directory] [local-file] 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件.
    FTP>get [remote-file] [local-file] 从远端主机中传送至本地主机中.
    FTP>help [command] 输出命令的解释.
    FTP>lcd: 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录.
    FTP>ls [remote-directory] [local-file] 同DIR.
    FTP>macdef: 定义宏命令.
    FTP>mdelete [remote-files] 删除一批文件.
    FTP>mget [remote-files] 从远端主机接收一批文件至本地主机.
    FTP>mkdir directory-name 在远端主机中建立目录.
    FTP>mput local-files 将本地主机中一批文件传送至远端主机.
    FTP>open host [port] 重新建立一个新的连接.
    FTP>prompt: 交互提示模式.
    FTP>put local-file [remote-file] 将本地一个文件传送至远端主机中.
    FTP>pwd: 列出当前远端主机目录.
    FTP>quit: 同BYE.
    FTP>recv remote-file [local-file] 同GET.
    FTP>rename [from] [to] 改变远端主机中的文件名.
    FTP>rmdir directory-name 删除远端主机中的目录.
    FTP>send local-file [remote-file] 同PUT.
    FTP>status: 显示当前FTP的状态.
    FTP>system: 显示远端主机系统类型.
    FTP>user user-name [password] [account] 重新以别的用户名登录远端主机.
    FTP>? [command]: 同HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。
    FTP>! 从 ftp 子系统退出到外壳。

    vsftpd服务

    由vsftpd包提供  默认是21端口

    不再由xinetd管理

    用户认证配置文件:/etc/pam.d/vsftpd

    服务脚本:

    /usr/lib/systemd/system/vsftpd.service
    /etc/rc.d/init.d/vsftpd

    配置文件:

    /etc/vsftpd/vsftpd.conf
    man 5 vsftpd.conf

    格式:option=value

    注意:= 前后不要有空格

    匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
    系统用户共享文件位置:用户家目录
    虚拟用户共享文件位置:为其映射的系统用户的家目录

    vsftp服务配置 

    (1)备份配置文件

    [root@centos7~]#cd /etc/vsftpd
    [root@centos7vsftpd]#ls
    ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
    [root@centos7vsftpd]#cp vsftpd.conf{,.bak}
    [root@centos7vsftpd]#ls
    ftpusers  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh
    

    (2)vsftp服务默认未监听端口,可以在最底部加入指定的端口号  默认端口号是21

    vim /etc/vsftpd/vsftpd.conf

     (3)重启vsftpd服务,可以查看此时的端口号已经修改了,ss -nlt

    [root@centos7vsftpd]#systemctl restart vsftpd

    (4)连接服务端的ftp时,不需要输入-p选项

    ftp 192.168.34.101 2121

    命令端口

    listen_port=21
    

    主动模式端口

    connect_from_port_20=YES 主动模式端口为20
    ftp_data_port=20 (默认) 指定主动模式的端口

    被动模式端口范围

    linux 客户端默认使用被动模式
    windows 客户端默认使用主动模式
    pasv_min_port=6000 0为随机分配
    pasv_max_port=6010

    使用当地时间

    use_localtime=YES 使用当地时间(默认为NO,使用GMT)
    

    匿名用户

    anonymous_enable=YES 支持匿名用户
    no_anon_password=YES(默认NO) 匿名用户略过口令检查 anon_world_readable_only (默认YES)只能下载全部读的文件
    anon_upload_enable=YES 匿名上传,注意:文件系统权限
    anon_mkdir_write_enable=YES 匿名建目录
    anon_umask=0333 指定匿名上传文件的umask,默认077
    anon_other_write_enable=YES 可删除和修改上传的文件
    指定上传文件的默认的所有者和权限
    chown_uploads=YES(默认NO)
    chown_username=wang
    chown_upload_mode=0644
    

    实验:各参数配置详解

    A主机:192.168.34.100 (客户端,ftp)

    B主机:192.168.34.101 (服务端,vsftp)

    (1)在A主机安装客户端

    yum install ftp  -y
    

    (2)在B主机安装服务端

    yum install vsftpd  -y
    systemctl start vsftpd
    

     (3)在B主机指定的目录下新建一个文件(/var/ftp/pub/目录下)

    [root@centos7~]#cd /var/ftp/pub
    [root@centos7pub]#ls
    [root@centos7pub]#cp /etc/fstab f1
    [root@centos7pub]#ls
    f1
    [root@centos7pub]#cp /etc/fstab f2
    [root@centos7pub]#ls
    f1  f2
    

    (4)在A主机FTP客户端现在f1文件,此时可以看到我们是在data目录下,连接的ftp服务器端,此时下载下来的文件就会在data目录下 

    在A主机上查看data目录下下载的数据

    如果多个用户想连接vsftp服务器去下载文件,需要加入以下配置,否则无法分配多个端口号,多个用户无法下载

    vim /etc/vsftpd/vsftpd.conf
    pasv_min_port=6000        0为随机分配
    pasv_max_port=6010

    在B主机(服务端)vim /etc/vsftpd/vsftpd.conf底部写入本机内容

    (1)略过口令检查,使用当地时间,当地时间默认加8小时

    (2)修改完配置之后重启vsftpd服务:systemctl restart vsftpd

    linux客户端文件时间是正确的,而windows客户端的文件时间就再往后加8小时

    (3)不允许匿名登录

    vim /etc/vsftpd/vsftpd.conf

    重启vsftpd服务:systemctl restart vsftpd

     此时匿名无法登录,可以使用服务端的用户账号登录

     anon_upload_enable=YES 匿名上传,注意:文件系统权限

    (1)在B主机(服务端)修改vsftpd配置文件,注释去掉,并重启vsftpd服务

    vim /etc/vsftpd/vsftpd.conf  修改配置文件

    systemctl restart  vsftpd 重启vsftpd服务

    (2)在B主机(服务端)创建一个目录,并赋予指定用户一个读写执行权限

    [root@centos7pub]#systemctl restart vsftpd
    [root@centos7pub]#mkdir /var/ftp/upload
    [root@centos7pub]#ll -d /var/ftp/upload/
    drwxr-xr-x 2 root root 6 Dec  2 16:23 /var/ftp/upload/
    [root@centos7pub]#setfacl -m u:ftp:rwx /var/ftp/upload/

    (3)在A主机(客户端)登录vsftpd服务,并上传文件到upload目录下

      

    可以看到此时上传的用户名是ftp文件

      

     anon_umask=0333 指定匿名上传文件的umask,默认077

    (1)修改B主机(服务端)配置文件内容,指定新建的文件权限

    vim  /etc/vsftpd/vsftpd.conf
    anon_umask=0333
    

     

     (2)在A主机(客户端)连接ftp服务,可以下载新建的文件444权限的文件f1,不能下载f2文件

     anon_other_write_enable=YES 可删除和修改上传的文件

    (1)在B主机(服务端)修改vsftpd服务配置文件

    [root@centos7pub]#vm /etc/vsftpd/vsftpd.conf
    anon_other_write_enable=YES
    
    [root@centos7pub]#systemctl restart vsftpd 重启服务
    

      此时就可以删除之前新建的文件,由于都是匿名登陆,尽量不要赋予此权限。

    指定上传文件的默认的所有者和权限

    在B主机vsftpd服务修改配置文件,并重启vsftpd服务,下载的文件就会指定自定义的信息

    vim  /etc/vsftpd/vsftpd.conf
    chown_uploads=YES
    chown_username=wang
    chown_upload_mode=0644

    Linux系统用户

    local_enable=YES 是否允许linux用户登录
    write_enable=YES 允许linux用户上传文件
    local_umask=022 指定系统用户上传文件的默认权限
    

    vim /etc/vsftpd/vsftpd.conf,将所有的用户ftp切换到/ftproot目录下,用户的根不能有写权限,有写权限无法登录

    guest_enable=YES     所有系统用户都映射成guest用户
    guest_username=ftp   配合上面选项才生效,指定guest用户
    local_root=/ftproot  guest 用户登录所在目录
    anonymous_enable=no  不允许匿名登录

    在B主机服务器新建一个目录/ftproot

    [root@centos7ftproot]#mkdir /ftproot

    此时登录ftp服务,才可以登录

     

     如果此时将B主机服务器端的/ftproot目录权限改为777,就无法登录

     

    给ftp用户设置读写执行权限也无法登录

    [root@centos7ftproot]#setfacl -m u:ftp:rwx /ftproot

    此时在A主机客户端就无法登录

     

     总结:用户的根不能有写权限,有写权限无法登录

    禁锢所有系统用户在家目录中

    chroot_local_user=YES(默认NO,不禁锢)禁锢系统用户
    

    (1)在vsftpd服务端修改配置文件,取消注释此行

    vim /etc/vsftpd/vsftpd.conf

     

    重启vsftpd服务:systemctl restart vsftpd

    (2) 此时在A主机登陆失败,需要修改家目录用户权限

     

    (3)去掉家目录liu用户的写权限,就可以登录ftp服务

    [root@centos7~]#ll /home/
    total 0
    drwx------. 3 liu liu 78 Apr 11  2018 liu
    [root@centos7~]#chmod -w /home/liu
    

    在B主机新建一个文件f1

     

    通过liu用户登录成功界面:

     

     禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反,当chroot_local_user=YES启用白名单

    vim /etc/vsftpd/vsftpd.conf
    chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list 当chroot_local_user=YES时,则chroot_list中用户不禁锢 当chroot_local_user=NO时,则chroot_list中用户禁锢

     (1)修改vsftpd配置文件,将几行注释内容取消:vim  /etc/vsftpd/vsftpd.conf

     (2)新建一个文件,将用户名添加到chroot_list文件,并重启vsftpd服务

    [root@centos7liu]#cd /etc/vsftpd/
    [root@centos7vsftpd]#echo liu > chroot_list
    [root@centos7vsftpd]#cat chroot_list 
    liu
    [root@centos7vsftpd]# systemctl restart vsftpd
    

     (3)在A主机登陆ftp服务,此时liu用户就不会被紧固,可以切换到任意目录下

     

    禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反,当chroot_local_user=NO启用黑名单

    (1)在B主机服务端修改配置文件,vim /etc/vsftpd/vsftpd.conf  修改配置文件,不启用chroot_local_user=NO,此时开启黑名单,用户名在chroot_list文件内,就会被禁锢

           systemctl restart vsftpd 重启服务

     

     此时可以看到chroot_list文件中有liu用户

    [root@centos7~]#cat /etc/vsftpd/chroot_list 
    liu
    

    (2)在A主机上登陆ftp服务,此时的liu用户登陆ftp服务时,liu用户被禁锢了

    wu-ftp日志:默认启用

    xferlog_enable=YES (默认) 启用记录上传下载日志
    xferlog_std_format=YES (默认) 使用wu-ftp日志格式
    xferlog_file=/var/log/xferlog (默认)可自动生成
    

    vsftpd日志:默认不启用

    dual_log_enable=YES 使用vsftpd日志格式,默认不启用
    vsftpd_log_file=/var/log/vsftpd.log(默认)可自动生成
    

    示例:在/etc/vsftpd/vsftpd.conf配置文件最下面写入启动vsftpd日志一行,重启vsftpd服务即可

    vim  /etc/vsftpd/vsftpd.conf

    查看日志文件内容部:

     

    登录提示信息

    ftpd_banner=“welcome to mage ftp server"
    banner_file=/etc/vsftpd/ftpbanner.txt 优先上面项生效
    

    目录访问提示信息

    dirmessage_enable=YES (默认)
    message_file=.message(默认) 信息存放在指定目录下.message
    

    使用pam(Pluggable Authentication Modules)完成用户认证

    pam_service_name=vsftpd
              pam配置文件:/etc/pam.d/vsftpd
              /etc/vsftpd/ftpusers 默认文件中用户拒绝登录

    将pam模块中的sense改为alllow模式,只允许ftpusers文件中的用户名登陆ftp服务

    是否启用控制用户登录的列表文件

    userlist_enable=YES 默认有此设置
    userlist_deny=YES(默认值) 黑名单,不提示口令,NO为白名单
    userlist_file=/etc/vsftpd/users_list 此为默认值
    

    在此清单里的用户名都不能登录ftp服务,如果删除了root用户就可以以root身份登陆ftp服务。

     在配置文件中加入一个选项,不拒绝user_list文件中的用户登录,此时user_list文件中的用户就可以登录ftp服务

    vim /etc/vsftpd/vsftpd.conf  修改配置文件并重启vsftpd服务:systemctl  restart  vsftpd

     vsftpd服务指定用户身份运行,默认值,不修改

    nopriv_user=nobody (默认值)
    

    连接数限制

    max_clients=0   最大并发连接数,0默认是无限制连接
    max_per_ip=0   每个IP同时发起的最大连接数,0默认是无限制连接
    

    示例:

    vim /etc/vsftpd/vsftpd.conf,修改配置文件,设置为2,最大并发连接数是2。

     此时查看B服务端主机已经有两个连接。

    此时在A主机,客户端连接时,就会提示太多连接

     

     max_per_ip=1,设置为1,每个IP同时发起的最大连接1次,保证每个IP地址用户的公平性

      传输速率:字节/秒,生产中可以进行限速设置1024000=1M

    anon_max_rate=0 匿名用户的最大传输速率
    local_max_rate=0 本地用户的最大传输速率
    

      连接时间:秒为单位

    connect_timeout=60 主动模式数据连接超时时长
    accept_timeout=60 被动模式数据连接超时时长
    data_connection_timeout=300 数据连接无数据输超时时长
    idle_session_timeout=60 无命令操作超时时长
    

      优先以文本方式传输

    ascii_upload_enable=YES  采用ascii模式传输,会将源文件破坏掉,不建议使用
    ascii_download_enable=YES
    

    配置FTP服务以非独立服务方运行(适用于centos6)

    vim /etc/vsftpd/vsftpd.conf/

    listen=NO,默认为独立方式

    vim /etc/xinetd.d/vsftpd
    service ftp
    {
    flags = REUSE
    socket_type = stream
    wait = no
    user = root
    server = /usr/sbin/vsftpd
    log_on_failure += USERID
    disable = no
    }
    

    实现基于SSL的FTPS  

    查看是否支持SSL

    ldd `which vsftpd` 查看到libssl.so

    创建自签名证书,对账号进行加密

    (1)切换到指定的目录下,并开始创建自签名证书

    [root@centos7~]#cd /etc/vsftpd
    [root@centos7vsftpd]#ls
    ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
    [root@centos7vsftpd]#mkdir ssl
    [root@centos7vsftpd]#cd /etc/pki/tls/certs
    [root@centos7certs]#ls
    ca-bundle.crt  ca-bundle.trust.crt  localhost.crt  make-dummy-cert  Makefile  renew-dummy-cert
    [root@centos7certs]#make vsftpd.pem
    umask 77 ; 
    PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; 
    PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; 
    /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2  ; 
    cat $PEM1 >  vsftpd.pem ; 
    echo ""    >> vsftpd.pem ; 
    cat $PEM2 >> vsftpd.pem ; 
    rm -f $PEM1 $PEM2
    Generating a 2048 bit RSA private key
    ...+++
    ..................................+++
    writing new private key to '/tmp/openssl.wtgna6'
    -----
    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) []:beijing
    Locality Name (eg, city) [Default City]:beijing
    Organization Name (eg, company) [Default Company Ltd]:magedu
    Organizational Unit Name (eg, section) []:opt
    Common Name (eg, your name or your server's hostname) []:ftp.magedu.com
    Email Address []:
    

    (2)将新生成的vsftpd.pem文件移动到新建的ssl目录下

    [root@centos7certs]#mv vsftpd.pem  /etc/vsftpd/ssl/
    

     (3)修改vsftpd配置文件,在底部添加上相关配置信息,并重启vsftpd服务

    [root@centos7certs]#vim /etc/vsftpd/vsftpd.conf
    ssl_enable=YES 
    allow_anon_ssl=NO
    force_local_logins_ssl=YES
    force_local_data_ssl=YES
    rsa_cert_file=/etc/vsftpd/ssl/vsftpd.pem 
    

     (4)重启vsftpd服务

    [root@centos7certs]#systemctl start vsftpd
    

    (5)在FTP服务软件上配置信息并连接

    对比加密与未加密时抓取的信息结果:

    tcpdump -i ens33 -nn -X port 21  未加密前,此时可看到用户登录的账号和密码:liu和centos

     加密后,再进行跟踪,此时就无法看到账号和密码信息

     vsftpd虚拟用户

    虚拟用户:

    所有虚拟用户会统一映射为一个指定的系统帐号:访问共享位置,即为此系统帐号的家目录
    各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

    虚拟用户帐号的存储方式:

    文件:编辑文本文件,此文件需要被编码为hash格式
         奇数行为用户名,偶数行为密码
         db_load -T -t hash -f vusers.txt vusers.db

    关系型数据库中的表中:

    实时查询数据库完成用户认证

    mysql库:pam要依赖于pam-mysql

    /lib64/security/pam_mysql.so
    /usr/share/doc/pam_mysql-0.7/README
    

    实现基于文件验证的vsftpd虚拟用户  

    (1)新建一个虚拟用户文件,转换为二进制文件,并修改文件权限

    [root@centos7vsftpd]#vim vusers.txt
    user1
    centos
    user2
    magedu 
    
    [root@centos7vsftpd]#db_load -T -t hash -f vusers.txt vusers.db  将文件格式改为二进制格式
    [root@centos7vsftpd]#ls
    ftpusers  ssl  user_list  vsftpd.conf  vsftpd_conf_migrate.sh  vusers.db  vusers.txt
    [root@centos7vsftpd]#chmod 600 vuser*   修改两个文件的权限为600
    

    (2)新建一个目录,指定一个虚拟用户访问固定的目录文件

    [root@centos7vsftpd]#mkdir /data/ftproot   新建一个指定目录
    [root@centos7vsftpd]#useradd -d /data/ftproot  -s /sbin/nologin  -r vuser  创建一个操作系统账号
    [root@centos7vsftpd]#chown vuser.vuser /data/ftproot   修改目录权限
    [root@centos7vsftpd]#cd /data/ftproot/
    [root@centos7ftproot]#mkdir upload  在ftproot目录下新建一个目录,作为用户上传目录,需要加上写权限
    [root@centos7ftproot]#setfacl -m u:vuser:rwx upload  此时就可以授予upload目录写权限,保证用户可以上传文件
    [root@centos7ftproot]#mkdir download    新建一个下载目录,此时用户没有写权限,只能下载文件,而不能上传文件
    [root@centos7pam.d]#chmod -w /data/ftproot  去掉根目录的写权限,否则用户无法登录

    (3)修改pam模块配置信息,验证用户账号的合法性

    [root@centos7pam.d]#cd /etc/pam.d
    [root@centos7pam.d]#vim vsftpd.db
    auth required pam_userdb.so db=/etc/vsftpd/vusers
    account required pam_userdb.so db=/etc/vsftpd/vusers 
    

     (4)指定好pam模块用户验证信息后,需要在vsftpd调用此pam模块

    [root@centos7pam.d]#vim /etc/vsftpd/vsftpd.conf
    pam_service_name=vsftpd.db   虚拟用户存放在此文件中
    guest_enable=YES                                                                                                                                 
    guest_username=vuser      将虚拟用户映射为vuser
    [root@centos7pam.d]#systemctl restart vsftpd   重启服务

     

     (5)验证虚拟用户登录结果,此时已经可以登录,可以看到:新建的虚拟用户user1和user2都映射的是同一个目录

    此时普通用户的站号就无法登录ftp服务:

     

     设置user1用户登录ftp上传权限

    在vsftpd配置文件中修改配置文件,指定用户账号的不同配置文件

    vim /etc/vsftpd/vsftpd.conf
    user_config_dir=/etc/vsftpd/vusers.d/  vusers.d存放用户的配置文件

    对user1赋予一个写权限,此时user1用户就具有上传文件的权限

    [root@centos7vsftpd]#mkdir vusers.d
    [root@centos7vusers.d]#cd /etc/vsftpd/vusers.d
    [root@centos7vusers.d]#vim user1
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    [root@centos7vusers.d]#systemctl restart vsftpd
    

     登陆ftp服务器,验证user1上传文件的结果,此时已经可以上传文件

     

     在ftp服务器上查看此时上传的文件信息,是以虚拟用户上传的文件:

     设置虚拟不同用户登录ftp后在不同的文件夹,并赋予user2虚拟用户写权限,可以上传文件

    (1)在配置文件中修改user2的信息

    [root@centos7vusers.d]#cd /etc/vsftpd/vusers.d
    [root@centos7vusers.d]#vim user2
    local_root=/data/ftproot2   
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES

    (2)新建一个/data/ftproot2目录,并在目录下创建一个文件,并重新启动ftp服务

    [root@centos7vusers.d]#mkdir /data/ftproot2  新建一个根目录
    [root@centos7vusers.d]#chmod -w /data/ftproot2  去掉根目录写权限
    [root@centos7vusers.d]#cd /data/ftproot2
    [root@centos7ftproot2]#ls
    root.txt
    [root@centos7ftproot2]#mkdir upload  在根目录下新建一个指定上传的目录
    [root@centos7ftproot2]#setfacl -m u:vuser:rwx upload  赋予vuser读写执行权限
    [root@centos7vusers.d]#touch /data/ftproot2/root.txt
    [root@centos7vusers.d]#systemctl restart vsftpd  重启服务

    (3)验证此时的user2结果  

     

     实现基于MYSQL验证的vsftpd虚拟用户

    环境准备:

    A主机:192.168.34.100 (vsftpd服务)

    B主机:192.168.34.101(mysql数据库)

    C主机:192.168.34.102 (作为连接ftp服务机器)

    在A主机源码编译pam_mysql,并修改相关配置文件

     (1)在vsftpd服务端(A主机)安装所需要包和包组:

    [root@centos7~]#yum install mariadb-server -y
    [root@centos7~]#systemctl start mariadb
    

    (2)centos7需要下载pam_mysql模块,centos6不需要下载

     下载官网:https://sourceforge.net/projects/pam-mysql/ 

      将下载的文件传到linux系统中

    rz    下载的pam模块传到linux系统中
    [root@centos7~]#tar xvf pam_mysql-0.7RC1.tar.gz   解压当前下载的pam包
    

    (3)切换到解压后的pam模块包,开始进行源码编译安装包组,安装依赖的包

    [root@centos7pam_mysql-0.7RC1]#yum groupinstall "development tools" -y
    [root@centos7pam_mysql-0.7RC1]#yum -y install mariadb-devel pam-devel openssl-devel    安装与mariadb关联的包、pam关联包,以及要加密的包
    

    (4)开始编译,关联pam,指定pam路径   

    [root@centos7pam_mysql-0.7RC1]#./configure --with-pam-mods-dir=/lib64/security --with-mysql=/usr --with-pam=/usr  后面两个with选项可以不加,默认
    

     (5)安装包

    [root@centos7pam_mysql-0.7RC1]#make && make install
    

     在B主机数据库内新建数据库和表  

     在数据库中创建一个数据库和表

    MariaDB [(none)]> create database vsftpd;  创建一个vsftpd数据库
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [(none)]> use vsftpd;
    Database changed
    创建user表 CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL ); Query OK, 0 rows affected (0.01 sec)

    (7)在新建的表中添加虚拟用户:ftp1和ftp2,并创建一个用户,指定vsftpd用户能连接此用户,访问users表

    MariaDB [vsftpd]> insert users(name,password)values('ftp1',password('centos')),('ftp2',password('magedu'));             password('cenots')将centos密码进行加密
    MariaDB [vsftpd]> grant select on vsftpd.users to vsftpd@'192.168.34.101' identified by 'centos';  创建一个用户vsftpd,且让其能访问users表内容

     在A主机上修改pam模块信息,调用pam模块内容

    (1)在主机A上修改pam模块配置文件

    [root@centos7pam.d]#cd /etc/pam.d
    [root@centos7pam.d]#vim vsftpd.mysql
    auth required pam_mysql.so user=vsftpd passwd=centos host=192.168.34.101 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2       
    account required pam_mysql.so user=vsftpd passwd=centos host=192.168.34.101 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
    

    含义:

    •auth 表示认证
    •account 验证账号密码正常使用
    •required 表示认证要通过
    •pam_mysql.so模块是默认的相对路径,是相对/lib64/security/路径而言,也可以写绝对路径;后面为给此模块传递的参数
    •user=vsftpd为登录mysql的用户
    •passwd=magedu 登录mysql的的密码
    •host=mysqlserver mysql服务器的主机名或ip地址
    •db=vsftpd 指定连接msyql的数据库名称
    •table=users 指定连接数据库中的表名
    •usercolumn=name 当做用户名的字段
    •passwdcolumn=password 当做用户名字段的密码
    •crypt=2 密码的加密方式为mysql password()函数加密

    (2)新建一个vuser用户,并修改/data/ftproot目录的权限

    [root@centos7vsftpd]#useradd -d /data/ftproot  -s /sbin/nologin  -r vuser  创建一个操作系统账号
    [root@centos7vsftpd]#chown vuser.vuser /data/ftproot   修改目录权限

    (3)修改配置文件,调用pam模块

    vim /etc/vsftpd/vsftpd.conf
    pam_service_name=vsftpd.mysql        指定pam模块:vsftpd.mysql                                                                                                              
    guest_enable=YES
    guest_username=vuser   映射vusers文件
    user_config_dir=/etc/vsftpd/vusers.d/
    

    (4)在指定的目录新建ftp1和ftp2虚拟用户写权限

    [root@centos7vsftpd]#mkdir /etc/vsftpd/vusers.d  新建一个vusers.d目录
    [root@centos7vsftpd]#cd /etc/vsftpd/vusers.d
    [root@centos7vusers.d]#vim ftp1     对ftp1授权写权限,可以上传文件到指定的目录下
    anon_upload_enable=YES                                                                                                                           
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    [root@centos7vusers.d]#systemctl restart vsftpd  重启vsftpd服务 
    

    (5)此时想将ftp2虚拟用户访问的文件存放在另一个目录下,可以进行如下操作,创建一个ftp2文件,并将ftp2指定到/data/ftproot2目录下

    [root@centos7vusers.d]#cd /etc/vsftpd/vusers.d
    [root@centos7vusers.d]#vim ftp2
    local_root=/data/ftproot2   
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    

    (6)新建一个/data/ftproot2目录,并将vuser用户有读写执行权限

    [root@centos7vusers.d]#mkdir /data/ftproot2  新建一个根目录
    [root@centos7vusers.d]#chmod  -w /data/ftproot2  去掉写权限,否则无法下载文件
    [root@centos7vusers.d]#cd /data/ftproot2
    [root@centos7ftproot2]#ls
    root.txt
    [root@centos7ftproot2]#mkdir upload  在根目录下新建一个指定上传的目录
    [root@centos7ftproot2]#setfacl -m u:vuser:rwx upload  赋予vuser读写执行权限
    [root@centos7vusers.d]#touch /data/ftproot2/root.txt
    [root@centos7vusers.d]#systemctl restart vsftpd  重启服务

     最后在C主机登陆ftp服务进行验证ftp1登陆结果,连接A主机(vsftp服务)

     如果想创建一个新的用户再进行访问ftp服务,直接在A主机数据库创建一个账号即可,创建一个ftp3虚拟用户

    MariaDB [vsftpd]> insert users(name,password)values('ftp3',password('centos')); 
    

    此时在C主机上登陆ftp服务,就可以登录新建的ftp3虚拟用户

    实现一个脚本:将本机的文件进行上传和下载到ftp服务器

    在客户端创建一个脚本:

    [root@centos777~]#vim ftp.sh 
    cd /data/                          切换到客户端data目录下
    ftp -n -i 192.168.34.100  << EOF   进行连接指定ftp服务端IP地址                                                                                                               
    user ftp2 magedu                  使用ftp2用户进行登录
    cd upload                        切换到ftp服务器的upload目录下
    mput *.log                       将客户端的文件传到ftp服务器上
    mget *.txt                       将服务器上的文件下载到客户端上
    bye                              最后退出
    EOF
    

     验证结果:

    客户端新建.log后缀的文件

    [root@centos777data]#touch {a,b}.log
    [root@centos777data]#ls
    a.log  b.log
    

    在ftp服务端新建.txt后缀文件

    [root@centos7upload]#cd /data/ftproot2/upload
    [root@centos7upload]#touch {f1,f2}.txt
    [root@centos7upload]#ls
    f1.txt  f2.txt

    在客户端执行脚本并查看客户端/data/目录下文件

    [root@centos777~]#bash ftp.sh   执行脚本
    [root@centos777~]#ls /data    此时data下下载了ftp服务器的文件
    a.log  b.log  f1.txt  f2.txt
    

    在ftp服务器查看上传文件情况,此时客户端的.log文件已经上传的ftp服务器上

    [root@centos7upload]#ls
    a.log  b.log  f1.txt  f2.txt
    

      

      

     

     

     

      

     

     

      

      

      

      

     

      

     

     

      

      

      

     

     

      

      

      

      

      

      

      

      

     

      

      

      

      

      

  • 相关阅读:
    BZOJ-1034-[ZJOI2008]泡泡堂BNB(贪心)
    BZOJ-2456-mode(思维题)
    POJ-2528-Mayor's posters(线段树+离散化)
    POJ-2352-Stars(树状数组)
    HDU-2688-Rotate(树状数组)
    POJ-1195-Mobile phones(二维树状数组)
    YYHS-NOIP2017Training0921-逆光
    YYHS-鏖战字符串(斜率优化)
    左偏树
    2-sat模板
  • 原文地址:https://www.cnblogs.com/struggle-1216/p/11968834.html
Copyright © 2011-2022 走看看