vsftpd

image.png
对于使用互联网的用户来说,首要目的就是获取资料,能够获取文件资料的方式有很多,其中一种就是文件传输,如今的互联网机器有各种型号、品牌,类型,如dell、惠普、浪潮、IBM、也分为个人PC、工作站、服务器、大型机、超级计算机等,并且还分为Windows、Linux、Unix、Mac等不同的操作系统。
为了能够在这么多样的机器之间传输文件,FTP(文件传输协议、File Transfer protocol)诞生了。
FTP是一种在互联网中进行文件传输的协议,基于C/S模式,默认服务端口号是20、21

  1. 20端口用于数据传输
  2. 21端口用于接收客户端的FTP命令与参数

image.png
FTP服务器按照FTP协议在互联网上提供文件存储于文件访问的服务
FTP客户端用于向服务器索要资源
FTP工作模式主要分为两种

  • 主动模式(PORT):FTP服务器主动向客户端发起连接请求
  • 被动模式(PASV):FTP服务器等待客户端发起连接请求。

    安装vsftpd服务

    FTP是一种传输协议,实现了这种协议的工具,有一款Linux平台上的程序,名为vsftpd(ver secure ftp daemon,非常安全的FTP守护进程) ```shell 基于centos平台,直接yum安装 [root@chaogelinux ~]# yum install vsftpd -y

注意关闭防火墙规则

iptables -F

  1. <a name="fHt3s"></a>
  2. #### vsftpd配置文件
  3. Linux在默认安装的软件配置文件都在/etc目录
  4. <a name="bmRnT"></a>
  5. #### 注意配置文件,不得有任何莫名其妙的空格!否则会重启失败
  6. ```shell
  7. #过滤出非注释行,非空行
  8. [root@chaogelinux ~]# grep -vE '^#|^$' /etc/vsftpd/vsftpd.conf
  9. anonymous_enable=YES #是否开启匿名用户允许访问
  10. local_enable=YES #是否允许本地用户登录FTP
  11. write_enable=YES #write_enable=YES #全局设置,是否容许写入,开启允许上传的权限
  12. local_umask=022 #本地用户上传文件的umask 用户上传文件后,文件的权限参数
  13. dirmessage_enable=YES #允许为目录配置显示信息,显示每个目录下面的message_file文件的内容
  14. xferlog_enable=YES #开启日志功能,以及存放路径
  15. xferlog_file=/var/log/vsftpd.log #日志路径
  16. connect_from_port_20=YES #使用20端口进行连接
  17. xferlog_std_format=YES #标准日志格式
  18. listen=YES #绑定到监听端口
  19. listen_ipv6=YES #开启ipv6
  20. pam_service_name=vsftpd #设置PAM的名称
  21. userlist_enable=YES #设置用户已列表,允许或是禁止 用户文件中定义了用户权限相关,打开后通过列表文件对文件权限进行控制
  22. tcp_wrappers=YES #控制主机访问,检查/etc/hosts.allow hosts.deny的配置达到防火墙作用

vsftpd服务程序

vsftpd允许用户三种认证的模式登录到FTP服务器。

  • 本地用户模式,基于Linux本地账号密码进行认证,配置简单,但是一旦被破解,服务器信息就很危险
  • 匿名用户模式,任何人无需密码直接登录
  • 虚拟用户模式,单独为FTP创建用户数据库,基于口令验证账户信息,只适用于FTP,不会影响其他用户信息,最为安全。

    安装ftp客户端

    ftp客户端有多种形式,图形化、命令行

  • ftp命令客户端

直接在命令行终端输入ftp命令,即可进入交互式的ftp命令行中,输入问号可以查看所有的命令帮助

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

    匿名用户模式

    匿名用户模式是最不安全的方式,一般用在访问不重要的,允许公开的文件,且放在企业内网环境中,置于防火墙规则下,保证基本的安全性。
    vsftpd默认开启了匿名用户模式,修改配置文件,定义匿名用户的权限,如下
    1. [root@chaogelinux ~]# grep '^anon' /etc/vsftpd/vsftpd.conf
    2. anonymous_enable=YES #允许匿名访问
    3. anon_upload_enable=YES #允许匿名用户上传
    4. anon_mkdir_write_enable=YES #允许匿名用户创建目录
    5. anon_other_write_enable=YES #允许匿名用户修改目录
    重启服务,且加载开机自启
    1. [root@chaogelinux ~]# systemctl restart vsftpd #重启服务
    2. [root@chaogelinux ~]# systemctl enable vsftpd #开启自启
    此时可以使用ftp命令连接到FTP服务器了。
    连接了FTP服务端,其实连接的是目录/var/ftp/
    1. [root@chaogelinux ftp]# pwd
    2. /var/ftp
    3. [root@chaogelinux ftp]# ls
    4. pub
    使用ftp客户端命令,连接ftp服务端 ```shell [root@chaogelinux ~]# ftp 123.206.16.61 #连接ftp服务器的ip地址 Connected to 10.141.32.137 (10.141.32.137). 220 (vsFTPd 3.0.2) Name (10.141.32.137:root): anonymous #填入默认的账号 331 Please specify the password. Password: #密码为空,直接回车 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp>

ftp> ls
227 Entering Passive Mode (10,141,32,137,98,195). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 4096 Oct 30 2018 pub 226 Directory send OK. ftp> cd pub #切换工作目录 250 Directory successfully changed. ftp> mkdir chaoge #发现在这里创建文件夹报错了 550 Create directory operation failed.

  1. 由于我们使用匿名用户登录ftp,默认访问的是/var/ftp文件夹,我们来检查下文件夹权限
  2. ```shell
  3. 1.进入该ftp目录后,修改文件夹的权限相关
  4. cd /var/ftp
  5. chown -Rf ftp.ftp pub
  6. 2.检查pub文件夹权限
  7. ll /var/ftp
  8. ------------------------------------------------------------
  9. #检查系统用户ftp
  10. [root@chaogelinux ftp]# id ftp
  11. uid=14(ftp) gid=50(ftp) 组=50(ftp)
  12. #更改pub的属主
  13. [root@chaogelinux ftp]# chown -Rf ftp /var/ftp/pub/ #递归处理所有的文件及子目录 去除错误信息
  14. [root@chaogelinux ftp]# ll
  15. 总用量 4
  16. drwxr-xr-x 2 ftp root 4096 10月 31 2018 pub

再次登录ftp,写入数据

  1. yumac: ~ yuchao$ftp 123.206.16.61
  2. Connected to 123.206.16.61.
  3. 220 (vsFTPd 3.0.2)
  4. Name (123.206.16.61:yuchao): anonymous
  5. 331 Please specify the password.
  6. Password:
  7. 230 Login successful.
  8. ftp> mkdir chaoge666 #创建文件夹
  9. 257 "/pub/chaoge666" created
  10. ftp> rename chaoge666 chaoge888 #重命名文件夹
  11. 350 Ready for RNTO.
  12. 250 Rename successful.
  13. ftp> rmdir chaoge888 #删除文件夹
  14. 250 Remove directory operation successful.

此时成功写入了ftp文件夹数据,服务器上检查文件信息

  1. [root@chaogelinux pub]# pwd
  2. /var/ftp/pub
  3. [root@chaogelinux pub]# ls
  4. chaoge666
  5. [root@chaogelinux pub]# ls
  6. chaoge888

本地用户模式

使用Linux本地用户模式,比匿名用户来的安全,修改配置文件,关闭匿名模式,开启本地用户模式
相关配置文件

  1. [root@chaogelinux pub]# ls /etc/vsftpd/
  2. ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh

修改配置文件如下/etc/vsftpd/vsftpd.conf

  1. anonymous_enable=NO #关闭匿名用户模式
  2. local_enable=YES #开启本地用户模式
  3. write_enable=YES #设置可写权限
  4. local_umask=022 #文件umask值 文件写入数据时,默认的文件权限
  5. userlist_enable=YES #启用【禁止登录的用户名单】文件名是,ftpusers,user_list
  6. userlist_deny=YES #开启禁止登录名单

重启vsftpd服务,加载配置

  1. systemctl restart vsftpd
  2. systemctl enable vsftpd

【此时可以使用ftp客户端连接了,使用linux本地用户信息】
假设当前服务器上用户管理中存在一个用户chaoge

  1. [root@chaogelinux ~]# grep 'chaoge' /etc/passwd
  2. chaoge:x:2002:2002::/home/chaoge:/bin/bash

此时客户端可以使用此用户连接FTP,默认访问的是该用户的家目录,也就是/home/chaoge文件夹内容

  1. yumac: ~ yuchao$ftp 123.206.16.61
  2. Connected to 123.206.16.61.
  3. 220 (vsFTPd 3.0.2)
  4. Name (123.206.16.61:yuchao): chaoge
  5. 331 Please specify the password.
  6. Password:
  7. 230 Login successful.
  8. ftp> ls
  9. 200 PORT command successful. Consider using PASV.
  10. 150 Here comes the directory listing.
  11. -rw-rw-r-- 1 2002 2002 31 Nov 21 01:57 fine.txt
  12. 226 Directory send OK.
  13. ftp> mkdir 超哥到此一游 #新建文件夹
  14. 257 "/home/chaoge/超哥到此一游" created

有些用户是无法登录ftp,是因为vsftp有一个名单,写上了禁止谁登录
ftpusers , user_list

  1. [root@chaogelinux vsftpd]# pwd
  2. /etc/vsftpd
  3. [root@chaogelinux vsftpd]# ls
  4. ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
  5. #文件中写入的名字,都是禁止登录的
  6. [root@chaogelinux vsftpd]# cat ftpusers
  7. # Users that are not allowed to login via ftp
  8. root
  9. bin
  10. daemon
  11. adm
  12. lp
  13. sync
  14. shutdown
  15. halt
  16. mail
  17. news
  18. uucp
  19. operator
  20. games
  21. nobody
  22. ####如此,禁止登录的用户
  23. yumac: ~ yuchao$ftp 123.206.16.61
  24. Connected to 123.206.16.61.
  25. 220 (vsFTPd 3.0.2)
  26. Name (123.206.16.61:yuchao): root
  27. 530 Permission denied.
  28. ftp: Login failed.

虚拟用户模式

了解了有匿名用户、本地用户、再来了解下虚拟用户模式,顾名思义是虚拟创建出的用户,也是最为安全的一种。

  1. 首先安装Berkeley DB工具,能够转换普通文件为vsftpd识别的数据库加密文件 ```shell yum install db4 db4-utils -y
  1. 2. 创建用于进行FTP认证的用户数据库,奇数行账户名、偶数行是密码
  2. ```shell
  3. [root@chaogelinux vsftpd]# cat ftp_user.txt
  4. chaoge
  5. 666
  6. pyyu
  7. 888
  1. 由于这样的明文信息很不安全,vsftpd也无法加载该格式的数据,因此还得用db_load命令对ftp_user.txt文件数据加密,且设置权限使得普通用户无权限查阅。 ```shell

    3.1 加密文件

    创建加密文件 -T 和-t参数必须加上,用于转化普通文本为vsftpd识别的数据库文件

    [root@chaogelinux vsftpd]# db_load -T -t hash -f /etc/vsftpd/ftp_user.txt /etc/vsftpd/ftp_user.db

检查文件属性

[root@chaogelinux vsftpd]# file ftp_user.db ftp_user.db: Berkeley DB (Hash, version 9, native byte-order)

3.2 降低文件权限

[root@chaogelinux vsftpd]# ll ftp_user.db -rw-r—r— 1 root root 12288 1月 8 09:36 ftp_user.db [root@chaogelinux vsftpd]# chmod 600 ftp_user.db [root@chaogelinux vsftpd]# ll ftp_user.db -rw———- 1 root root 12288 1月 8 09:36 ftp_user.db

3.3 删除旧的数据文件

[root@chaogelinux vsftpd]# rm -rf ftp_user.txt

  1. 4. 创建当虚拟用户登录后默认访问的文件夹路径,且和linux中的一个本地用户做一个映射关系,防止匿名用户登录后,创建了文件夹,但是系统没有此用户报错权限问题
  2. (这里是个小坑,要注意)
  3. ```shell
  4. # 4.1 新建一个用户,指定用户家目录,且禁止登录
  5. useradd -d /var/ftpdir -s /sbin/nologin virtual_chao
  6. # 4.2 检查此ftpdir的属性
  7. [root@chaogelinux vsftpd]# ls -ld /var/ftpdir/
  8. drwx------ 2 virtual_chao virtual_chao 4096 1月 8 09:46 /var/ftpdir/
  9. # 4.3 更改文件夹权限
  10. [root@chaogelinux vsftpd]# chmod -Rf 755 /var/ftpdir/
  11. # 4.4 添加virtual_chao用户至ftpusers禁止用户登录文件,增大系统安全,但是不会影响虚拟用户登录
  12. [root@chaogelinux vsftpd]# echo 'virtual_chao' >> ftpusers
  1. 此时需要创建支持虚拟用户的PAM文件,PAM是一组安全机制的模块,编辑认证文件/etc/pam.d/vsftpd ```shell

    注释掉文中所有语句,添加以下2句,注意db参数指定的是db_load生成的文件路径,无需添加后缀

[root@chaogelinux pam.d]# cat /etc/pam.d/vsftpd auth required pam_userdb.so db=/etc/vsftpd/ftp_user account required pam_userdb.so db=/etc/vsftpd/ftp_user

  1. 6. 最后修改vsftpd配置文件
  2. ```shell
  3. [root@chaogelinux pam.d]# grep -Ev '^$|^#' /etc/vsftpd/vsftpd.conf
  4. anonymous_enable=NO #禁止匿名模式
  5. local_enable=YES #允许本地用户
  6. write_enable=YES
  7. local_umask=022
  8. anon_upload_enable=YES
  9. anon_mkdir_write_enable=YES
  10. anon_other_write_enable=YES
  11. dirmessage_enable=YES
  12. xferlog_enable=YES
  13. connect_from_port_20=YES
  14. xferlog_std_format=YES
  15. listen=NO
  16. listen_ipv6=YES
  17. pam_service_name=vsftpd #指定PAM认证文件
  18. userlist_enable=YES
  19. userlist_deny=YES
  20. tcp_wrappers=YES
  21. guest_enable=YES #开启虚拟用户
  22. guest_username=virtual_chao #指定虚拟用户账号
  23. allow_writeable_chroot=YES #如果用户被限制只能在其家目录,允许用户可以对家目录写入数据

【针对不同的虚拟用户设置不同的权限】
用户ftp认证的虚拟账号,ftp_user.txt

  • chaoge,允许上传,新建,修改,查看,删除权限
  • pyyu,只读权限

这样的需求可以通过vsftpd配置实现,定义user_config_dir参数实现不同的虚拟用户,不同的权限配置

  1. #新建管理虚拟用户权限的文件夹
  2. mkdir /etc/vsftpd/virtual_user_dir
  3. #进入文件夹,创建权限的配置文件
  4. [root@chaogelinux vsftpd]# cd /etc/vsftpd/virtual_user_dir/
  5. [root@chaogelinux virtual_user_dir]# cat chaoge
  6. anon_upload_enable=YES
  7. anon_mkdir_write_enable=YES
  8. anon_other_write_enable=YES
  9. #再创建一个pyyu文件,禁止写入
  10. [root@chaogelinux virtual_user_dir]# pwd
  11. /etc/vsftpd/virtual_user_dir
  12. [root@chaogelinux virtual_user_dir]# ls
  13. chaoge pyyu
  14. [root@chaogelinux virtual_user_dir]# cat pyyu
  15. anon_upload_enable=NO
  16. anon_mkdir_write_enable=NO
  17. anon_other_write_enable=NO

编辑vsftpd主配置文件,添加如下一行

  1. cat /etc/vsftpd/vsftpd.conf
  2. user_config_dir=/etc/vsftpd/virtual_user_dir

重启vsftpd服务,注意配置文件,不得有任何莫名其妙的空格!否则会重启失败

  1. systemctl restart vsftpd

【此时使用客户端登录用户chaoge,进行读写】

  1. yumac: ~ yuchao$ftp 123.206.16.61
  2. Connected to 123.206.16.61.
  3. 220 (vsFTPd 3.0.2)
  4. Name (123.206.16.61:yuchao): chaoge #用匿名用户登录chaoge
  5. 331 Please specify the password.
  6. Password:
  7. 230 Login successful.
  8. ftp> ls #此时看到的是匿名用户映射的家目录内容
  9. 200 PORT command successful. Consider using PASV.
  10. 150 Here comes the directory listing.
  11. -rw-r--r-- 1 0 0 0 Jan 08 02:49 haha
  12. 226 Directory send OK.
  13. ftp> mkdir 超哥到此一游 #chaoge有权限增加文件
  14. 257 "/超哥到此一游" created
  15. #####检查服务器上的FTP目录
  16. [root@chaogelinux ftpdir]# pwd
  17. /var/ftpdir
  18. [root@chaogelinux ftpdir]# ls
  19. haha 超哥到此一游

【使用pyyu用户登录ftp服务端,查看是否能够读写】

  1. yumac: ~ yuchao$ftp 123.206.16.61
  2. Connected to 123.206.16.61.
  3. 220 (vsFTPd 3.0.2)
  4. Name (123.206.16.61:yuchao): pyyu
  5. 331 Please specify the password.
  6. Password:
  7. 230 Login successful.
  8. ftp> mkdir pyyu也想到此一游 #无法写入数据,只能读取
  9. 550 Permission denied.
  10. ftp> ls
  11. 200 PORT command successful. Consider using PASV.
  12. 150 Here comes the directory listing.
  13. -rw-r--r-- 1 0 0 0 Jan 08 02:49 haha
  14. drwx------ 2 2003 2003 4096 Jan 08 02:50 超哥到此一游
  15. 226 Directory send OK.