5.2 Linux FTP 服务

1、概念介绍

FTP(File Transfer Protocol:文件传输协议)作用Internet 上用来传送文件的协议

FTP Server(File Transfer Protocol Server)是在互联网/局域网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。采用C/S架构模式。

a. 常见 FTPS

windows:Serv-U FTP Server,filezilla_server

Linux:VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。

b. 服务端口

21 :用于建立控制连接,并传输指令

20 :用于建立数据连接,并传输文件数据

ftp会话包含了两个通道,控制通道和数据通道。根据ftp服务器在建立数据连接过程中的主、被动关系,ftp数据连接分为主动模式和被动模式。

注意:这里的主动和被动,是相对于的FTP server 端来判断的,如果server 去连接client 开放的端口,说明是主动的,如果client去连接server开放的端口,则是被动的。

c. 主动模式

服务器主动连接客户端传输数据

d. 被动模式

服务器等待客户端的连接传输数据

2、安装配置 vsftpd
a. vsftpd 服务端
# 服务端 安装 vsftpd
yum install -y vsftpd
b. vsftpd 配置文件

/etc/vsftpd/vsftpd.conf

vsftpd 的主配置文件

/etc/vsftpd/ftpusers

黑名单文件,用于指定哪些用户不能访问FTP 服务器。此文件中列出的用户将禁止登陆vsftpd服务器。

/etc/vsftpd/user_list

此文件中包含的用户可能被禁止登录,也可能被允许登录。具体取决于主配置文件vsftpd.conf中的设置。当存在userlist_enable=YES的配置项时,user_list列表文件方可生效;若指定userlist_deny=YES,则仅禁止此列表中的用户登录(黑名单),若指定userlist_deny=NO,则仅允许列表中的用户登录。

/etc/vsftpd/vsftpd_conf_migrate.sh

是vsftpd 操作的一些变量和设置脚本

/var/ftp/

默认情况下匿名用户的根目录

# 启动 vsftpd
systemctl start vsftpd# 设置开机自启动
systemctl enable vsftpd# 查看 vsftpd 状态
systemctl status vsftpd# 查看 vsftpd 端口
netstat -antup vsftpd | grep vsftpd# 查看 vsftpd 进程
ps -ef | grep vsftpd

c. vsftpd 客户端

最简单的ftp客户端工具莫过于ftp命令程序了,通过ftp命令程序可以连接到ftp服务器进行交互式的上传、下载通信。

除此之外还有大量的图形化客户端工具,如cuteftp、flashftp、filezilla等

# 客户端 安装 ftp
yum install -y ftp
d. vsftpd.conf 常用配置
listen_address=ftp服务器的地址  	# 只在一个接口监听服务
listen_port=2121                # 监听端口改为2121
pasv_min_port=24500           	# 指定被动模式的下限端口
pasv_max_port=24600           	# 指定被动模式的上限端口
max_clients=20                	# 限制并发客户端最多20个
max_per_ip=2                 		# 限制每个ip地址的连接数最多2个
3、远程登录 vsftpd

FTP服务器默认情况下允许匿名用户登陆,只允许匿名用户下载文件,不允许上传和删除文件

# 使用ftp命令连接服务器
ftp 192.168.137.253

a. ftp 常用命令

命令

含义

open [ftpservername]

和指定的远程Linux FTP服务器连接

user [username]

pwd

显示远程Linux FTP服务器上的当前路径。

ls

列出远程Linux FTP服务器上当前路径下的目录和文件。

dir

列出远程Linux FTP服务器上当前路径下的目录和文件(同上)。

mkdir [foldname]

在远程Linux FTP服务器上当前路径下建立指定目录。

rmdir [foldname]

删除远程Linux FTP服务器上当前路径下的指定目录。

cd [foldname]

更改远程Linux FTP服务器上的工作目录。

delete [filename]

删除远程Linux FTP服务器上指定的文件。

rename [filename] [newfilename]

重命名远程Linux FTP服务器上指定的文件。

close

从远程Linux FTP服务器断开但保留FTP命令参数提示。

disconnect

从远程Linux FTP服务器断开但保留FTP命令参数提示(同上)。

bye

结束和远程Linux FTP服务器的连接。

quit

结束和远程Linux FTP服务器的连接(同上)。

!

直接从远程Linux FTP服务器进入到本地shell中。

exit

(接上步)从本地shell环境中返回到远程Linux FTP服务器环境下。

!ls

列出本地机器上当前路径下的目录和文件。

lcd [foldname]

更改本地机器的工作目录。

?

显示ftp命令说明。

help

显示ftp命令说明(同上)。

# 在ftp中查看当前目录
ftp>pwd											# 输出-> 257 "/"# 查看当前目录下的文件
ftp>ls

# 下载文件
get test.txt

# 退回Shell查看 下载文件
ls

b. Windows 查看服务器

4、实战:匿名访问VSFTP
a. 需求分析

需求:公司技术部准备搭建一台功能简单的FTP 服务器,允许所有员工上传和下载文件,并允许创建用户自己的目录。

分析:允许所有员工上传和下载文件,需要设置成允许匿名用户登录,并且需要允许匿名用户上传功能。

b. 修改配置文件

# 允许匿名用户访问
anonymous_enable=YES
# 允许匿名用户上传文件
anon_upload_enable=YES
# 允许匿名用户创建目录
anon_mkdir_write_enable=YES
# 允许匿名用户写文件和删除文件
anon_other_write_enable=YES
c. 设置ftp根目录权限
# 给ftp根目录设置权限
chown -R ftp:ftp /var/ftp/pub# 重启 vsftpd 服务
systemctl restart vsftpd
d. Linux 客户端测试
# 登陆ftp服务器
ftp 192.168.137.253# 测试目录创建
ftp>pwd
ftp>mkdir test
ftp>cd pub
ftp>mkdir test

# 退出ftp并创建测试文件
ftp>!
echo "Hello Linux" > test.txt# 回到ftp
exit
ftp>cd pub# 上传测试文件
ftp>put /root/test.txt test.txt

# 更改文件名字
ftp>rename test.txt test_ftp.txt

# 删除文件
ftp>delete test

e. Windows 文件管理器测试

可以在Windows管理器中进行 文件夹的创建、修改、删除以及文件上传

5、实战:用户名密码方式访问VSFTP
a. 需求分析

需求:公司内部现在有一台FTP 和WEB 服务器,FTP 的功能主要用于维护公司的网站内容,包括上传文件、创建目录、更新网页等等。公司现有两个部门负责维护任务,他们分别适用team1 和team2帐号进行管理。先要求仅允许team1 和team2 帐号登录FTP 服务器,并将这两个帐号的根目录限制为/var/www/html,不能进入该目录以外的任何目录。ftp 和web服务器相结合。

  • web服务器根目录:/var/www/html
  • team1账号只能在/var/www/html/team1/ftp上传文件和目录
  • team2账号只能在/var/www/html/team2/ftp上传文件和目录

只允许:team1和team2两用户可以上传。 vsftp禁止匿名。

分析:将FTP 和WEB 服务器做在一起是企业经常采用的方法,这样方便实现对网站的维护,为了增强安全性:

  • 首先需要使用仅允许本地用户访问,并禁止匿名用户登录。
  • 其次使用chroot 功能将team1和team2 锁定在/var/www/html 目录下。
  • 如果需要删除文件则还需要注意本地权限。

Vsftpd可以直接使用linux主机的系统用户作为ftp账号,提供基于用户名/密码的登录验证。用户使用系统用户账号登录ftp服务器后,将默认位于自己的家目录中,且对家目录拥有读写权限。

b. 修改配置文件
# 恢复配置文件
cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/vsftpd.conf# 修改配置文件
vim /etc/vsftpd/vsftpd.conf

# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
# 禁止匿名用户登录
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
# When SELinux is enforcing check for SE bool ftp_home_dir
# 允许本地用户登录
local_enable=YES
# 启用 chroot 锁定本地用户功能
chroot_local_user=YES
# 启用 chroot 锁定本地用户列表功能
chroot_list_enable=YES
# 本地用户列表保存文件目录
chroot_list_file=/etc/vsftpd/chroot_list
# 锁定本地用户ftp根目录,如果不是设置,默认用户ftp根目录为用户家目录
local_root=/var/www/html
# 锁定用户拥有写权限
allow_writeable_chroot=YES
# ftp 用户限制
userlist_enable=YES
userlist_deny=NO
c. 创建网站根目录
mkdir -p /var/www/html/team{1..2}/ftp
tree /var/www/html

d. 创建用户并设置权限
useradd team1
useradd team2
echo "team1:123456" | chpasswd
echo "team2:123456" | chpasswd

权限设定除了在配置文件设定用户写权限,还必须要让用户对自己的目录拥有读写权限

# team1 用户对 team1/ftp 有rwx权限
setfacl -Rm u:team1:rwx /var/www/html/team1/ftp
# team2 用户对 team2/ftp 有rwx权限
setfacl -Rm u:team2:rwx /var/www/html/team2/ftp# team1用户 不可以访问team2目录
setfacl -Rm u:team1:- /var/www/html/team2
# team2用户 不可以访问team1目录
setfacl -Rm u:team2:- /var/www/html/team1
e. 将用户添加到限制文件
# ftp 用户限制
echo -e "team1\nteam2" >> /etc/vsftpd/user_list# 添加chroot_list文件
echo -e "team1\nteam2" > /etc/vsftpd/chroot_list
cat /etc/vsftpd/chroot_list# 重启服务
systemctl restart vsftpd
f. 使用 Filezilla 测试

6、实战:使用虚拟用户
a. 需求分析

在vsftpd服务器中,使用虚拟用户的主要好处在于,可以将ftp登录账户与系统登录账号分开,用户名、密码都不相同,从而进一步增强ftp服务器的安全性。

需求:公司为了宣传最新的产品信息,计划搭建FTP 服务器,为客户提供相关文档的下载:

  • 对所有互联网开放共享目录,允许下载产品信息,禁止上传。
  • 公司的合作单位能够使用FTP 服务器进行上传和下载,但不可以删除数据。需要保证服务器的稳定性并做优化。
  • 创建ftp虚拟帐号,允许客户使用ftp帐号下载文件。
  • 自己的合作伙伴帐号:vip可以上传内部文件

分析:根据企业的需求,对于不同用户进行不同的权限限制,FTP 服务器需要实现用户的审核。需考虑到服务器的安全性,使用虚拟帐号验证机制,并对不同虚拟帐号设置不同的权限。为了保证服务器的性能,还需要根据用户的等级,限制客户端的连接数及下载速度。

b. 创建虚拟用户数据库:db_load

建立用户文本文件,添加两个虚拟帐号:

  • 管理员帐号admin,admin账号有FTP所有权限
  • 合作账号帐号vip,vip只能上传和下载文件
  • 匿名用户只能下载文件
# 一行用户一行密码 
vim /etc/vsftpd/vsftpd_virtualuser.txt 

生成虚拟用户数据库文件:保存虚拟帐号和密码的文本文件无法被系统帐号直接调用。我们需要使用db_load 命令生成db数据库文件。

db_load 命令

  • 描述:将文本文件生成数据库文件
  • 语法:db_load [选项] 文本文件 数据库文件

-T:允许应用程序能够将文本文件转译载入进数据库

-t:hash使用hash码加密

-f:指定包含用户名和密码文本文件。此文件格式:奇数行用户名、偶数行密码

# 查看 db_load 命令的位置,通过rpm查看在个安装包中
rpm -qf `which db_load`
# 安装 db_load 所在的软件包
yum install -y libdb-utils-5.3.21-25.el7.x86_64# 将虚拟用户文本文件 转换为 数据库文件
db_load -T -t hash -f /etc/vsftpd/vsftpd_virtualuser.txt  /etc/vsftpd/vsftpd_virtualuser.db

修改数据库文件访问权限:数据库文件中保存着虚拟帐号的密码信息,为了防止非法用户盗取,我们可以修改该文件的访问权限。生成的认证文件的权限应设置为只对root 用户可读可写。

chmod 600 vsftpd_virtualuser.db

添加虚拟用户的映射账号:Vsftpd服务器对虚拟用户的控制采用了映射的控制方式,将所有的虚拟用户对应到同一个系统用户,该系统用户家目录作为有虚拟用户登录后共用的ftp根目录。因此还需要添加一个对应的系统用户账号(此账号无须设置密码登录shell)

# 因为匿名用户默认家目录为/var/ftp,把virtual用户家目录设为/var/ftp/pub,
# 这样匿名用户和虚拟用户就可以访问相同的ftp根目录
useradd -d /var/ftp/pub -s /sbin/nologin virtual_user# 设置虚拟用户对 /var/ftp/pub 的权限
setfacl -Rm u:virtual_user:rwx /var/ftp/pub
c. vsftpd 服务添加虚拟认证

在vsftpd服务器中,用户认证是通过PAM(pluggable authentication module,可插拔认证模块)机制来实现的, Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,则需要创建新的PAM认证文件。

# 为虚拟用户建立PAM认证文件
vim /etc/pam.d/vsftpd.vuauth	required	/lib64/security/pam_userdb.sodb=/etc/vsftpd/vsftpd_virtualuseraccount	required	/lib64/security/pam_userdb.sodb=/etc/vsftpd/vsftpd_virtualuser
  • 这里的db=/etc/vsftpd/vsftpd_virtualuser,是pam文件的写法规范,不是真正指向db=/etc/vsftpd/vsftpd_virtualuser 这个文件,而是/etc/vsftpd/vsftpd_virtualuser.db 这个文件中(注意:省略了.db扩展名)
d. 修改 vsftpd.conf 文件
cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/vsftpd.conf
vim /etc/vsftpd/vsftpd.conf
# 开启匿名用户访问,默认匿名用户只有下载权限
anonymous_enable=YES
#开启本地用户映射
local_enable=YES
# 启用上传写入支持
write_enable=YES
# 指定上传权限掩码, 666-022=644
anon_umask=022
# 允许来宾访问
guest_enable=YES
# 允许对ftp根目录有写权限
allow_writeable_chroot=YES
# 指定映射的系统用户名称
guest_username=virtual_user
# 指定新的PAM认证文件
pam_service_name=vsftpd.vu
# 指定虚拟用户权限文件目录
user_config_dir=/etc/vsftpd/vusers_dir
# 指定被动模式的下限端口
pasv_min_port=24500
# 指定被动模式的上限端口
pasv_max_port=24600
# 限制并发客户端最多20个
max_clients=20
# 限制每个ip地址的连接数最多2个
max_per_ip=2                

注意事项:

  • 从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误:500 OOPS: vsftpd: refusing to run with writable root inside chroot()。要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限,或者你可以在vsftpd的配置文件中增加下列项:allow_writeable_chroot=YES
  • vsftpd.conf配置文件中默认存在pam_service_name配置项,建议加#号注释掉或直接修改。
  • 在vsftpd服务中,虚拟用户默认作为匿名用户进行处理以降低权限,因此对应的配置项通常以anon_开头。例如,在设置虚拟用户所上文件的默认权限掩码时,应采用的配置项为anon_umask而不是local_umask。
e. 为不同的虚拟用户创建独立的配置文件

在/etc/vsftpd/vusers_dir目录下为不同的用户创建不同的权限文件

mkdir /etc/vsftpd/vusers_dir# 创建admin的配置文件
vim /etc/vsftpd/vusers_dir/admin# 允许用户上传文件anon_upload_enable=YES# 允许用户创建目录anon_mkdir_write_enable=YES# 允许用户删除文件权限anon_other_write_enable=YES# 创建vip的配置文件
vim /etc/vsftpd/vusers_dir/vip# 允许用户上传文件anon_upload_enable=YES# 允许用户创建目录anon_mkdir_write_enable=YES
# 重启 vsftpd 服务
systemctl restart vsftpd
f. 使用Filezilla 测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283001.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】数据库和表的操作

数据库和表的操作 一、数据库的操作1. 创建数据库2. 字符集和校验规则(1)查看系统默认字符集以及校验规则(2)查看数据库支持的字符集(3)查看数据库支持的字符集校验规则(4)校验规则对…

《点云处理》平面拟合

前言 在众多点云处理算法中,其中关于平面拟合的算法十分广泛。本篇内容主要是希望总结归纳各类点云平面拟合算法,并且将代码进行梳理保存。 环境: VS2019 PCL1.11.1 1.RANSAC 使用ransac对平面进行拟合是非常常见的用法,PCL…

音频I2S

前言 基于网上资料对相关概念做整理汇总,部分内容引用自文后文章。 学习目标:简单了解相关概念、相关协议。 1 概述 数字音频接口DAI,即Digital Audio Interfaces,顾名思义,DAI表示在板级或板间传输数字音频信…

【STM32】STM32学习笔记-EXTI外部中断(11)

00. 目录 文章目录 00. 目录01. 中断系统02. 中断执行流程03. STM32中断04. NVIC基本结构05. NVIC优先级分组06. EXTI简介07. EXTI基本结构08. AFIO复用IO口09. EXTI框图10. 计数器模块11. 旋转编码器简介12. 附录 01. 中断系统 中断:在主程序运行过程中&#xff0…

设计模式 五种不同的单例模式 懒汉式 饿汉式 枚举单例 容器化单例(Spring单例源码分析) 线程单例

单例模式 第一种 饿汉式 优点:执行效率高,性能高,没有任何的锁 缺点:某些情况下,可能会造成内存浪费 /*** author LionLi*/ public class HungrySingleton {private static final HungrySingleton hungrySingleton n…

【JavaWeb学习笔记】11 - WEB工程路径专题

一、工程路径问题 1.引入该问题 通过这几个去访问很麻烦 二、工程路径解决方案 1.相对路径 1.说明:使用相对路径来解决,一 个非常重要的规则:页面所有的相对路径,在默认情况下,都会参考当前浏览器地址栏的路径http:/ /ip:port/工程名/来进…

Spring MVC 中的常用注解和用法

目录 一、什么是 Spring MVC 二、MVC定义 三、简述 SpringMVC 起到的作用有哪些? 四、注解 五、请求转发或请求重定向 一、什么是 Spring MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web…

【HTML5、CSS3】新增特性总结!

文章目录 23 HTML5 新增特性23.1 语义化标签23.2 多媒体标签23.2.1 视频<video>标签23.2.2 音频<audio>标签 23.3 input属性值23.4 表单属性 24 CSS3 新增特性24.1 属性选择器24.2 结构伪类选择器24.2.1 选择第n个元素24.2.2 常用的6个结构伪类选择器 24.3 伪元素选…

数据仓库与数据挖掘c5-c7基础知识

chapter5 分类 内容 分类的基本概念 分类 数据对象 元组(x,y) X 属性集合 Y 类标签 任务 基于有标签的数据&#xff0c;学习一个分类模型&#xff0c;通过这个分类模型&#xff0c;可以把一组属性x映射到一个特定的类别y上 类别y 提前设定好的--如&#xff1a;学生…

人工智能与自动驾驶:智能出行时代的未来之路

一、前言 首先&#xff0c;我们先来说下什么是人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机系统能够模拟、仿真人类智能的技术和科学领域。它涉及构建智能代理&#xff0c;使其能够感知环境、理解和…

服务端主动给客户端发消息?实战教学:使用Nestjs实现服务端推送SSE

前言 服务端消息推送SSE是常用的服务器消息通信手段&#xff0c;适用于服务器主动给客户端发送消息的场景&#xff0c;例如私信通知&#xff0c;扫描登录等都可以使用SSE实现。SSE的底层原理是客户端与服务端建立 HTTP 长链接。 Nestjs 框架内置了对SSE的支持&#xff0c;本文…

分布式定时任务系列7:XXL-job源码分之任务触发

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 分布式定时任务系列5&#xff1a;XXL-job中blockingQueue的应用 …