首页 > 技术文章 > VSFTPD

abc1234567 2020-12-16 06:31 原文

为了能够在这么多样的机器之间传输文件,FTP(文件传输协议,file thransfer protocol)诞生了。

FTP时一种在互联网中进行文件传输的协议,基于C/S模式,默认的服务端口时20,21.

20 端口用于数据传输,21端口用户接受客户端的FTP命令与参数。

 

FTP服务器按照FTP协议在互联网上提供文件存储与文件访问的服务

FTP客户端用于向服务器索要资源

FTP工作模式主要分两种:

  1. 主动模式(port):FTP服务器主动向客户端发起连接请求。

  2. 被动模式(pasv):FTP服务器等待客户端发起请求。

 

安装vsftpd

基于centos平台,直接yum安装
[root@chaogelinux ~]# yum install vsftpd -y

#注意关闭防火墙规则
iptables -F

  

vsftp服务程序

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

  1. 本地用户模式:基于Linux本地账号密码进行认证,配置简单,但是一旦被破解,服务器信息就很危险

  2. 匿名用户模式:任何人无需密码直接登录

  3. 虚拟用户模式:单独为FTP创建用户数据库,基于口令验证账户信息,只适用于FTP,不会影响其他用户信息,

最为安全

安装ftp客户端

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

1. ftp命令客户端

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 子系统退出到外壳。

2. FileZilla图形化工具

安装ftp命令行
yum install ftp -y

 

匿名用户模式:

[root@chaogelinux ~]# grep '^anon' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES    #允许匿名访问
anon_upload_enable=YES    #允许匿名用户上传
anon_mkdir_write_enable=YES    #允许匿名用户创建目录
anon_other_write_enable=YES    #允许匿名用户修改目录

 # 重启服务

[root@chaogelinux ~]# systemctl restart vsftpd  #重启服务
[root@chaogelinux ~]# systemctl enable vsftpd        #开启自启

  

此时可以使用ftp命令连接到FTP服务器了。

连接FTP服务器,其实连接的是目录/var/ftp/

[root@chaogelinux ftp]# pwd
/var/ftp
[root@chaogelinux ftp]# ls
pub

  

#修改/var/ftp目录属主属组为ftp

#检查系统用户ftp
[root@chaogelinux ftp]# id ftp
uid=14(ftp) gid=50(ftp) 组=50(ftp)

#更改pub的属主
[root@chaogelinux ftp]# chown -Rf ftp /var/ftp/pub/        #递归处理所有的文件及子目录  去除错误信息
[root@chaogelinux ftp]# ll
总用量 4
drwxr-xr-x 2 ftp root 4096 10月 31 2018 pub

  

客户端登录ftp服务器

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

  

本地用户模式:

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

anonymous_enable=NO    #关闭匿名用户模式
local_enable=YES    #开启本地用户模式
write_enable=YES    #设置可写权限
local_umask=022    #文件umask值
userlist_enable=YES    #启用【禁止登录的用户名单】文件名是,ftpusers,user_list
userlist_deny=YES    #开启禁止登录名单

  

  重启服务

systemctl restart vsftpd
systemctl enable vsftpd

  此时客户端可以使用服务端的用户连接ftp,默认访问的是该用户的家目录

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

  有些用户无法登录ftp服务器,是因为ftp服务器上有一个名单,写上了禁止谁登录。

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

#文件中写入的名字,都是禁止登录的
[root@chaogelinux vsftpd]# cat ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

####如此,禁止登录的用户
yumac: ~ yuchao$ftp 123.206.16.61
Connected to 123.206.16.61.
220 (vsFTPd 3.0.2)
Name (123.206.16.61:yuchao): root
530 Permission denied.
ftp: Login failed.

  

 

虚拟用户模式:

虚拟用户模式是最为安全的一种,也是虚拟创建出来的用户

首先安全Berkeley DB 工具

 

yum install db4 db4-utils -y

  创建用于进行FTP认证的用户数据库,奇数行账户名,偶数行是密码。

[root@chaogelinux vsftpd]# cat ftp_user.txt
chaoge
666
pyyu
888

  由于这样的明文信息很不安全,vsftpd也无法加载该格式的数据,因此还得用db_load命令对该文件数据加密,且设置权限

使得普通用户无权限查阅

#创建加密文件  -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)

#降低文件权限
[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

#删除旧的数据文件
[root@chaogelinux vsftpd]# rm -rf ftp_user.txt

  创建当虚拟用户登录后默认访问的文件夹路径,且和Linux中的一个本地用户做一个映射关系,防止匿名用户登录后,创建文件夹,但是系统没有此用户报错权限问题。

#新建一个用户,指定用户家目录,且禁止登录
useradd -d /var/ftpdir -s /sbin/nologin virtual_chao

#检查此ftpdir的属性
[root@chaogelinux vsftpd]# ls -ld /var/ftpdir/
drwx------ 2 virtual_chao virtual_chao 4096 1月   8 09:46 /var/ftpdir/

#更改文件夹权限
[root@chaogelinux vsftpd]# chmod -Rf 755 /var/ftpdir/

#添加virtual_chao用户至ftpusers禁止用户登录文件,增大系统安全,但是不会影响虚拟用户登录
[root@chaogelinux vsftpd]# echo 'virtual_chao' >> ftpusers

  此时需要创建支持虚拟用户的PAM文件,PAM是一组安全机制的模块,编辑认证文件/etc/pam.d/vsftpd

#注释掉文中所有语句,添加以下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

  最后修改vsftpd配置文件

[root@chaogelinux pam.d]# grep -Ev '^$|^#' /etc/vsftpd/vsftpd.conf
anonymous_enable=NO     #禁止匿名模式
local_enable=YES        #允许本地用户
write_enable=YES    
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd        #指定PAM认证文件
userlist_enable=YES
userlist_deny=YES
tcp_wrappers=YES
guest_enable=YES        #开启虚拟用户
guest_username=virtual_chao        #指定虚拟用户账号
allow_writeable_chroot=YES      #如果用户被限制只能在其家目录,允许用户可以对家目录写入数据

  【针对不同的虚拟用户设置不同的权限】

  用户ftp认证的虚拟账号,ftp_user.txt

    1. chao, 允许上传,新建,修改,查看,删除权限。

    2. pyyu, 只读权限

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

#新建管理虚拟用户权限的文件夹
mkdir /etc/vsftpd/virtual_user_dir

#进入文件夹,创建权限的配置文件
[root@chaogelinux vsftpd]# cd /etc/vsftpd/virtual_user_dir/
[root@chaogelinux virtual_user_dir]# cat chaoge
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

#再创建一个pyyu文件,禁止写入
[root@chaogelinux virtual_user_dir]# pwd
/etc/vsftpd/virtual_user_dir
[root@chaogelinux virtual_user_dir]# ls
chaoge  pyyu
[root@chaogelinux virtual_user_dir]# cat pyyu
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

  最后在vsftpd配置文件中再添加下面这一行。

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

  重启服务,测试。

# 重启服务
systemctl restart vsftpd


###################################
# 测试chaoge用户

yumac: ~ yuchao$ftp 123.206.16.61
Connected to 123.206.16.61.
220 (vsFTPd 3.0.2)
Name (123.206.16.61:yuchao): chaoge    #用匿名用户登录chaoge
331 Please specify the password.
Password:
230 Login successful.
ftp> ls            #此时看到的是匿名用户映射的家目录内容
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jan 08 02:49 haha
226 Directory send OK.
ftp> mkdir 超哥到此一游        #chaoge有权限增加文件
257 "/超哥到此一游" created

#####检查服务器上的FTP目录
[root@chaogelinux ftpdir]# pwd
/var/ftpdir
[root@chaogelinux ftpdir]# ls
haha  超哥到此一游


##############################


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

  

  

  

 

推荐阅读