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.mzph.cn/news/224446.shtml

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

相关文章

Sqoop安装与配置-shell脚本一键安装配置

文章目录 前言一、使用shell脚本一键安装1. 复制脚本2. 增加执行权限3. 执行脚本4. 加载用户环境变量5. 查看是否安装成功 总结 前言 本文介绍了如何使用Shell脚本一键安装Sqoop。Sqoop是一个用于在Apache Hadoop和结构化数据存储(如关系数据库)之间传输…

优先考虑泛型

Java中的泛型(Generics)提供了一种参数化类型的机制,使得你可以编写更灵活、类型安全的代码。下面是一个例子,说明在Java中优先考虑泛型的好处: 考虑一个简单的容器类,它可以存储任意类型的元素&#xff0…

【Avue】点击新增再点击表单得radio选项出现新表单,且编辑页面关不掉新表单处理方法

一、问题描述 1、点击新增 2、 点击radio选择值 1、点击否得时候没反应 2、点击是得时候出现新表单 2.1、旧代码 {label: 是否危险源,prop: isBigdanger,searchLabelWidth: 120,overHidden: true,span: 24,rules: [{required: true,message: 请选择是否重大危险源,trigger: bl…

孟德尔随机化+WGCNA+预后模型,7+轻松get

今天给同学们分享一篇生信文章“Exploring the causality and pathogenesis of systemic lupus erythematosus in breast cancer based on Mendelian randomization and transcriptome data analyses”,这篇文章发表在Front Immunol期刊上,影响因子为7.3…

浅显易懂 @JsonIgnore 的作用

1.JsonIgnore作用   在json序列化/反序列化时将java bean中使用了该注解的属性忽略掉 2.这个注解可以用在类/属性上   例如:在返回user对象时,在pwd属性上使用这个注解,返回user对象时会直接去掉pwd这个字段,不管这个属性有没…

【Idea】SpringBoot项目中,jar包引用冲突异常的排查 / SM2算法中使用bcprov-jdk15to18的报错冲突问题

问题描述以及解决方法: 项目中使用了bcprov-jdk15to18 pom依赖,但是发现代码中引入的版本不正确。 追溯代码发现版本引入的是bcprov-jdk15on,而不是bcprov-jdk15to18,但是我找了半天pom依赖也没有发现有引入bcprov-jdk15on依赖。…

MySQL常见死锁的发生场景以及如何解决

死锁的产生是因为满足了四个条件: 互斥占有且等待不可强占用循环等待 这个网站收集了很多死锁场景 接下来介绍几种常见的死锁发生场景。其中,id 为主键,no(学号)为二级唯一索引,name(姓名&am…

Vue.js 使用基础知识

Vue.js 是一款用于构建用户界面的渐进式框架,它专注于视图层。Vue.js 不同于传统的 JavaScript 框架,它采用了组件化的开发方式,使得开发者可以更加高效和灵活地构建交互式的 Web 应用程序。 目录 什么是 Vue.js安装 Vue.jsVue 实例模板语法插…

bat 脚本的常用特殊符号

1、 命令行回显屏蔽符 2、% 批处理变量引导符 3、> 重定向符 4、>> 重定向符 5、<、>&、<& 重定向符 6、| 命令管道符 7、^ 转义字符 8、& 组合命令 9、&& 组合命令 10、|| 组合命令 11、"" 字符串界定符 12、, 逗号…

数据库表1和表2对比出差异列 将表1的插入表2

SQLserver2019表1和表2对比出差异列&#xff0c;将表1的插入表2 写成存储过程&#xff0c;传的参为表名 两个表名一致&#xff0c;表结构可能不一致&#xff0c;可能一致&#xff0c;如何快速对比两个表&#xff0c;将需要的字段自动添加至需要的表中 字段大小是一致的吧 -- …

卷积神经网络(CNN)中感受野的计算问题

感受野 在卷积神经网络中&#xff0c;感受野&#xff08;Receptive Field&#xff09;的定义是卷积神经网络每一层输出的特征图&#xff08;feature map&#xff09;上每个像素点在原始图像上映射的区域大小&#xff0c;这里的原始图像是指网络的输入图像&#xff0c;是经过预处…

c++ 中多线程的相关概念与多线程类的使用

1、多线程相关概念 1.1 并发、并行、串行 并发&#xff08;Concurrent&#xff09;&#xff1a;并发是指两个或多个事件在同一时间间隔内运行。在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机…

Visual Studio编辑器中C4996 ‘scanf‘: This function or variable may be unsafe.问题解决方案

目录 ​编辑 题目&#xff1a;简单的ab 1. 题目描述 2. 输入格式 3. 输出格式 4. 样例输入 5. 样例输出 6. 解题思路 7. 代码示例 8. 报错解决 方案一 方案二 方案三 方案四 总结 题目&#xff1a;简单的ab 1. 题目描述 输入两个整数a和b&#xff0c;…

ISP去噪(2)_np 噪声模型

#灵感# ISP 中的去噪&#xff0c;都需要依赖一个噪声模型。很多平台上使用采集的raw进行calibration&#xff0c;可以输出这个模型&#xff0c;通常称为 noise profile。 目录 名词解释&#xff1a; 标定方法&#xff1a; 校准出的noise profile: noise profile 作用域&am…

RabbitMQ插件详解:rabbitmq_web_stomp【RabbitMQ 六】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 《RabbitMQ Web STOMP&#xff1a;打破界限的消息传递之舞》 前言STOMP协议简介STOMP&#xff08;Simple Text Oriented Messaging Protocol&#xff09;协议简介STOMP与WebSocket的关系 WebSocket和R…

C++模板进阶

文章目录 前言反向迭代器反向迭代器和正向迭代器的区别stl反向迭代器源码反向迭代器模拟实现测试 模板进阶非类型模板参数Array 模板的特化模板的分离编译 前言 模板进阶也没有到一些特别的东西&#xff0c;就是讲比较偏的一些特性。 在这里我们先来讲一下反向迭代器。 反向迭…

java.net.SocketException: Connection reset

背景 在我用socket进行TCP通信的时候&#xff0c;当我关闭client端时在服务端出现了Connection reset的异常。 一、问题 下面是异常信息&#xff1a; Exception in thread "Thread-12" java.lang.RuntimeException: java.net.SocketException: Connection reseta…

解决下载huggingface模型权重无法下载的问题

文章目录 方法一(推荐)方法二方法三依然存在的问题 由于某些原因&#xff0c;huggingface的访问速度奇慢无比&#xff0c;对于一些模型(比如大语言模型LLM)的权重文件动辄几十上百G&#xff0c;如果用默认下载方式&#xff0c;很可能中断&#xff0c;这里推荐几种方式。 方法一…

ShopsN commentUpload 文件上传漏洞复现

0x01 产品简介 ShopsN 是一款符合企业级商用标准全功能的真正允许免费商业用途的开源网店全网系统。 0x02 漏洞概述 ShopsN commentUpload 接口处存在任意文件上传漏洞,攻击者可以利用文件上传漏洞执行恶意代码、写入后门、读取敏感文件,从而可能导致服务器受到攻击并被控…

cat EOF快速创建一个文件,并写入内容

在linux系统中&#xff0c;如果你有这个需求 vi一个文件 /etc/docker/daemon.json 在这个文件中写入内容 { "registry-mirrors": ["https://iw3lcsa3.mirror.aliyuncs.com","http://10.1.8.151:8082"],"insecure-registries":[&quo…