Linux FTP 服务部署与配置
1. 实验介绍
1.1 实验内容
本节实验主要介绍 FTP 是什么,它的作用是什么,FTP 客户端和服务器端是怎么进行通信的,FTP客户端和服务器的搭建,和一些主要的配置。
1.2 实验知识点
- FTP 简介
- FTP 客户端安装
- FTP 服务器端安装
- FTP 服务器端配置
1.3 推荐阅读
2. FTP 简介
2.1 FTP 是什么
FTP 是 File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于 Internet 上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的 FTP 应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在 FTP 的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用 Internet 语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
与大多数 Internet 服务一样,FTP 也是一个客户机/服务器系统。用户通过一个支持 FTP 协议的客户机程序,连接到在远程主机上的 FTP 服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上。客户机程序代表用户接收到这个文件,将其存放在用户目录中。
(此段引用自百度百科)
需要注意的是:FTP 采用的是明码传输的方式,所以数据传输的安全性很低。不过目前我们已经有 sftp-server 这个较为安全的 FTP 了,它是 ssh 提供的,在上面传输的数据是经过加密的。
2.2 FTP 作用
- 促进文件的共享(计算机程序或数据)
- 鼓励间接或者隐式的使用远程计算机
- 向用户屏蔽不同主机中各种文件存储系统(File system)的细节
- 可靠和高效的传输数据
2.3 用户身份
FTP 服务器在预设的情况下,依据使用者登入的情况而分为三种不同的身份
- 实体账号(real user):这类用户通常在 FTP 服务器上拥有账号,它拥有较完整的系统权限,能执行较多操作。当这类用户登录 FTP 服务器的时候,其默认的主目录就是其帐号命名的目录。这个主目录是可以变更的,比如变更到系统主目录。
- 访客(guest):在 FTP 服务器中,我们往往会给不同的部门或者某个特定的用户设置一个帐户。它只能够访问自己主目录下的目录,而不得访问主目录以外的文件。服务器通过这种方式来保障其他文件的安全性。
- 匿名登录者( anonymous) :运行 FTP 服务的许多站点都开放匿名服务,可以匿名访问某些公开的资源,一般允许下载而不允许上传。这类用户在 FTP 服务器中没有指定帐户,不需要密码,虽然通常要求输入用户的邮件地址作为认证密码,但这只是一些细节或者此邮件地址根本不被确定,而是依赖于 FTP 服务器的配置情况。
FTP 可以利用系统的 syslogd 来记录用户曾经下达过的命令,用户传输数据的传输时间,档案大小等。在 /var/log 中有各项登录信息。
2.4 两种模式
FTP 的传输使用的是 TCP 封包协议,FTP 服务器使用了两个联机(命令信道与数据传输信道) 。这两个联机都需要经过三次握手。
FTP 有两种使用模式:主动和被动。
主动模式要求客户端和服务器端同时打开并且监听一个端口以创建连接。在这种情况下,客户端由于安装了防火墙会产生一些问题。所以,创立了被动模式。
被动模式只要求服务器端产生一个监听相应端口的进程,这样就可以绕过客户端安装了防火墙的问题。
1. 主动模式(PORT 模式)
主动模式是 FTP 预设的联机方式,如下是 FTP 服务器的主动式联机示意图:
一个主动模式的 FTP 连接创建遵循以下步骤:
- 建立命令通道的联机:客户端打开一个随机的端口(端口号大于 1024,我们假设为端口 N),同时一个 FTP 进程连接至服务器的 21号命令端口。此时,该 tcp 连接的来源地端口为客户端指定的随机端口 N,目的地端口(远程端口)为服务器上的 21 号端口。联机后,客户端便可以通过这个通道来对 FTP 服务器下达指令, 比如上传,下载,查找文件等。
- 客户端告知服务器两个信息(服务器要采用的联机方式,服务器要连接的端口号):在需要数据的情况下,客户端会通过命令通道告诉服务器使用什么方式来联机,如果是主动式联机,客户端会先随机打开一个端口(我们假设端口号是 N+1),并且告诉服务器客户端正在监听的端口号(N+1),且已准备好从此端口接收数据。这个端口就是我们的数据端口。
- 服务器主动向客户端联机:服务器打开 20 号源端口并且创建和客户端数据端口的连接。此时,来源地的端口为 20,远程数据(目的地)端口为(N+1)。
- 客户端通过本地的数据端口创建一个和服务器 20 号端口的连接,然后向服务器发送一个应答,告诉服务器它已经创建好了一个连接。这个连接就是数据传输信道。
注意:数据传输信道是在有数据传输行为时才会建立,并不是一开始连接到 FTP 服务器就马上建立。
2. 被动模式(PASV 模式)
如果 FTP 客户端与服务器端中间具有防火墙时,FTP 服务器只能得知 NAT 的 IP ,NAT 会被视为客户端,而实际上 NAT 不是客户端,服务器会以 port 20 主动向 NAT 的 port N+1 发送主动联机请求,然而 NAT 并没有启动 port N+1 ,启动了 port N+1 的是客户端,客户端会迟迟等不到连接。如下是 FTP 客户端与服务器端中间具有防火墙时的示意图:
因此,创立了被动模式,被动模式不需要考虑来自 port 20 的联机,如下是 FTP 的被动式联机模式示意图:
一个被动模式的 FTP 连接创建遵循以下步骤:
- 用户与服务器建立命令信道。
- 客户端发出被动式(passive,缩写:PASV)的联机要求。
- 服务器打开数据端口(端口号可能是随机的,也可能是自定义某一范围的端口),然后告诉客户端这个端口号(我们假设是 port PASV),并等待客户端联机。
- 客户端打开一个随机的端口(端口号大于 1024,我们假设是 port M),主动向服务器的 port PASV 联机。这个连接就是数据传输信道。
我们可以发现主动模式和被动模式主要的不同点就在于:
- 主动模式:数据信道的联机方向是服务器端向客户端联机。
- 被动模式:数据信道的联机方向是客户端向服务器端联机。
2.5 FTP 的服务器软件 图形界面
- Bullet Proof FTP Server
- CesarFTP
- Cerberus FTP Server
- Gene6 FTP Server
- GuildFTPd
- RaidenFTPD
- Serv-U FTP Server
- War FTP Daemon
文字界面
我们后面主要介绍较为安全易用的 vsftpd 。
3. FTP 客户端安装
$ sudo yum install -y ftp
4. FTP 服务器端安装
4.1 vsftpd 简介
vsftpd(Very Secure FTP Daemon)是一款在 Linux 发行版中最主流的 FTP 服务器程序,特点是小巧轻快,安全易用。它支持很多其他的 FTP 服务器不支持的特征。比如:
- 非常高的安全性需求
- 带宽限制
- 良好的可伸缩性
- 创建虚拟用户的可能性
- IPv6支持
- 中等偏上的性能
- 分配虚拟 IP 的可能性
- 高速
为什么它安全?
(1)vsftpd 这个服务的启动者身份为一般用户,对于 Linux 系统的权限较低。
(2)有一支特殊的上层程序控制具有较高执行权限的 vsftpd 指令,这个权限被限制的特别低。
(3) vsftpd 是在 chroot(change root directory)模式下工作的,chroot 模式就是为程序(这里是 vsftpd )单独指定一个新的目录,它也就不能访问那个目录之外的程序和文件了。避免了被恶意攻击,带来损失。
例如:你用匿名身份登入 ftp 服务的话,通常你看到的根目录其实就只是 /var/ftp,而一些系统其他目录(/etc,/home,/usr 等)就看不到。
4.2 安装
$ sudo yum install -y vsftpd
FTP 服务器对用户的管理,在默认的情况下是根据 /etc/passwd 及 /etc/group 来进行的,一般情况下是不能把这两个删除的。ftp 用户是默认的匿名用户 。
/var/ftp 是 ftp 用户的家目录,可以自己来定义。
/sbin/nologin 表示不能登录系统,系统虚拟帐号(也被称为伪用户)一般都是这么设置。比如我们把 ftp 用户的 /sbin/nologin 改为 /bin/bash ,这样 ftp 用户通过本地或者远程工具 ssh 或 telnet 以真实用户身份登录到系统。这样做对系统来说是不安全的,如果一个用户没有太大的必要登录到系统,就可以只给他 FTP 的权限,不要把他的 SHELL 设置成 /bin/bash 等。
4.3 启动
编辑配置文件 /etc/vsftpd/vsftpd.conf ,修改其中的 listen 配置项目为 YES:
listen=YES
注释 listen_ipv6=YES
# listen_ipv6=YES
启动 vsftpd :
$ sudo vsftpd &
或者
$ sudo /bin/systemctl start vsftpd
systemctl :用于操作服务,后面跟操作,sudo systemctl start rsyslog 类似与 ubuntu 中的 sudo service start rsyslog。常用的有:
- start:启动
- stop :停止
- restart:重启服务
- status:查看服务状态
如果不注释 listen_ipv6=YES 这个时候会报一个错误:
500 OOPS: run two copies of vsftpd for IPv4 and IPv6
vsftpd 本身支持 IPv6 网络的,我们可以看到在 /etc/vsftpd/vsftpd.conf 中有一个 listen_ipv6=YES 。它是可以同时支持 IPv4 和 IPv6 的,出现这个错误的原因,是因为我们把它们配置到了同一个配置文件中,引起了冲突。
解决方案:
$ sudo cp /etc/vsftpd/vsftpd.conf vsftpd_ipv6.conf
把 vsftpd.conf 中的 listen_ipv6=YES 注释掉,把 vsftpd_ipv6.conf 中的 listen=YES 注释掉。
然后我们再次启动 vsftpd ,就可以看到没有报错了。
$ sudo systemctl restart vsftpd
# 如果使用了 vsftpd_ipv6.conf 使用以下命令,然后重启服务
$ sudo systemctl start vsftpd.target
我们可以使用如下命令查看到 vsftpd 的进程:
$ ps -ef|grep 'vsftp'
或者
$ sudo netstat -tulnp|grep 21
4.4 检测
我们可以使用如下命令对 vsftpd 进行检测:
$ ftp localhost
然后会让我们输入用户名,我们这里设为 anonymous ,就是匿名用户。提示输入密码,我们可以不用输入,直接按 enter 键即可。操作截图如下:
前面的数字是状态,220 代表新连接的用户的服务已就绪。331 代表用户存在,需要输入密码。230 代表用户已登入,如果不需要可以登出。227 代表进入被动模式。150 代表文件状态正确,正在打开数据连接。226 代表正在关闭数据连接,请求文件动作成功结束。221 代表控制连接关闭。更多数字参见 https://wenku.baidu.com/view/de621320482fb4daa58d4b3e.html?re=view
vsftpd 安装配置操作视频:
5. FTP 服务器配置
5.1 环境
系统:Centos 7(可以用命令 lsb_release -a 查看)
系统位数:64位(可以用命令 uname -m 查看)
vsftpd 版本:3.0.2
5.2 目录结构
目录 | 说明 |
---|---|
/etc/vsftpd/vsftpd.conf | 主配置文件 |
/usr/sbin/vsftpd | Vsftpd的主程序 |
/etc/rc.d/init.d/vsftpd | 启动脚本 |
/etc/pam.d/vsftpd | PAM认证文件 |
/etc/vsftpd.ftpusers | 禁止使用Vsftpd的用户列表文件 |
/etc/vsftpd.user_list | 禁止或允许使用Vsftpd的用户列表文件 |
/var/ftp | 匿名用户主目录 |
/var/ftp/pub | 匿名用户的下载目录 |
/var/log/vsftpd.log | vsftpd 的日志文件 |
主配置文件 vsftpd.conf 中有很多配置项,可以参考 vsftpd 官方的说明:
http://manpages.ubuntu.com/manpages/trusty/man5/vsftpd.conf.5.html
PAM :(Pluggable Authentication Modules )是由 Sun 提出的一种认证机制。它将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。更多参见 https://baike.baidu.com/item/PAM/3747946?fr=aladdin
5.3 匿名用户登录
例如学校要分享一些资源给学生的话,就可以使用这种方式。每个人都可以去访问匿名用户可以读取的目录。所以最好是有一些限制:
- 限制文件传输的速度
- 只允许下载,不允许上传。
- 限制同时上线的人数
- 限制同一 IP 来源最大的联机数量
- 限制数据连接响应时间
因为我们的服务器和客户端都是搭建在本机上的。所以要尤其注意区分哪些目录是服务器端上的,哪些目录是客户端上的。
备份主配置文件 我们先备份一下主配置文件。
$ cd /etc/vsftpd
$ sudo cp vsftpd.conf vsftpd.conf.bak
然后清空 vsftpd.conf 中的内容。
允许匿名用户登入 系统默认的是允许匿名用户的:
在 /etc/vsftpd/vsftpd.conf 文件 12 行:
anonymous_enable=YES
表示支持匿名用户登入。
默认的匿名用户的根目录在 /var/ftp 。匿名用户被限制在这个目录下工作。提供给匿名用户下载的内容就放到这个目录里。
可以使用 anonymous 这个匿名账号登入。
不检验密码 我们可以设置成用匿名用户连接时不用检验密码
no_anon_password=YES
添加欢迎提示 我们可以添加一些连接时的提示
banner_file=/etc/vsftpd/anon_welcome.txt
然后我们在 /etc/vsftpd/ 目录下新建一个 anon_welcome.txt 文件,输入如下内容:
you are anonymous
allowed get
welcome!
然后退出保存。注意:如果我们上面配置了 banner_file=/etc/vsftpd/anon_welcome.txt 的话,这个文件就一定要有,不然会连不上。
允许下载,不允许上传 匿名用户默认的就是只允许下载,不允许上传
anon_world_readable_only=YES
# 当设置为YES,匿名用户只具有下载文件的功能,也就是具有可读的权限。它将会识别ftp用户自己文件。
write_enable=NO
# 是否允许 ftp 命令改变文件系统。默认不允许。
anon_upload_enable=NO
# 如果设置 YES,匿名用户在特定环境下允许上传文件。为了让它生效,选项 write_enable 必须激活( write_enable 是前提),匿名 ftp 用户必须要求上传位置的写的权限。这个设置也要求虚拟用户具有上传功能,在默认情况,虚拟用户被当做匿名用户对待(最大限制)权限。
anon_mkdir_write_enable=NO
# 如果设置 YES。在特定的条件下匿名用户可以被允许创建一个新的目录。为了这个选项有效,选项 write_enable 必须激活(也就是 write_enable 是前提)。匿名 ftp 用户必须有父目录具有写的权限。
anon_other_write_enable=NO
# 如果设置为 YES,匿名用户将会被允许写的操作除了上传和创建目录,例如删除和重命名,考虑完整性,这个一般不推荐使用。
ascii_download_enable=YES
# 当设置为 YES,支持 ascii 模式的下载。
ascii 模式传输文本字符文件,对于换行符自动转化为目的操作系统需要的格式。
限制文件传输速度限制 限制为最大 1M/秒
anon_max_rate=1000000
# 匿名客户端允许的最大数据传输速率,单位:字节/秒
限制同时上线人数限制为最多 限制最多为 100 人
max_clients=100
限制同一 IP 来源最大联机数量 限制最多 3 个
max_per_ip=3
限制数据连接响应时间 数据连接响应时间超过 30 秒就断线
data_connection_timeout=30
匿名用户超过 5 分钟没有响应,就强制断线
idle_session_timeout=300
正是由于这一个时间限制,所以我们在下面的实验中,如果连接上 ftp 后,超过 5 分钟没有执行任何操作的话,它会自动断开,我们重新连接一下就行了。
/etc/vsftpd/vsftpd.conf
根据前面的介绍,我们设置了下面一系列的配置选项,大家也可以根据自己的实际需求进行相应的配置项目的设置:
listen=YES
anonymous_enable=YES
no_anon_password=YES
ascii_download_enable=YES
download_enable=YES
anon_max_rate=1000000
max_clients=100
max_per_ip=3
idle_session_timeout=300
data_connection_timeout=30
banner_file=/etc/vsftpd/anon_welcome.txt
注意要重启服务,使用 sudo systemctl restart vsftpd
测试
使用匿名用户登录 首先重启以下 vsftpd 服务
$ sudo systemctl restart vsftpd
然后连接 ftp 服务器,因为我们是本机操作,所以这里使用 localhost ,如果我们的 vsftpd 是安装在其他服务器上的话,这里就是那台服务器的 ip。
$ ftp localhost
然后输入用户名 anonymous,就会连接成功了。连接成功后可以查看匿名用户根目录文件,前面的 ftp> 不用输入,只是为了表示后面的命令是在 ftp 客户端命令行输入的。
ftp> ls
#查看匿名用户根目录文件
ftp> help
#ftp 命令帮助,可以看到所有的 ftp 命令
上面有一个提示:
ftp:connect to address ::1: connection refused 的提示信息
这是因为 /etc/hosts 文件中启用了 ipv6,我们注释掉 ::1 开头的那行再连接就没有这个提示了。
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
下载
我们打开一个新标签(终端顶上点击文件->打开标签),先在 /var/ftp 目录下新建一个 test.txt 的测试文件和一个 download 的文件夹
$ sudo touch /var/ftp/test.txt
$ sudo mkdir /var/ftp/download
- 使用 get 命令进行文件下载:
ftp> get test.txt
报错
local:test.txt remote:test.txt local:test.txt:permission denied 这两个错都是因为我们我们运行 ftp localhost 的目录在 /etc/vsftpd 这个目录下的原因,ftp 下载的时候会默认下载到我们执行命令的那个目录(这里是 /etc/vsftpd),而我们的匿名用户在 /etc/vsftpd 这个目录新建文件等操作都需要权限。
解决方案
我们只要切换到一个不要权限的目录就可以了。比如说我们的 /home/shiyanlou 目录。
然后我们去查看 /home/shiyanlou 下的文件
$ ls /home/shiyanlou
可以看到有我们下载下来的 test.txt 了。
提示:可以像我的截图一样,打开几个标签,每个标签里打开比较常用的目录,这样方便我们来回操作。
- 多文件下载 mget ,注意不包含目录
ftp> mget *
下载每个文件它都提问是否要下载,如果文件很多的话,就很麻烦。这个时候我们可以在下载前先执行,这样就不是每次都提问了。
ftp> prompt off
- 下载目录
get 和 mget 不支持下载目录,我们可以先使用 tar 命令打包,然后再下载压缩包。
$ cd /var/ftp
$ sudo tar czvf download.tar.gz download
输入 ftp 命令
ftp> get download.tar.gz
这个时候再去看我们的 /home/shiyanlou 目录下就有 download.tar.gz 这个文件了。
我们再解压出来就有这个 download 目录了
$ tar xvf download.tar.gz
由于 ftp 命令不支持下载目录,为了能够下载目录,我们可以使用 wget 命令去连接 ftp 服务器,大家可以自己查看下 wget 命令的参数看如何支持这个功能。
ftp 匿名用户配置操作视频:
5.4 虚拟用户登入
虚拟用户也可以称为 guest 用户。该类用户可以通过输入账号以及口令来进行授权登录。登录入系统后,其登录目录为指定的目录。一般情况下,该类用户既可以下载也可以上传文件。
我们现在有这样一个情景,需要两个虚拟用户,一个可以上传下载新建文件夹等,一个可以下载不能上传。
备份主配置文件
我们将上面实验中的主配置文件改名,并新建一个主配置文件:
$ sudo mv vsftpd.conf vsftpd.conf.ano
$ sudo touch vsftpd.conf
新建访客用户
vsftpd 须要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是访客用户,就像匿名用户也需要有一个系统用户 ftp 一样。你可以认为我们下面新建的这个用户是用来映射虚拟用户的。(也可以不用创建这个用户,不创建的话就默认是 ftp 用户 ,我们为了便于把它和匿名用户区分开来,所以这里新建了一个访客用户)
$ sudo useradd -d /home/ftp_vuser -s /sbin/nologin ftp_vuser
$ sudo chmod o+x /home/ftp_vuser
如果要设置使用的 shell,必须让 Shell 在 /etc/shells 中能够找到。
生成虚拟用户口令
$ cd /etc/vsftpd
$ sudo vi vuser.txt
虚拟用户是采用单独的用户名/口令保存方式,在里面输入用户名和口令,我们这里添加两个访客用户,一个用户名为 lou,密码为 loupass,另一个用户名为 linux,密码为 linuxpass:
lou
loupass
linux
linuxpass
生成认证文件
用户名/口令用数据库文件保存或者存储在数据库服务器中。使用 db_load 命令生成口令库文件,为了防止非法用户盗取,生成的认证文件的权限应设置为只对 root 用户可读可写。
$ sudo db_load -T -t hash -f vuser.txt /etc/vsftpd/vuser.db
# 修改权限
$ sudo chmod 600 /etc/vsftpd/vuser.db
添加认证
我们先拷贝一份 /etc/pam.d/vsftpd 文件,再编辑内容:
$ cd /etc/pam.d
$ sudo cp vsftpd vsftpd.virtual
然后我们在配置文件 /etc/pam.d/vsftpd.virtual 中删除其他行,再加入如下两行:
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
/etc/pam.d/vsftpd:vsftpd 使用 PAM 模块时的相关配置文件。主要用来作为身份认证或用户身份抵挡。我们可以来查看一下:
file 后面的文件包含的是无法使用 vsftpd 的用户。
配置主配置文件
主配置文件是对所有用户都有作用的。我们可以把两个虚拟用户共有的配置写在住配置文件中。
$ cd /etc/vsftpd
$ sudo vim vsftpd.conf
输入如下内容:
listen=YES
anonymous_enable=NO
# 为了安全,我们还是设置为不允许匿名用户登录
guest_enable=YES
# 当设置为YES,所有访客用户(区别与本地用户)统称为"guest"登录
guest_username=ftp_vuser
# 默认是 ftp ,我们这里设置的是上面我们新建的那个系统用户
allow_writeable_chroot=YES
# 允许用户的主目录为可写的
local_enable=YES
# 允许本地用户登录
write_enable=YES
# 支持 FTP 命令更改文件系统
anon_world_readable_only=NO
# 当设置为YES,匿名用户只具有下载文件的功能,也就是具有可读的权限。我们这里设置的 NO 意为不只是具有下载文件的功能
user_config_dir=/etc/vsftpd/user_conf
# 设置用户配置文件目录
pam_service_name=vsftpd.virtual
# 指定 pam 认证文件,默认是 vsftpd
新建用户配置文件
我们在主配置文件中有配置一个路径,在这个路径下我们可以新建几个配置文件,分别对应不同虚拟用户,这样就可以对不同的虚拟用户配置不同的功能或者限制。
$ cd /etc/vsftpd
$ sudo mkdir /etc/vsftpd/user_conf
$ cd /etc/vsftpd/user_conf
$ sudo touch linux lou
这里新建的配置文件的文件名是对应我们在上面生成的那两个虚拟用户,用户名为 lou 和 linux 。
配置 linux 用户可以上传和下载
$ sudo vi /etc/vsftpd/user_conf/linux
输入如下内容:
anon_mkdir_write_enable=YES
# 支持创建文件夹
anon_other_write_enable=YES
# 允许除了上传和创建目录的写操作,比如删除或重命名
anon_upload_enable=YES
# 允许上传
anon_world_readable_only=NO
# 当设置为YES,匿名用户只具有下载文件的功能,也就是具有可读的权限。它将会识别ftp用户自己文件。特别是存在上传功能。
因为默认的就是可以下载不能上传,所以我们不用添加内容到 /etc/vsftpd/user_conf/lou 文件中了。
注意要重启服务,使用 sudo systemctl restart vsftpd
测试
我们先来测试名叫 linux 的这个用户:
$ cd
$ ftp localhost
使用用户名 linux 和密码 linuxpass 登录。
ftp> ls
ftp> put download.tar.gz
ftp> ls
上传成功:
退出上面的 ftp ,然后来测试名叫 lou 的用户:
我们先在 /home/ftp_vuser 下新建一个测试文件 test_load.txt
$ sudo touch /home/ftp_vuser/test_load.txt
然后使用 ftp 客户端登录:
$ cd
$ ftp localhost
输入用户名 lou ,密码 loupass,然后执行如下 ftp 命令
ftp> ls
ftp> get test_load.txt
ftp> put test2.txt
get 过后我们在 /home/shiyanlou 目录下可以看到出现一个 test_load.txt 文件。
put 会报错 permission denied ,因为我们默认是不能上传的。
一些可能出现的错误
- 连接时报错 530 this ftp server is anonymous only
vsftp 服务器安装后默认不允许本地用户登录,出现该错误。是没有 local_enable=yes
- 连接时报错 500 oops and 421 service
500 oops:vsftpd :refusing to run with writable root inside chroot()
421 service not available,remote server has closed connection
默认情况下出于安全的考虑,vsftpd 是不允许根目录可写的,但是我们可以通过 allow_writeable_chroot=YES 来使其可写。
- 执行 ftp 的 ls 命令报错
226 transfer done(but fail to open directory)
因为虚拟帐号没有 ftp_vuser 的所有权限,其实只有匿名用户的权限。需要给家目录(/home/ftp_vuser)添加权限:
$ sudo chmod o+r /home/ftp_vuser
FTP 虚拟用户配置操作视频:
5.5 实体用户登录
系统默认并没有对实体用户进行限制,所以它可以对整个文件系统进行任何它所具有权限的操作。这样是很危险的,如果一旦被入侵,很多系统数据都会被泄露。所以使用实体用户时,我们一般:
- 使用 sftp 替代
- 利用配置限制用户能力
vsftpd 默认是开放实体用户的:
- local_enable :是否允许本地登录,默认允许。
- write_enable :是否允许 ftp 命令更改文件系统,默认允许。
- local_umask :本地用户创建文件的默认权限。(umask 我们在第一周的权限管理有讲过的,它与 chmod 相反。这里默认的是 022,也就是本地用户创建的目录的默认权限为 755,创建的文件的默认权限为 644 。
新建实体用户
$ sudo adduser real_user
$ sudo passwd real_user
# 会提示输入密码,我们把密码设为 syl
新建主配置文件
$ cd /etc/vsftpd
$ sudo mv vsftpd.conf vsftpd.conf.virtual
$ sudo vi vsftpd.conf
编辑主配置文件内容为如下:
listen=YES
local_enable=YES
write_enable=YES
allow_writeable_chroot=YES
pam_service_name=vsftpd
#这里我们设为了 vsftpd,也就是我们最开始的那个认证文件
测试
重启服务
$ sudo systemctl restart vsftpd
使用 ftp 登录:
$ cd
$ ftp localhost
输入用户名为 real_user,密码为 syl。然后执行如下命令
ftp> ls
ftp> !ls
# 感叹号是转到 shell 中,这里意思是转到 shell 中执行 ls 命令,列出的是 /home/shiyanlou 下的内容
ftp> put download.tar.gz
ftp> ls
实体用户登入,默认的是能够上传,下载,新建文件等操作的。这里可以看到是能够上传的。
使用 cd 切换目录,执行如下命令:
ftp> cd /
ftp> ls
可以看到能够切换目录。
设置目录限制
上面可以看到实体用户登入时,可以访问很多系统文件,我们可以对目录进行限制,限制它只能访问自己的家目录,也就是 /home/real_user 这个目录。只需要在 /etc/vsftpd/vsftpd.conf 中增加一条配置即可:
chroot_local_user=YES
# 如果设置为YES,在登录之后,本地用户(默认)会被限制到其根目录下。
注意每次修改了配置要记得重启服务。
用实体用户登入,然后执行 ftp 命令如下:
ftp> cd /
可以看到,我们这里执行的 cd / 实际上是进入的实体用户的家目录,也就是 /home/real_user ,而不是像之前那样进入的是系统的根目录。
我们还可以排除某些用户不受这个目录限制:
在主配置文件 vsftpd.conf 中添加:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
如果 chroot_local_user 设置了 YES,那么 chroot_list_file 设置的文件里,是可以访问家目录以上的目录。
如果 chroot_local_user 设置了 NO,那么 chroot_list_file 设置的文件里,是无法访问家目录以上的目录。
这个 chroot_list 文件默认是不存在的,我们需要自己创建:
$ sudo touch /etc/vsftpd/chroot_list
然后把你想要不受限制的用户添加到这个文件中。
当你用这个文件中的用户登入 ftp 服务器过后,会发现 cd / 进入了系统根目录 ,说明是可以访问家目录向上的目录的。
限制实体用户能否登入
有两个配置文件是可以设置实体用户能否登入的:
- /etc/vsftpd/ftpusers :这个文件的路径在 /etc/pam.d/vsftpd 文件里有设置,我们在上面提到过。
- /etc/vsftpd/user_list :这个在 /etc/vsftpd/vsftpd.conf 中配置。
我们想要 real_user 这个用户不能登录我们的服务器,先来使用第一种方式:
修改 ftpusers 文件,在最后一行加入 real_user,然后重启服务 。
然后再用 real_user 登入 ftp 服务器,可以发现报了一个 530 login incorrect 的错,我们登录不上了。
接下来我们使用第二种方式:
先把我们上面配置的 real_user 那行删掉。然后在主配置文件 /etc/vsftpd/vsftpd.conf 中添加如下内容:
userlist_enable=YES
# 用户访问控制列表有效
userlist_deny=YES
# 为 YES 时,/etc/vsftpd/user_list 中的用户不能登录。反之,为 NO 时,里面的用户可以登录。这个生效的前提是 userlist_enable=YES
这个时候完整的主配置文件内容为:
listen=YES
local_enable=YES
write_enable=YES
allow_writeable_chroot=YES
chroot_local_user=YES
user_config_dir=/etc/vsftpd/user_conf
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=YES
然后编辑 /etc/vsftpd/user_list 文件,最后一行添加 real_list ,然后重启服务。
可以发现使用 real_user 用户登录同样是无法登入。
这两个配置文件的区别就在于:ftpusers 的级别更高些,比如我们在 ftpusers 中配了 real_user,然后配置主配置文件和 user_list 把 real_user 设为了允许登录,但是我们还是会登不上。
5.6 日志记录文件
日志文件能帮助我们排错。
vsftpd.conf 有两个日志文件
- /var/log/xferlog
在主配置文件中配置:
xferlog_enable=YES
xferlog_file=/var/log/xferlog
使用者上传与下载文件都会被记录下来。
- /var/log/vsftpd.log
记录服务器的传输情况。
注:默认 /var/log 下是没有 vsftpd.log 的,我们需要在主配置文件 /etc/vsftpd/vsftpd.conf 中加入:
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
并且我们要启动日志服务:
$ sudo systemctl start rsyslog
另外还有几个经常用到的日志文件:
- /var/log/messages 进程日志文件,记录的内核消息、各种服务的公共消息,报错信息等。简单地说就是你在什么时间做了什么事,成功还是失败,失败的原因是什么。
- /var/log/secure 安全信息和系统登录与网络连接的信息
6. 总结
本节实验中我们学习了以下内容,任何不清楚的地方欢迎与我们交流:
- FTP 简介
- FTP 是什么
- FTP 作用
- 用户身份
- 两种模式
- 主动模式
- 被动模式
- FTP 服务器软件
- FTP 客户端安装
- FTP 服务器端安装
- FTP 服务器端配置
- 匿名用户配置
- 虚拟用户配置
- 实体用户配置
- 日志记录文件