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.vu
  auth	required	/lib64/security/pam_userdb.so
  db=/etc/vsftpd/vsftpd_virtualuser
  account	required	/lib64/security/pam_userdb.so
  db=/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 测试
相关推荐
运维日常手记10 分钟前
最新1.33.1 k8s高可用集群搭建(免翻墙)
运维
爱瑞瑞23 分钟前
🐧深入浅出的认识 Linux 指令
linux·shell
星哥说事36 分钟前
开源综合性网络安全检测和运维工具-TscanClient
运维·web安全·开源
ajassi200037 分钟前
开源 java android app 开发(十一)调试、发布
android·java·linux·开源
小李飞刀李寻欢1 小时前
使用kubeadm部署Kubernetes(k8s)集群的步骤
linux·服务器·ubuntu·kubernetes·k8s
运维成长记1 小时前
阿里云实践创建实例步骤
linux·运维·服务器·阿里云·云计算
THe CHallEnge of THe BrAve1 小时前
Linux检验库是否安装成功
linux·运维·服务器
Hello.Reader2 小时前
NGINX 四层 SSL/TLS 支持ngx_stream_ssl_module
运维·nginx·ssl
Estar.Lee2 小时前
如何在Debian中提高phpstorm的稳定性
运维·debian·api·免费api·phpstorm
藥瓿锻2 小时前
2024 CKS题库+详尽解析| 1. kube-bench 修复不安全项
运维·安全·docker·云原生·容器·kubernetes·cks