FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议
------来源百度百科
FTP的工作原理
在传输数据之前,客户端会先和FTP服务端的21号端口建立连接并开启一条通道,在这期间,客户端可以通过此通道来发送一些命令到FTP服务器执行一些相关的操作。FTP 20端口用于传输数据,因为FTP存在两种模式,一种是主动模式,一种的被动模式,是否使用 20端口 还取决与使用哪一种模式来进行数据的上传以及下载
主动模式(PORT):FTP服务端主动开放TCP 20端口和客户端建立数据通信通道,建立连接发送的是PORT命令
被动模式(PASV):客户端请求FTP服务端,会发送一个PASV命令,FTP服务端就会打开一个大于1024的端口号与之进行连接,使用该端口和客户端建立一条数据传输通道,然后客户端就会进行数据的上传以及下载了
环境准备
准备工作
提前关闭对应主机的防火墙以及selinux
主机 | IP地址 |
---|---|
FTP服务端 | 192.168.1.10 |
FTP客户端(Linux) | 192.168.1.20 |
Linux中的FTP分为三类登录用户,我们本次实验围绕这三类用户来进行
搭建过程如下
匿名用户
[root@ftp-server ~]# yum install -y vsftpd //下载vsftpd 软件包
[root@ftp-server ~]# systemctl start vsftpd //启动vsftpd服务器
[root@ftp-server ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@ftp-server ~]# setenforce 0
默认只要我们安装好vsftpd服务器并成功启动之后,就可以在客户端进行访问测试
Windows 客户端访问测试
虽然我们可以成功登陆,但是没有任何可以操作的权限,如果要匿名用户具备一些权限,我们需要在配置文件里面写入如下一些内容即可
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf
anon_root=/opt/vsftpd //修改主目录
anon_upload_enable=YES //允许匿名用户上传文件
anon_mkdir_write_enable=YES //允许匿名用户修改文件
anon_other_write_enable=YES //授予匿名用户删除权限
anon_umask=022 //匿名用户创建文件的默认权限
本地用户
在我们使用本地用户登录之前需要确保anonymous_enable=NO这个参数等于NO
当我们使用本地用户来进行登录的时候,会把用户的家目录映射成我们访问的目录,本地用户默认就具有文件上传以及下载的权限
local_enable=YES //开启本地用户登录
write_enable=YES //本地用户具有写的权限
local_umask=022 //默认新建文件的权限
只要我们修改这个anonymous_enable=NO 并开启vsftpd服务,我们就可以登录来进行测试了
[root@ftp-server ~]# useradd uu //创建一个普通用户来验证测试
[root@ftp-server ~]# passwd uu
更改用户 uu 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@ftp-server ~]# cd /home/uu/ //进入家目录
[root@ftp-server uu]# echo "123" >> 1.txt //创建一个文件
客户端登录测试:
[root@s1 ~]# lftp 192.168.1.100 -u uu
口令:
lftp uu@192.168.1.100:~> ls
-rw-r--r-- 1 0 0 4 Nov 08 02:25 1.txt
lftp uu@192.168.1.100:~> cat 1.txt //查看文件里面的内容
123
4 bytes transferred
lftp uu@192.168.1.100:~> mkdir ll //新建一个目录测试
mkdir 成功, 建立 `ll'
lftp uu@192.168.1.100:~> ls
-rw-r--r-- 1 0 0 4 Nov 08 02:25 1.txt
drwxr-xr-x 2 1001 1001 6 Nov 08 02:28 ll
lftp uu@192.168.1.100:~> rm -rf 1.txt //删除1.txt 文件,所有也具有删除权限
rm 成功, 删除 `1.txt'
默认状态下用本地用户登录到Linux服务器的,都可以进行任意目录的切换,这是一种不安全的行为
lftp uu@192.168.1.100:~> cd /
cd 成功, 当前目录=/
我们可以通过修改配置文件,添加一条命令让本地用户登录不能够离开家目录
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf //修改配置文件
105 chroot_local_user=YES //取消注释 (代表不允许本地用户离开家目录)
106 allows_writeable_chroot=YES //添加这个,如果不添加会出现问题
[root@ftp-server ~]# systemctl restart vsftpd //冲vsftpd服务器
客户端验证测试
[root@s1 ~]# lftp 192.168.1.100 -u uu
口令:
lftp uu@192.168.1.100:/> cd / //切换到根目录
lftp uu@192.168.1.100:/> pwd
ftp://uu@192.168.1.100/
lftp uu@192.168.1.100:/> ls //再次查看,还是家目录
drwxr-xr-x 2 1001 1001 6 Nov 08 02:28 ll
本地用户黑名单以及白名单的设置
[root@ftp-server ~]# cd /etc/vsftpd/ //进入该目录
[root@ftp-server vsftpd]# ll
总用量 20
-rw-------. 1 root root 125 4月 1 2020 ftpusers //黑名单,只要在里面的用户都不能够登录到ftp服务器上
-rw-------. 1 root root 361 4月 1 2020 user_list //临时黑名单 可以通过修改配置文件来成为白名单
[root@ftp-server vsftpd]# echo 'uu' >> user_list //向这个文件里面写入我们之前创建的用户名称
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf //修改配置文件 (确保存在以下三行代码)
userlist_enable=YES //开启黑名单白名单认证
userlist_deny=YES //yes代表为黑名单 表示不可以登录到ftp服务器,no代表为白名单,可以登录到服务器
userlist_file=/etc/vsftpd/user_list //文件存放地
[root@ftp-server ~]# systemctl restart vsftpd //重启vsftpd服务器
验证测试(因为uu存在于文件当中,且文件状态为黑名单)
[root@s1 ~]# lftp 192.168.1.100 -u uu
口令:
lftp uu@192.168.1.100:~> ls //登录失败
ls: 登录失败: 530 Permission denied.
把userlist_deny=NO 改为NO 在来登录测试
[root@s1 ~]# lftp 192.168.1.100 -u uu
口令:
lftp uu@192.168.1.100:~> ls //成功登录
drwxr-xr-x 2 1001 1001 6 Nov 08 02:28 ll
虚拟用户
FTP虚拟用户,只能够用于登录到FTP服务器,不能够用于Linux系统的交互式登录,所有的虚拟用户在登录到FTP服务器的时候,都会映射成一个本地用户来进行一些的操作
新建一个用户认证文件 基数行为用户 偶数行为密码
[root@ftp-server ~]# cd /etc/vsftpd/
[root@ftp-server vsftpd]# vim users
admin
123
oo
123
zz
123
然后对这个文件做一个加密设置
使用db_load 以及 pam认证软件 如果没有对应命令,可以使用这个来 yum install –y pam* db4*
[root@ftp-server vsftpd]# db_load -T -t hash -f users users.db
[root@ftp-server vsftpd]# cat users.db //查看这个文件已经成为了加密状态
���N�ޙэh^123admin[root@ftp-server vsftpd]#
[root@ftp-server vsftpd]# rm -rf users //删除原文件
[root@ftp-server vsftpd]# chmod 600 users.db //对生成的文件进行权限设置
然后进行pam认证的配置,当客户端使用虚拟用户登录到ftp服务器上的时候,就会进行这一步,只有pam验证成功,才可以登录到ftp服务器上
[root@ftp-server ~]# cd /etc/pam.d/ //进入该目录
[root@ftp-server pam.d]# vim renzheng //新建一个文件
auth required pam_userdb.so db=/etc/vsftpd/users //写入认证文件的位置
account required pam_userdb.so db=/etc/vsftpd/users
以上操作完成以后,我们修改vsftpd的配置文件添加如下信息
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES //开启虚拟用户登录
guest_username=uu //虚拟用户映射的用户
pam_service_name=renzheng //pam验证文件的名称
如果设置有白名单以及黑名单,一定要确保userlist_deny=NO 这个注释或者等于NO
客户端登录测试
[root@s1 ~]# lftp 192.168.1.100 -u admin
口令:
lftp admin@192.168.1.100:~> ls
drwxr-xr-x 2 0 0 6 Apr 01 2020 pub
虚拟用户的操作权限
[root@ftp-server ~]# mkdir /etc/xuni //创建一个目录
[root@ftp-server ~]# cd /etc/xuni/
注意:这里新建的文件要和虚拟用户一一对应,一个虚拟用户对于一个文件,文件的名称要和虚拟用户的名称一致,否则,创建的权限无效
[root@ftp-server xuni]# vim admin //新建一个文件,写入如下内容
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@ftp-server xuni]# vim /etc/vsftpd/vsftpd.conf //编辑配置文件 写入如下内容
user_config_dir=/etc/xuni/
因为我们映射的用户是ftp,我们还要看看ftp对应的目录权限是否够
[root@ftp-server ~]# cd /var/
[root@ftp-server var]# ll |grep ftp (使用命令 chown修改所属用户为ftp)
drwxr-xr-x. 3 ftp root 17 11月 6 20:53 ftp
客户端登录验证:
[root@s1 ~]# lftp 192.168.1.100 -u admin
口令:
lftp admin@192.168.1.100:/> mkdir admin
mkdir 成功, 建立 `admin'
lftp admin@192.168.1.100:/> ls
drwx------ 2 14 50 6 Nov 08 03:38 admin
drwxr-xr-x 2 0 0 6 Apr 01 2020 pub
drwx------ 2 14 50 6 Nov 08 03:37 uu