共计 13513 个字符,预计需要花费 34 分钟才能阅读完成。
一、FTP 介绍
FTP (File transfer protocol) 是 TCP/IP 协议组中的协议之一。他最主要的功能是在服务器与客户端之间进行文件的传输。FTP 就是实现两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。将文件从自己计算机中拷贝至远程计算机上,则称之为“上传(upload)”文件。这个古老的协议使用的是明码传输方式,且过去有相当多的安全危机历史。为了更安全的使用 FTP 协议,我们主要介绍较为安全但功能较少的 vsftpd(very secure File transfer protocol) 这个软件。FTP 是一个 C / S 类型的软件,FTP 监听 TCP 端口号为 21,数据端口为 20。
二、应用场景
下载服务器:提供对外的下载服务
文件服务器:提供上传和下载服务
三、FTP 的权限
FTP 服务器的功能除了单纯的进行文件的传输与管理之外,依据服务器软件的设定架构,它还可以提供几个主要的功能。:
不同等级的用户身份:user, guest, anonymous
FTP 服务器在默认的情况下,依据使用者登录的情况而分为三种不同的身份,分别是:
(1) 本地用户:系统中真实存在的用户
(2) 来宾, guest;
(3) 匿名登录者, anonymous
这三种身份的用户在系统上面的权限差异很大!例如实体用户取得系统的权限比较完整,所以可以进行比较多的动作;至于匿名登录者,大概我们就仅提供他下载资源的能力而已,并不许匿名者使用太多主机的资源!当然,这三种人物因为权限的不同能够使用的【在线命令】自然也就不相同!
四、FTP 的工作模式
FTP 支持两种模式,一种方式叫做 Standard (也就是 PORT 方式,主动方式),一种是 Passive (也就是 PASV,被动方式)。Standard 模式 FTP 的客户端发送 PORT 命令到 FTP 服务器。Passive 模式 FTP 的客户端发送 PASV 命令到 FTP Server。
下面介绍一个这两种方式的工作原理:
Port 模式 FTP 客户端首先和 FTP 服务器的 TCP 21 端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送 PORT 命令。PORT 命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的 TCP 20 端口连接至客户端的指定端口发送数据。FTP server 必须和客户端建立一个新的连接用来传送数据。
Passive 模式在建立控制通道的时候和 Standard 模式类似,但建立连接后发送的不是 Port 命令,而是 Pasv 命令。FTP 服务器收到 Pasv 命令后,随机打开一个高端端口(端口号大于 1024)并且通知客户端在这个端口上传送数据的请求,客户端连接 FTP 服务器此端口,然后 FTP 服务器将通过这个端口进行数据的传送,这个时候 FTP server 不再需要建立一个新的和客户端之间的连接。
很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的 FTP 服务器不支持 PASV 模式,因为客户端无法穿过防火墙打开 FTP 服务器的高端端口;而许多内网的客户端不能用 PORT 模式登陆 FTP 服务器,因为从服务器的 TCP 20 无法和内部网络的客户端建立一个新的连接,造成无法工作。
五、FTP 安装部署
约定:本实验中使用过的机器为 centos8.0_x86_64 系统,IP 地址 192.168.11.16/24. 请关闭防火墙和 SELINUX。
vsftp 安装
[root@localhost ~]# dnf -y install vsftpd ftp
vsftp 开机启动
[root@localhost ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to
/usr/lib/systemd/system/vsftpd.service.
启动 vsftp 服务
[root@localhost ~]# systemctl start vsftpd
验证启动
[root@localhost ~]# lsof -i :21
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vsftpd 1951 root 4u IPv6 32837 0t0 TCP *:ftp (LISTEN)
六、FTP 配置文件
6.1)相关文件
主配文件:/etc/vsftpd/vsftpd.conf
下载目录:/var/ftp/
FTP 日志:/var/log/xferlog
6.2)主配文件详解
# Example config file /etc/vsftpd/vsftpd.conf
#
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
#
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
#
# 匿名用户访问,YES 是允许,NO 是拒绝
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
# 本地用户登录,YES 是允许,NO 是拒绝. 默认访问的是本地用户家目录,如果你开启了 selinux
# 请设置开启布尔值 ftp_home_dir 为 ON
# When SELinux is enforcing check for SE bool ftp_home_dir
local_enable=YES
#
# 允许本地用户上传
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# 上传的权限是 022,使用的是 umask 权限。对应的目录是 755,文件是 644
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
# 开启匿名用户上传功能,默认是拒绝的
#anon_upload_enable=YES
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
# 开启匿名用户创建文件或文件夹权限
#anon_mkdir_write_enable=YES
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
# 开启目录欢迎消息,一般对命令行登陆有效
dirmessage_enable=YES
#
# Activate logging of uploads/downloads.
# 开启上传和下载日志记录功能
xferlog_enable=YES
#
# 使用标准模式
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
# 声明匿名用户上传文件的所有者
# 允许更改匿名用户上传文件的所有者
#chown_uploads=YES
# 所有者为 whoever
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
# 日志文件路径
#xferlog_file=/var/log/xferlog
#
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
# 日志文件采用标准格斯
xferlog_std_format=YES
#
# You may change the default value for timing out an idle session.
# 会话超时时间
#idle_session_timeout=600
#
# You may change the default value for timing out a data connection.
# 数据传输超时时间
#data_connection_timeout=120
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
# FTP 子进程管理用户
#nopriv_user=ftpsecure
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
# 是否允许客户端发起“async ABOR”请求,该操作是不安全的默认禁止。
#async_abor_enable=YES
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode. The vsftpd.conf(5) man page explains
# the behaviour when these options are disabled.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
# 该选项用于指定是否允许上传时以 ASCII 模式传输数据
#ascii_upload_enable=YES
# 该选项用于指定是否允许下载时以 ASCII 模式传输数据
#ascii_download_enable=YES
#
# You may fully customise the login banner string:
# FTP 文本界面登陆欢迎词
#ftpd_banner=Welcome to blah FTP service.
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
# 是否开启拒绝的 Email 功能
#deny_email_enable=YES
# (default follows)
# 指定保存被拒接的 Email 地址的文件
#banned_email_file=/etc/vsftpd/banned_emails
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
# 是否开启对本地用户 chroot 的限制,YES 为默认所有用户都不能切出家目录,NO 代表默认用户都可以切出家目录
# 设置方法类似于:YES 拒绝所有,允许个别 NO 允许所有拒绝个别
#chroot_local_user=YES
# 开启特例列表
#chroot_list_enable=YES
# (default follows)
# 如果 chroot_local_user 的值是 YES 则该文件中的用户是可以切出家目录,如果是 NO,该文件中的用户则不能切出家目录
# 一行一个用户。
#chroot_list_file=/etc/vsftpd/chroot_list
#
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
# 是否开启 ls 递归查询功能 ls -R
#ls_recurse_enable=YES
#
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
# 是否开启 ftp 独立模式在 IPV4
listen=NO
#
# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
# Make sure, that one of the listen options is commented !!
# 是否开启 ftp 独立模式在 ipv6
listen_ipv6=YES
# 启用 pam 模块验证
pam_service_name=vsftpd
# 是否开启 userlist 功能.
# 是否启用用户列表功能
userlist_enable=YES
通过配置文件的分析,VSFTP 不允许匿名访问,本地用户可以下载和上传。如果允许匿名用户登录的话需要将 anonymous_enable=YES,然后重新启动服务
我们可以通过修改配置文件的内容即可配置 FTP 的相关登陆情况。
七、FTP 客户端访问
FTP 是一个 C / S 类型的软件, 连接服务端需要 FTP 客户端才能完成,常见的 FTP 客户端有以下几种:
浏览器:可以通过浏览器中输入 ftp://ip 或者 ftp:// 域名的方式来访问 FTP
自带客户端: 命令行下可以使用 ftp 命令去连接
三方客户端:FileZilla 8uftp 图形软件或者文本界面的 lftp 等
三种方式中,文本界面是比较麻烦的,无法鼠标流。所以我重点给大家讲解一下
7.1)文本界面登陆
文本界面匿名登陆
[root@localhost ~]# ftp 192.168.11.16
Connected to 192.168.11.16 (192.168.11.16).
220 (vsFTPd 3.0.3)
Name (192.168.11.16:root): ftp # 用户名可以是 ftp 也可以是 anonymous
331 Please specify the password.
Password: # 密码为空
230 Login successful. # 显示登陆成功
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,11,16,90,35).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 May 14 2019 pub
226 Directory send OK.
通过 ls 可以列出当前目录下有哪些内容 看到有一个目录叫 pub
ftp> pwd
257 "/"
通过 pwd 命令查看当前路径 注意这里显示的是 FTP 的根目录
ftp> bye
221 Goodbye.
退出使用 bye 命令
文本界面本地用户登录
[root@localhost ~]# ftp 192.168.11.16
Connected to 192.168.11.16 (192.168.11.16).
220 (vsFTPd 3.0.3)
Name (192.168.11.16:root): hello
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,11,16,130,240).
150 Here comes the directory listing.
drwxr-xr-x 2 1001 1001 6 Jan 15 08:56 下载
drwxr-xr-x 2 1001 1001 6 Jan 15 08:56 公共
drwxr-xr-x 2 1001 1001 6 Jan 15 08:56 图片
drwxr-xr-x 2 1001 1001 6 Jan 15 08:56 文档
drwxr-xr-x 2 1001 1001 6 Jan 15 08:56 桌面
drwxr-xr-x 2 1001 1001 6 Jan 15 08:56 模板
drwxr-xr-x 2 1001 1001 6 Jan 15 08:56 视频
drwxr-xr-x 2 1001 1001 6 Jan 15 08:56 音乐
226 Directory send OK.
ftp> pwd
257 "/home/hello" is the current directory
7.2)FTP 客户端常用命令
键入 help 命令可以查看所有可使用的命令
ftp> help
Commands may be abbreviated. Commands are:
! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send
!+linux 命令 执行系统命令
!ls /opt 显示 linux 系统中 /opt 目录下的内容
ftp> !ls /opt
dhcp dns rh
lcd linux 系统中的当前目录
lcd /root 将 linux 系统中的当前目录切换到 /root 下
ftp> lcd /root
Local directory now /root
put 上传命令,mput 批量上传命令
上传 initial-setup-ks.cfg 文件到 hello 家目录下
ftp> put initial-setup-ks.cfg
local: initial-setup-ks.cfg remote: initial-setup-ks.cfg
227 Entering Passive Mode (192,168,11,16,96,132).
150 Ok to send data.
226 Transfer complete.
1803 bytes sent in 0.00135 secs (1333.58 Kbytes/sec)
可以看到上传成功了
验证一下上传结果
ftp> ls
227 Entering Passive Mode (192,168,11,16,173,142).
150 Here comes the directory listing.
-rw-r--r-- 1 1000 1000 1803 Feb 26 07:01 initial-setup-ks.cfg
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 下载
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 公共
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 图片
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 文档
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 桌面
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 模板
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 视频
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 音乐
226 Directory send OK.
看见了吧
切换 linux 当前目录到 /tmp
ftp> lcd /tmp
Local directory now /tmp
get 下载命令,mget 批量下载
下载 initial-setup-ks.cfg 到 linux 系统当前目录 /tmp
ftp> get initial-setup-ks.cfg
local: initial-setup-ks.cfg remote: initial-setup-ks.cfg
227 Entering Passive Mode (192,168,11,16,229,134).
150 Opening BINARY mode data connection for initial-setup-ks.cfg (1803 bytes).
226 Transfer complete.
1803 bytes received in 2.9e-05 secs (62172.41 Kbytes/sec)
列出 linux 目录 /tmp 的内容,看到了下载的文件 initial-setup-ks.cfg
ftp> !ls /tmp/
dhcp tracker-extract-files.0
initial-setup-ks.cfg VMwareDnD
systemd-private-8e7a99ea89c14ab396d66116970fe04d-chronyd.service-sghHHs vmware-root
systemd-private-8e7a99ea89c14ab396d66116970fe04d-colord.service-wK7h08 yum_save_tx.2019-02-20.16-10.Z6uXqR.yumtx
systemd-private-8e7a99ea89c14ab396d66116970fe04d-cups.service-cokBro yum_save_tx.2019-02-21.09-03.08zIbU.yumtx
systemd-private-8e7a99ea89c14ab396d66116970fe04d-rtkit-daemon.service-6wt1S0 yum_save_tx.2019-02-22.11-10.prawAT.yumtx
ftp> close
221 Goodbye.
ftp> ls
Not connected.
可以使用 close 断开连接,当连接断开希望再次连接直接使用 open 命令即可
ftp> open 192.168.11.16
Connected to 192.168.11.16 (192.168.11.16).
220 (vsFTPd 3.0.2)
Name (192.168.11.16:root): hello
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,11,16,192,88).
150 Here comes the directory listing.
-rw-r--r-- 1 1000 1000 1803 Feb 26 07:01 initial-setup-ks.cfg
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 下载
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 公共
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 图片
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 文档
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 桌面
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 模板
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 视频
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 音乐
226 Directory send OK.
delete 命令可以删除属于自己的文件
删除 initial-setup-ks.cfg 文件
ftp> delete initial-setup-ks.cfg
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (192,168,11,16,168,142).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 下载
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 公共
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 图片
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 文档
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 桌面
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 模板
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 视频
drwxr-xr-x 2 1000 1000 6 Jan 11 01:37 音乐
226 Directory send OK.
八、基于虚拟用户配置安全的 ftp
在 ftp 中不论是匿名用户还是实名用户都是系统中真实存在的用户,或多或少都会有一些安全方面的风险,为了避免这个风险,开发者在 ftp 中加入了一个虚拟用户的概念,所有虚拟用户都会被统一映射为一个系统账号,免去了管理过多账户的麻烦,那么这个虚拟用户如何实现呢?
a、修改配置文件
[root@zutuanxue pam.d]# egrep -v "^#" /etc/vsftpd/vsftpd.conf
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
chroot_local_user=YES
listen=NO
listen_ipv6=YES
# 虚拟用户配置选项
#pam 登陆验证
pam_service_name=vftp
# 允许虚拟用户功能
guest_enable=YES
# 虚拟用户映射到本地用户 hello
guest_username=hello
# 这里我通过指令改变了默认设置,允许虚拟用户写
allow_writeable_chroot=YES
# 本地用户的根目录
# 这里是定义虚拟用户主目录,用户和组必须指定为宿主用户 hello
local_root=/home/hello
# 允许虚拟用户和本地用户权限一致
virtual_use_local_privs=YES
# 如果虚拟用户和本地用户权限不同,可以通过以下的指令来设置指令,配置文件和登陆名同步即可。
#user_config_dir=/etc/vsftpd/vconf.d/
b、生成虚拟用户账号密码文件
奇数行数账户,偶数行是密码
[root@zutuanxue ~]# cat /etc/vsftpd/vuser
vuser01
123456
vuser02
123456
使用 db_load 转成 db 格式
[root@zutuanxue ~]# db_load -T -t hash -f /etc/vsftpd/vuser /etc/vsftpd/vuser.db
要求权限是 600
[root@zutuanxue ~]# chmod 600 /etc/vsftpd/vuser.db
c、配置 pam 认证,注意先后顺序
[root@zutuanxue ~]# cat /etc/pam.d/vftp
# 虚拟用户登录
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
# 本地登陆
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
d、重启服务生效
[root@zutuanxue ~]# systemctl restart vsftpd
[root@zutuanxue ~]# cat /etc/vsftpd/chroot_list
vuser01
vuser02
e、验证登陆
[root@zutuanxue ~]# ftp 192.168.11.16
Connected to 192.168.11.16 (192.168.11.16).
220 Welcome to ayitula FTP service.
Name (192.168.11.16:root): vuser01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,11,16,82,91).
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
登陆成功了.