FTP文件传输协议
FTP默认使用20、21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP指令与参数
http ftp telnet 我们认为他们不是安全的,因为都是明文传输,所以就有了我们的vsftpd服务。
vsftpd有3种模式,--匿名用户 --本地用户 --虚拟用户
vsftpd服务程序常用的参数以及作用
参数 | 作用 |
listen=[YES|NO] | 是否以独立运行的方式监听服务 |
listen_address=IP地址 | 设置要监听的IP地址 |
listen_port=21 | 设置FTP服务的监听端口 |
download_enable=[YES|NO] | 是否允许下载文件 |
userlist_enable=[YES|NO] userlist_deny=[YES|NO] | 设置用户列表为“允许”还是“禁止”操作 |
max_clients=0 | 最大客户端连接数,0为不限制 |
max_per_ip=0 | 同一IP地址的最大连接数,0为不限制 |
anonymous_enable=[YES|NO] | 是否允许匿名用户访问 |
anon_upload_enable=[YES|NO] | 是否允许匿名用户上传文件 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_root=/var/ftp | 匿名用户的FTP根目录 |
anon_mkdir_write_enable=[YES|NO] | 是否允许匿名用户创建目录 |
anon_other_write_enable=[YES|NO] | 是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限) |
anon_max_rate=0 | 匿名用户的最大传输速率(字节/秒),0为不限制 |
local_enable=[YES|NO] | 是否允许本地用户登录FTP |
local_umask=022 | 本地用户上传文件的umask值 |
local_root=/var/ftp | 本地用户的FTP根目录 |
chroot_local_user=[YES|NO] | 是否将用户权限禁锢在FTP目录,以确保安全 |
local_max_rate=0 | 本地用户最大传输速率(字节/秒),0为不限制 |
我们先yum -y install vsftpd 安装vsftpd包
1.匿名用户 anonymous(匿名公开模式)
然后我们配置一下文件。顺便复习一下几句重要的话。
Linux的一切都是文件
想要部署服务其实就是在修改对应的配置文件
想要让修改的参数立即生效,我们需要重启对应的服务
顺手把服务加入到开机启动项里面
配置文件分为两类,主配置文件和一般配置文件
主配置文件路径: /etc/服务名称/服务名称.conf
# vim /etc/vsftpd/vsftpd.conf 打来配置文件
我们进入vsftpd目录,然后将里面的配置文件修改名称,然后我们cat读取一下里面的内容,那么我们这么做是为什么呢?往下面看
那是因为我们要将在屏幕显示的内容通过管道符和grep 给他单独取出来,这样就好看了,那么上面-v是取反向(反选)的,就是说我们如果不加-v的话那么他会列出来所有前面带#的,我们并不需要他们啊,所以加个-v是取不带#号的,其中报错是说我们#冲突了,我们给他加个""。看下效果
100多行瞬间成了这几行了,是不是很舒服,因为带#号的都是注释,我们看起来太麻烦,所以给他去掉。这里只是显示去掉,并不是真正的去掉啊。所以说我们都在做无用功,并不是,往下看
这下看明白没有,从我们一开始取别名就在为这一步做准备了,我们给他新创建一个vsftpd.conf文件,然后把刚才打印出来的内容重定向写入到文件里面,这不就把那些烦人的注释都去掉了么,好了,开始正题。
我们说一下这13行参数(有一行是空的)
1.anonymous_enable=YES 是否启用我们的公开匿名模式
2.local_enable=YES 是否允许本地用户的方式来进行访问我们的FTP
3.write_enable=YES 是否允许本地用户进行写入操作
4.local_umask=022 是否设置一下文件的反掩码
什么是反掩码说一下,比如
我们创建一个文件和一个目录 ,然后看他们的权限,一个是644 一个是755,那么我们的文件就是
666-umask=644 目录就是:777-umask=755
umask=022 就叫权限反掩码,如果我们想要文件或者目录权限大一点,那么我们反掩码就小一点,反之也是,正好反着,所以反掩码明白了没。
5.dirmessage_enable=YES 是否显示出来一些提示的信息
6.xferlog_enable=YES 是否启用日志
7.connect_from_port_20=YES 是否以20端口号进行我们的文件传输
8.xferlog_std_fromat=YES 是否以标准的格式写入我们的日志
9.listen=NO 是否以独立的形势运行我们的vsftpd.
10.listen_ipv6=YES 是否支持我们的ipv6
11.pam_service_name=vsftpd pam模块的名称
12.userlist_enable=YES 设置用户列表为“允许”还是“禁止”操作。当用户名称出现在文件中,那么这个用户就登录不上去。就是下面的两个文件
13.tcp_wrapper=YES 是否由tcp_wrapper这个防火墙进行控制
然后我们自己再加几条
可以向匿名用户开放的权限参数以及作用
参数 | 作用 |
anonymous_enable=YES | 允许匿名访问模式 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
1.anon_umask=022 设置匿名公开模式反掩码为022
2.anon_upload_enable=YES 是否允许匿名用户上传文件
3.anon_mkdir_write_enable=YES 是否允许匿名用户创建目录
4.anon_other_write_enable=YES 是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限)
改好之后别忘了重启服务
Vsftpd服务程序
然后我们安装ftp工具
然后我们用ftp 192.168.10.10试着登录,匿名登录。匿名用户登录名是anonymous 密码我们直接回车不用管。然后提醒我们登陆成功。
1.虚拟公开模式目录默认访问到 /var/ftp里面
然后我们进入到它里面的pub目录,不然没有权限
并且我们查看pub目录内没有什么文件
然后我们在里面创建一个目录发现报错了,第一时间我们想到权限问题,查看一下。
因为他是属于root用户的,但是我们现在是匿名登录的,所以我们chmod修改权限,记住我们一定要给到pub,而不是外面的目录
我们再试一下
还是报错,那么我们接下来第一时间想到的应该是SELinux了,太讨厌了。
别忘了以前的知识,过滤出所有SELinux的域,这太多了,那么我们过滤出与ftp相关的就行。
其实我们开启ftpd_anon_write这个就可以,但是我们还不过瘾,我们给他开启全部的ftp域。是ftpd_full_access。
别忘了加上-P是为了终身有效的为我们提供服务。
然后我们再试一下,发现创建好了
然后我们重命名一下,发现也成功了。
然后给他删除了。
----------------------------------------------------------------------------------------------------------------------------
本地用户模式
相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单。如果大家之前用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。
1.匿名验证模式 /var/ftp
2.本地验证模式: 自己的家目录
我们编辑我们的配置文件vim /etc/vsftpd/vsftpd.conf
其实我们不用删除那几个也行,刚才已经配置好了,每个参数含义看上面
重启服务
然后我们root登陆一下
我们发现没登录上,权限最大的root用户居然登录不上。
我们进入/etc/vsftpd目录编辑一下ftpusers文件
发现root果然被写入到里面了,我们给他删掉
把user_list文件里面也去掉
然后我们登录root试一下,成功了
然后我们创建目录,改名删除操作都没有问题。
------------------------------------------------------------------------------------------------------------------
虚拟用户模式
1.匿名验证模式 /var/ftp
2.本地验证模式 自己的家目录
3.虚拟验证模式 映射用户的家目录
我们最后讲解的虚拟用户模式是这三种模式中最安全的一种认证模式,当然,因为安全性较之于前面两种模式有了提升,所以配置流程也会稍微复杂一些。
我们再在配置他之前,我们先在csftpd目录里面创建个文件创建用于进行FTP认证的用户数据库文件
这个文件就是我们待会来进行虚拟用户映射成数据库的时候一个最为原始的一个览本
文件里面奇数行为账户名,偶数行为密码
但是,明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,因此需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。
我们对他进行一个加密,其中命令是db_load ,-T 是我们需要进行一个加密,-t是我们需要加密的一个具体类型,我们用的是哈希值(hash)这么 一个协议,-f就是代表我们待会需要加密的文件名称,这里是vuser.list。最后跟的是加密之后的名称,我们这里叫vuser.db。
然后我们可以看到原先文件是一个文本类型的一个格式,加密之后变成了由Hash值加密的,版本为9的一个文件。
因为原文件是明文的,不太安全,所以我们给他删除掉
然后我们将这个文件权限设置为600(wr-------),不被其他人所看到。
创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
由于Linux系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限。
为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为/var目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,我们将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还可以避免黑客通过这个系统本地用户进行登录。
然后我们创建出来一个虚拟用户用来做映射的(虚拟映射到本地)-d是指定用户在系统本地的一个路径。-s是设置一下我们这个用户的终端,让她只能够为我们这个服务工作,而不能登录到我们系统当中。
然后我们给他这个目录一个权限,让其他人也能进行操作,这是最起码的。
PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
我们自己写一个pam模块,
我们在/etc/pam.d目录中创建一个文件vsftp.vu(后缀无所谓)
其中第一行是auth是我们需要验证的意思,required是数据的来源是pam_userdb.so就是待会他能用账号密码进行验证的意思,db=后面是刚才我们加密出来的文件,我们可以不加db(database)后缀.account是说我们待会还要进行账户的一个验证。
在这里我们这个模块叫做vsftpd,系统默认的。但是我们如果用虚拟用户的话就不能用默认的模块了
通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想,其结构如图
然后我们开始编辑配置文件吧vim /etc/vsftpd/vsftp.conf。
我们可以看到,其中pam_service_name=vsftpd.vu后面加的vu和刚才不同,就是我们刚才写的pam模块名称,
guest_enables=YES代表开启我们的额虚拟用户验证模式
guest_username=niubi是虚拟用户映射的一个账户名称,一定要用刚才我们useradd创建出来的账户名称。
allow_writeable_chroot=YES开启牢笼机制。chroot服务 :牢笼机制,让来访者只能访问/var/ftproot目录,就像一个牢笼一样,给他限制在某一个区域。
user_config_dir=/etc/vsftpd/vuser_dir,虽然我们开始创建的张三李四账户都是一起的,但是我更偏向与张三用户,我们希望他们的权限不同,这个路径我们稍后创建。(图中vuser_dir多加了个s)
编辑完配置文件后我们创建刚才的目录,vuser_dir。然后我们进入这个目录创建两个文件,zhangsan,lisi。
然后我们编辑张三文件,让她能够上传,让她能够创建文件夹,让她能够修改删除。这样我们zhangsan就比李四有了多的权限,然后我们重启服务。
然后我们进行增加删除修改等操作。
当我们用lisi登录的时候,发现就不能创建修改文件的权限,因为我们没给他权限。
-------------------------------------------------------------------------------------------------------------
TFTP简单文件传输协议
简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议。顾名思义,它提供不复杂、开销不大的文件传输服务(可将其当作FTP协议的简化版本)。
TFTP的命令功能不如FTP服务强大,甚至不能遍历目录,在安全性方面也弱于FTP服务。而且,由于TFTP在传输文件时采用的是UDP协议,占用的端口号为69,因此文件的传输过程也不像FTP协议那样可靠。但是,因为TFTP不需要客户端的权限认证,也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率更高。
我们先安装tftp软件包和他的服务。
然后我们进入他的配置文件vim /etc/xinetd.d/tftp。这里可不是tftp目录啊,是xinetd.d目录
在RHEL 7系统中,TFTP服务是使用xinetd服务程序来管理的。xinetd服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能。简单来说,在安装TFTP软件包后,还需要在xinetd服务程序中将其开启,把默认的禁用(disable)参数修改为no:
disable 禁用模式,我们给他打开。
tftp命令中可用的参数以及作用
命令 | 作用 |
? | 帮助信息 |
put | 上传文件 |
get | 下载文件 |
verbose | 显示详细的处理信息 |
status | 显示当前的状态信息 |
binary | 使用二进制进行传输 |
ascii | 使用ASCII码进行传输 |
timeout | 设置重传的超时时间 |
quit | 退出 |
然后重启服务
tftp默认所在的目录是 /var/lib/tftproot
然后我们进入这个目录下,创建一个文件,随便写入一些东西退出
大家可以看到开始我们桌面没东西,然后看
我们就下载到桌面了。很简陋。因为他就是简单文件传输。