《Linux就该这么学》培训笔记_ch11_使用Vsftpd服务传输文件

文章最后会post上书本的笔记照片。

文章主要内容

文件传输协议

文件传输协议(File Transfer Protocol,FTP)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中,具有容易搭建、方便管理的特点。

FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP协议有两种工作模式:

  • 主动模式:FTP服务器主动向客户端发起连接请求。
  • 被动模式:FTP服务器等待客户端发起连接请求(FTP的默认工作模式)。

防火墙一般是用于过滤从外网进入内网的流量,因此有些时候需要将FTP的工作模式设置为主动模式,才可以传输数据。

FTP的服务程序名称为vsftpd。

实例1:安装vsftpd,因为iptables防火墙管理工具默认禁止了FTP传输协议的端口号,清空iptables防火墙的默认策略并永久生效,以避免被这些默认策略影响vsftpd服务的配置。

 yum install -y httpd     #安装vsftpd服务程序
iptables -F #清空iptables防火墙策略
service iptables save #把当前已经被清理的防火墙策略状态保存下来

vsftpd服务程序的主配置文件:/etc/vsftpd/vsftpd.conf。原始内容总长度达到123行,但其中大多数都是注释,可以在grep命令后面添加-v参数,过滤并反选出没有包含井号(#)的参数行(即过滤掉所有的注释信息),然后将过滤后的参数行通过输出重定向符写回原始的主配置文件中,使主配置文件变得简洁清爽。

 cd /etc/vsftpd                               #进入vsftpd主配置文件所在目录
mv vsftpd.conf vfstpd.conf_bak #把vsftpd服务的主配置文件重命名为vsftpd.conf_bak
grep -v "#" vsftpd.conf_bak > vsftpd.conf #在grep命令后面添加-v参数,过滤并反选出没有包含井号(#)的参数行(即过滤掉所有的注释信息),然后将过滤后的参数行通过输出重定向符写回原始的主配置文件中
cat vsftpd.conf #查看删除所有注释信息后的vsftpd主配置文件
anonymous_enable=YES #是否允许匿名用户访问
local_enable=YES #是否允许本地用户登录FTP
write_enable=YES #是否允许用户进行写操作
local_umask=022 #本地用户上传文件的umask值(反掩码),如022,若是文件,则该文件权限为666-022=644,若是目录,则目录权限777-022=755
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 #是否支持用户黑名单
tcp_wrappers=YES

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为不限制

Vsftpd服务程序

vsftpd作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到FTP服务器上:

  • 匿名开放模式:最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。
  • 本地用户模式:通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,但由于采用系统本息账户信息进行认证,存在被黑客破解重要账户信息从而控制服务器的风险。
  • 虚拟用户模式:最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。即使黑客破解了这些账户信息(并非系统本地的账户信息)也不至于造成被控制服务器的风险。

ftp是Linux系统中以命令行界面的方式来管理FTP传输服务的客户端工具。

安装ftp客户端工具:yum install -y ftp

匿名访问模式

这种模式一般用来访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。当然,如果采用防火墙管理工具(如Tcp_wrappers服务程序)将vsftpd服务程序允许访问的主机范围设置为企业内网,也可以提供基本的安全性。

vsftpd服务程序默认开启了匿名开放模式,还需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。针对匿名用户放开这些权限会带来潜在危险,只是为了在Linux系统中练习配置vsftpd服务程序可以放开这些权限,不建议在生产环境中这么做。

可以向匿名用户开放的权限参数以及作用:

参数 作用
anonymous_enable=YES 允许匿名访问模式
anon_umask=022 匿名用户上传文件的umask值
anon_upload_enable=YES 允许匿名用户上传文件
anon_mkdir_write_enable=YES 允许匿名用户创建目录
anon_other_write_enable=YES 允许匿名用户修改目录名称或删除目录

实例2:在实例1基础上,配置vsftpd服务允许用户以匿名开放模式登录到FTP服务器。

#.编辑vsftpd服务的主配置文件,使其开启匿名开放模式,并开放匿名用户的上传下载文件的权限,以及让匿名用户创建删除重命名文件的权限。
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
...
#.重启vsftpd服务并加入开机启动项
systemctl restart vsftpd
systemctl enable vsftpd
#.匿名用户的FTP根目录为/var/ftp,该目录下还有一个pub目录,pub目录默认只有root管理员才有写入权限。需要更改目录所有者为ftp。
ls -ld /var/ftp/pub
chown -Rf ftp /var/ftp/pub #更改pub目录的属主为ftp
ls -ld /var/ftp/pub
#.修改SELinux域策略ftpd_full_access为永久允许,经过这一步用户才能进行增删改文件的操作。
getsebool -a | grep ftp #查看与FTP相关的SELinux域策略
setsebool -P ftpd_full_access=on
#.用客户端执行“ftp 服务端ip地址”登录ftp服务器。登录帐号为anonymous,密码为空。执行文件的增删改操作验证vsftpd服务配置是否成功。
ftp 192.168.10.10 #登录ftp
Name (192.168.10.10:root): anonymous #匿名模式下的账户
Password: #匿名模式下的密码为空,直接Enter
ftp> cd pub #进入目录pub
ftp> mkdir test #创建目录test
ftp> rename test abc #把目录test重命名为abc
ftp> rmdir abc #删除目录abc
ftp> exit #退出ftp

注意:进入ftp后只支持部分平时系统的命令,可用help查。

本地用户模式

本地用户模式通过Linux系统本地的账户密码信息进行认证,相较于匿名开放模式,本地用户模式要更安全。

针对本地用户模式的权限参数以及作用:

参数 作用
anonymous_enable=NO 禁止匿名访问模式
local_enable=YES 允许本地用户模式
write_enable=YES 设置可写权限
local_umask=022 本地用户模式创建文件的umask值
userlist_deny=YES 决定名单文件user_list为白名单还是黑名单,YES为黑名单,NO为白名单,默认为YES
userlist_enable=YES 开启用户作用名单文件功能,名单文件为user_list

userlist_enable参数决定是否启用名单文件user_list,而userlist_deny参数决定名单文件user_list是作为白名单(参数值为NO,允许访问)还是黑名单(参数值为YES,拒绝访问)。

除此之外,还有一个名单文件ftpusers,它不受任何配置项的影响,它永远生效,是一个黑名单!即只要在ftpusers文件中的用户,是无论如何都不允许访问的。

实例3:在实例1基础上,配置vsftpd服务允许用户以本地用户模式登录到FTP服务器。

#.编辑vsftpd服务的主配置文件,使其开启本地用户模式。开启用户名单文件功能(不设置userlist_deny参数则默认把user_list作为黑名单)
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
...
userlist_enable=YES
#.重启vsftpd服务
systemctl restart vsftpd
systemctl enable vsftpd
#.root默认在ftpusers和user_list中(上面配置使得user_list是黑名单),因此不能登录。要修改这两个文件。
vim /etc/vsftpd/user_list
...
#root
...
vim /etc/vsftpd/ftpusers
...
#root
...
#.此时客户端就能以root身份登录ftp服务器了,默认访问的是该用户的家目录,而且该目录的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况。但是当前的操作仍然会因为SELinux域策略的设置而被拒绝。需要在服务端把相关域策略设置为允许。
getsebool -a | grep ftp
setsebool -P ftpd_full_access=on

虚拟用户模式

虚拟用户模式是vsftpd服务中最安全的一种认证模式,配置流程稍微复杂。

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。

通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想。

PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。

PAM的配置文件所在目录:/etc/pam.d/。

实例4:在实例1基础上,配置vsftpd服务允许用户以虚拟用户模式登录到FTP服务器。

#-.创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。
cd /etc/vsftpd/
vim vuser.list
zhangsan lisi #-.这样创建的文件都是明文信息,不安全,也不符合让vsftpd服务程序直接加载的格式,需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件。
db_load -T -t hash -f vuser.list vuser.db #-T加密 -t指定加密协议 -f要加密的文件。对文件vuser.list用hash算法加密为vuser.db
file vuser.db #查看文件类型
chmod vuser.db #降低文件的权限。避免其他人看到数据库文件内容
rm -Rf vuser.list #删掉明文信息文件
#.由于Linux系统中的每一个文件都有所有者、所属组属性,为此需要创建一个可以映射到虚拟用户的系统本地用户,让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限。
useradd -d /var/ftproot -s /sbin/nologin virtual #创建用户virtual,shell解释器为nologin,即不允许登录,默认家目录为/var/ftproot,即虚拟用户登录ftp后的默认目录
ls -ld /var/ftproot/
chmod -Rf /var/ftproot/ #设置权限保证其他用户能对该目录进行相关操作
#.建立用于支持虚拟用户的PAM文件。配置参数格式可以参考/etc/pam.d/vsftpd
vim /etc/pam.d/vsftpd.vu #新建用于虚拟用户认证的PAM文件vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser #“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀
account required pam_userdb.so db=/etc/vsftpd/vuser
#.为虚拟用户设置不同权限。创建一个目录,在目录里生成与虚拟用户同名的权限参数配置文件。在后续配置vsftpd服务主配置文件时通过添加user_config_dir参数来引用。
mkdir /etc/vsftpd/vusers_dir/
cd /etc/vsftpd/vusers_dir/
touch lisi #创建空白文件lisi,即不赋予lisi任何权限
vim zhangsan #创建并编辑文件zhangsan
anon_upload_enable=YES #允许上传文件
anon_mkdir_write_enable=YES #允许创建目录
anon_other_write_enable=YES #允许修改或删除目录
#.编辑vsftpd服务的主配置文件,开启虚拟用户模式。
vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO #禁止匿名开放模式
2 local_enable=YES #允许本地用户模式
3 guest_enable=YES #开启虚拟用户模式
4 guest_username=virtual #指定虚拟用户账户
5 allow_writeable_chroot=YES #允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求(牢笼机制,只能在FTP根目录操作)
...
14 pam_service_name=vsftpd.vu #指定PAM文件
...
17 user_config_dir=/etc/vsftpd/vusers_dir #定义虚拟用户权限配置文件所在路径
#.重启vsftpd服务
systemctl restart vsftpd
systemctl enable vsftpd
#.设置SELinux域允许策略
getsebool -a | grep ftp
setsebool -P ftpd_full_access=on

在客户端登录ftp服务器,测试结果:

  • zhangsan:可以增删改目录
  • lisi:没有增删改权限

TFTP简单文件传输协议

简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议。

TFTP的命令功能不如FTP服务强大,甚至不能遍历目录,在安全性方面也弱于FTP服务。而且,由于TFTP在传输文件时采用的是UDP协议,占用的端口号为69,因此文件的传输过程也不像FTP协议那样可靠。但是,因为TFTP不需要客户端的权限认证,也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率更高。

安装TFTP服务:yum install -y tftp_server。

安装TFTP客户端工具:yum install -y tftp。

在RHEL 7系统中,TFTP服务是使用xinetd服务程序来管理的。xinetd服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能。

TFTP的根目录为/var/lib/tftpboot。 tftp命令中可用的参数以及作用:

命令 作用
? 帮助信息
put 上传文件
get 下载文件
verbose 显示详细的处理信息
status 显示当前的状态信息
binary 使用二进制进行传输
ascii 使用ASCII码进行传输
timeout 设置重传的超时时间
quit 退出

实例5:配置TFTP服务。

#.在xinetd服务程序中将TFTP服务开启,把默认的禁用(disable)参数修改为no。
vim /etc/xinetd.d/tftp #此文件只有安装了tftp服务后才会自动生成
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
disable = no
per_source =
cps =
flags = IPv4
}
#.重启xinetd服务
systemctl restart xinetd
systemctl enable xinetd
#.手动将UDP协议的69端口加入到防火墙的允许策略中。
firewall-cmd --permanent --add-port=/udp
firewall-cmd --reload
#.服务端在TFTP根目录创建一个文件,供服务端测试。
echo "Hello,liwh" > /var/lib/tftpboot/liwh.txt
#.服务端和客户端都需要清空防火墙并永久生效,客户端才能访问服务端的TFTP服务。
iptables -F
service iptables save
#6.客户端访问服务端的TFTP服务,并下载根目录下的liwh.txt文件,文件会下载到客户端在登录到tftp之前的路径
tftp 192.168.10.10
tftp>get liwh.txt

书本笔记

《Linux就该这么学》培训笔记_ch11_使用Vsftpd服务传输文件的更多相关文章

  1. Linux笔记16 使用Vsftpd服务传输文件;使用Samba或NFS实现文件共享。

    FTP协议有下面两种工作模式. 1.主动模式:FTP服务器主动向客户端发起连接请求. 2.被动模式:FTP服务器等待客户端发起连接请求(FTP的默认工作模式).Vsftpd服务程序vsftpd作为更加 ...

  2. Linux基础学习-使用vsftpd服务传输文件

    使用vsftpd服务传输文件 1 安装vsftpd [root@qdlinux ~]# yum install vsftpd Loaded plugins: product-id, search-di ...

  3. linux下使用Vsftpd服务传输文件

    FTP协议占用两个端口号: 21端口:命令控制,用于接收客户端执行的FTP命令. 20端口:数据传输,用于上传,下载文件数据. 过程: 首先安装vsftpd服务程序使用命令 yum install v ...

  4. 《Linux就该这么学》培训笔记_ch09_使用ssh服务管理远程主机

    <Linux就该这么学>培训笔记_ch09_使用ssh服务管理远程主机 文章最后会post上书本的笔记照片. 文章主要内容: 配置网络服务 远程控制服务 不间断会话服务 书本笔记 配置网络 ...

  5. 《Linux就该这么学》培训笔记_ch10_使用Apache服务部署静态网站

    <Linux就该这么学>培训笔记_ch10_使用Apache服务部署静态网站 文章最后会post上书本的笔记照片. 文章主要内容: 网站服务程序 配置服务文件参数 SELinux安全子系统 ...

  6. 《Linux就该这么学》培训笔记_ch17_使用iSCSI服务部署网络存储

    <Linux就该这么学>培训笔记_ch17_使用iSCSI服务部署网络存储 文章最后会post上书本的笔记照片. 文章主要内容: iSCSI技术介绍 创建RAID磁盘阵列 配置iSCSI服 ...

  7. Java 学习笔记 网络编程 使用Socket传输文件 CS模式

    Socket的简单认识 Socket是一种面向连接的通信协议,Socket应用程序是一种C/S(Client端/Server端)结构的应用程序 Socket是两台机器间通信的端点. Socket是连接 ...

  8. LInux 就该这么学 笔记分享

    看了Linux就该这么学的前部分书,觉得写的还可以,就在网上找了下面这个同学写的笔记,觉得很详细,所以保存地址,供以后查阅参看.这里对作者表示感谢!!! 博客地址: https://www.cnblo ...

  9. Linux就该这么学笔记

    https://www.linuxprobe.com/========================================================================= ...

随机推荐

  1. JavaScript变量与数据类型

    变量 javascript的变量很松散,每个变量初始仅仅用于保存一个占位符而已.定义变量的操作符是 var, var 后面跟着一个标识符--当作变量的名字. 比如: var myname;//定义了一 ...

  2. 将本地代码提交到github上

    首先点击new,创建一个github仓库. 设置仓库名称. 这时候你需要创建一个ssh密匙,桌面右键Git Bash Here.敲入命令.cd ~/.ssh/,如果提示"no such&qu ...

  3. C# 随笔写txt

    public static void WriterFile(string file) { string path = AppDomain.CurrentDomain.BaseDirectory; // ...

  4. 关于 部署方面研究 Visual Studio 2013

    InstallShield2013LimitedEdition 下载地址 http://download.csdn.net/download/yuanyuan_186/7681385

  5. 2019 淘友天下java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.淘友天下等公司offer,岗位是Java后端开发,因为发展原因最终选择去了淘友天下,入职一年时间了,也成为了面 ...

  6. PAT 1026程序运行时间

    PAT 1026程序运行时间 要获得一个 C 语言程序的运行时间,常用的方法是调用头文件 time.h,其中提供了 clock() 函数,可以捕捉从程序开始运行到 clock() 被调用时所耗费的时间 ...

  7. DjangoDRF总结

    思维导图xmind文件:https://files-cdn.cnblogs.com/files/benjieming/DRF%E6%A8%A1%E5%9D%97.zip

  8. spark源码解析--Shuffle输出追踪者--MapOutputTracker

    Shuffle输出追踪者--MapOutputTracker 这个组件作为shuffle的一个辅助组件,在整个shuffle模块中具有很重要的作用.我们在前面一系列的分析中,或多或少都会提到这个组件, ...

  9. JavaScript正则表达式进阶指南

    摘要:正则表达式是程序员的必备技能,想不想多学几招呢? 本文用JavaScript的exec方法来测试正则表达式. 例如,正则表达式**/F.*g/会匹配"以F开头,以g结尾的字符串&quo ...

  10. MYSQL GTID 复制

    MySQL5.7以后都基本用GTID方式复制了,相对于binlog和position号方式,在failover时候减少很多人工切换操作 GTID,global transaction identiti ...