侧边栏壁纸
博主头像
吐司块博主等级

床前明月光,疑是地上霜

  • 累计撰写 29 篇文章
  • 累计创建 5 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

快速入门 FTP 服务

吐司块
2024-04-10 / 0 评论 / 1 点赞 / 8 阅读 / 31836 字
广告 广告

1)介绍 FTP 服务

FTP( File Transfer Protocol,文件传输服务 )提供在 Internet 上的任意两台计算机之间相互进行的文件传输。只要双方主机都支持 FT P协议,就可以利用FTP来进行文件传输。

FTP 是一种在互联网中进行文件传输的协议,基于 C/S 模式,默认服务端口号是 20、21

20 端口 用于数据传输、21 端口 用于接收客户端的 FTP 命令与参数。


FTP 服务器( Server ) 按照 FTP 协议在互联网上提供 文件存储与文件访问的服务
FTP 客户端( Client ) 用于 向服务器索要资源

FTP工作模式 主要分为两种

  • 主动模式(PORT):FTP 服务器 主动向客户端发起连接请求
  • 被动模式(PASV):FTP 服务器 等待客户端发起连接请求。

2)安装 FTP 服务

FTP 是一种文件传输协议,实现这种协议的工具,有一款 Linux 平台上的程序,名为 vsftpd( Ver Secure FTP Daemon,非常安全的 FTP 守护进程 )

基于 CentOS 平台, 可以直接使用 Yum 工具安装
[root@ftp-server ~] yum info vsftpd
[root@ftp-server ~] yum install vsftpd -y

# 注意关闭防火墙规则
[root@ftp-server ~] iptables -F
[root@ftp-server ~] systemctl disable --now firewalld

3)vsftpd 配置文件

**注意:**配置文件不得有任何莫名其妙的空格!否则会重启失败

# 过滤出非注释行, 非空行
[root@ftp-server ~] grep -vE '^#|^$' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES  	# 是否开启匿名用户允许访问
local_enable=YES    	  # 是否允许本地用户登录FTP
write_enable=YES    		# write_enable=YES # 全局设置, 是否容许写入, 开启允许上传的权限
local_umask=022     		# 本地用户上传文件的 umask
dirmessage_enable=YES   # 允许为目录配置显示信息, 显示每个目录下面的 message_file 文件的内容
xferlog_enable=YES			# 开启日志功能, 以及存放路径
xferlog_file=/var/log/vsftpd.log  # 日志路径
connect_from_port_20=YES    		  # 使用 20 端口进行连接
xferlog_std_format=YES    			  # 标准日志格式
listen=YES        							  # 绑定到监听端口
listen_ipv6=YES    								# 开启 ipv6
pam_service_name=vsftpd    			  # 设置 PAM 的名称
userlist_enable=YES							  # 设置用户已列表, 允许或是禁止
tcp_wrappers=YES								  # 控制主机访问, 检查 /etc/hosts.allow  hosts.deny 的配置达到防火墙作用

4)vsftpd 服务程序

vsftpd 允许用户 三种认证模式 登录到 FTP 服务器。

  • **本地用户模式:**基于 Linux 本地账号密码进行认证,配置简单,但是一旦被破解,服务器信息就很危险
  • **匿名用户模式:**任何人无需密码直接登录
  • **虚拟用户模式:**单独为 FTP 创建用户数据库,基于口令验证账户信息,只适用于 FTP 服务,不会影响其他用户信息,最为安全。

5)安装 FTP 客户端

FTP 客户端有多种形式,图形化、命令行

# Linux 客户端
yum install ftp -y

# Windows 客户端
FileZilla_Pro_3.66.5_64bit_Green

image.png

方案一:匿名用户模式

匿名用户模式是 最不安全的方式,一般用在访问不重要的,允许公开的文件,且放在企业内网环境中,置于防火墙规则下,保证基本的安全性。

vsftpd 默认开启了 匿名用户模式
修改配置文件:定义匿名用户的权限,如下

[root@ftp-server ~] grep '^anon' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES					# 允许匿名访问
anon_upload_enable=YES    		# 允许匿名用户上传
anon_mkdir_write_enable=YES 	# 允许匿名用户创建目录
anon_other_write_enable=YES 	# 允许匿名用户修改目录
[root@ftp-server ~] vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES				# 取消注释
anon_mkdir_write_enable=YES	  # 取消注释
anon_other_write_enable=YES		# 添加配置

image.png

重启服务,且加载开机自启

[root@ftp-server ~] systemctl restart vsftpd  		 # 重启服务
[root@ftp-server ~] systemctl enable --now vsftpd  # 开启自启

此时可以使用 FTP 命令连接到 FTP 服务器了。

匿名用户连接上 FTP 服务端,访问的是目录默认是 /var/ftp( FTP 匿名用户的默认根目录 )

[root@ftp-server ftp] pwd
/var/ftp

[root@ftp-server ftp] ls
pub

image.png

使用 FTP 客户端命令,连接 FTP 服务端

C:\Users\WangJ>ftp 192.168.80.8       		 # 连接 FTP 服务器的 IP 地址
连接到 192.168.80.8
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.

用户(192.168.80.8:(none)): anonymous        # 填入匿名用户默认的账号 ( 也可以使用 ftp 用户名 )
331 Please specify the password.

密码:                                       # 密码为空, 直接回车
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
pub
226 Directory send OK.
ftp: 收到 8 字节,用时 0.00秒 8.00千字节/秒。

ftp> cd pub
250 Directory successfully changed.

ftp> mkdir wangj                					# 注意: 发现在这里创建文件夹报错了
550 Create directory operation failed.

image.png

我们使用 FTP 匿名用户 成功登录 FTP SERVER,默认访问的是 /var/ftp 文件夹

现在我们来检查下文件夹权限

[root@ftp-server ftp] pwd
/var/ftp

[root@ftp-server ftp] ll
total 0
drwxr-xr-x 2 root root 6 Jun 10  2021 pub

如上得知,因为 Pub 文件夹,在 Linux 系统层面属于 root 用户。因此系统层面的 ftp 用户无法向其写入内容。

**解决方式:**授权 FTP 用户针对 Pub 目录拥有 可读可写可执行 的权限

# 检查系统用户 ftp
[root@ftp-server ftp] id ftp
uid=14(ftp) gid=50(ftp) groups=50(ftp)

# 收取 pub 文件夹的目录权限给 ftp 用户
[root@ftp-server ftp] setfacl -m u:ftp:rwx /var/ftp/pub  # 递归处理所有的文件及子目录, 去除错误信息

再次使用** 匿名用户** 登录 FTP SERVER,写入数据

测试基于 匿名用户 FTP 针对 Pub 目录 增删改查

C:\Users\WangJ>ftp 192.168.80.8
连接到 192.168.80.8。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.

用户(192.168.80.8:(none)): ftp			# 基于匿名用户 FTP 登录
331 Please specify the password.
密码:															  # 密码直接回车即可
230 Login successful.

ftp> cd pub													# 切换至 Pub 目录

ftp> mkdir wangj666        				  # 测试: 创建文件夹
257 "/pub/wangj666" created

ftp> rename wangj666 wangj888       # 测试: 重命名文件夹
350 Ready for RNTO.
250 Rename successful.

ftp> rmdir wangj888         				# 测试: 删除文件夹
250 Remove directory operation successful.

此时成功写入了 FTP 文件夹数据,服务器上检查文件信息

[root@ftp-server pub] pwd
/var/ftp/pub

[root@ftp-server pub] ls
wangj666  wangj888

[root@ftp-server pub]

image.png

方案二:本地用户模式

使用 Linux 本地用户模式( 基于系统层面的用户 ),比匿名用户模式更安全
修改配置文件:关闭匿名模式,开启本地用户模式

相关配置文件

[root@ftp-server pub] ls /etc/vsftpd/
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

修改配置文件如下 /etc/vsftpd/vsftpd.conf

[root@ftp-server pub] vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO    # 关闭匿名用户模式
local_enable=YES    	 # 开启本地用户模式
write_enable=YES    	 # 设置可写权限
local_umask=022    		 # 文件 umask 值
userlist_enable=YES    # 启用【禁止登录的用户名单】文件名是, ftpusers, user_list
userlist_deny=YES      # 开启禁止登录名单

重启 vsftpd 服务,加载配置

[root@ftp-server pub] systemctl restart vsftpd
[root@ftp-server pub] systemctl enable --now vsftpd

此时即可以使用 FTP 客户端进行连接了,使用 FTP-SERVER 的 Linux 本地用户 信息登录即可

假设当前服务器上用户管理中存在一个用户 wangj

# 创建系统用户
[root@ftp-server ~] useradd wangj
[root@ftp-server ~] echo 123456 | passwd --stdin wangj

# 验证用户信息
[root@ftp-server ~] grep 'wangj' /etc/passwd
wangj:x:1000:1000::/home/wangj:/bin/bash

此时 FTP 客户端 **可以使用此用户 **连接 FTP,默认访问的是 该用户的家目录
也就是 /home/wangj 文件夹内容

// 使用 FileZilla 客户端连接 FTP-SERVER
// 并测试使用 Linux 系统用户登录, 成功连接 ( 并实现针对该目录增删改查 )

image.png

**注意:**有些系统用户可能无法登录 FTP-SERVER( 例如 root 用户 ),
因为 vsftpd 有一个名单,名单内的用户禁止登录( 类似黑名单 )

( 黑名单文件: ftpusers, user_list )

[root@ftp-server vsftpd] pwd
/etc/vsftpd

[root@ftp-server vsftpd] ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

# 文件中写入的名字, 都是禁止登录的
[root@ftp-server vsftpd] cat ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

#### 如此, 禁止登录的用户 ( 例如: root 用户 )
C:\Users\WangJ>ftp 192.168.80.8
连接到 192.168.80.8。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.

用户(192.168.80.8:(none)): root
530 Permission denied.							# Linux 系统的 root 用户不被允许登录 FTP 服务器
登录失败。

image.png

方案三:虚拟用户模式( 推荐 )

了解了有 匿名用户、本地用户、再来了解下 虚拟用户模式
顾名思义是 虚拟创建出的用户,也是最为安全的一种模式。

首先安装 Berkeley DB 工具

yum install db4 db4-utils -y

创建用于进行 FTP 认证的用户数据库,**奇数行 **账户名、**偶数行 **密码

[root@ftp-server vsftpd] vim /etc/vsftpd/ftp_user.txt
wangj
123456
wangjun
654321

由于这样的明文信息很不安全,且 vsftpd 也无法加载该格式的数据
因此我们还需要用 db_load 命令对 ftp_user.txt 文件数据加密,并设置权限使得普通用户无权限查阅。

# 创建加密文件 -T 和 -t 参数必须加上
# 用于转化普通文本为 vsftpd 识别的数据库文件
[root@ftp-server vsftpd] db_load -T -t hash -f /etc/vsftpd/ftp_user.txt /etc/vsftpd/ftp_user.db

# 检查文件属性
[root@ftp-server vsftpd] file ftp_user.db
ftp_user.db: Berkeley DB (Hash, version 9, native byte-order)

# 规避安全风险
[root@ftp-server vsftpd] ll ftp_user.db
-rw-r--r-- 1 root root 12288 Apr  8 19:10 ftp_user.db

[root@ftp-server vsftpd] chmod 600 ftp_user.*
[root@ftp-server vsftpd] ll ftp_user.*
-rw------- 1 root root 12288 Apr  8 19:10 ftp_user.db
-rw------- 1 root root    28 Apr  8 19:10 ftp_user.txt

创建一个虚拟用户登录后 默认访问的文件夹路径
且和 Linux 中的一个本地用户做一个映射关系,防止匿名用户登录后
访问到该文件夹,但是系统没有此用户,报错目录权限问题

# 新建一个用户, 指定用户家目录, 且禁止登录
[root@ftp-server vsftpd] useradd -d /var/ftpdir -s /sbin/nologin vuser

# 授权此 ftpdir 的属性
[root@ftp-server vsftpd] setfacl -m u:vuser:rwx /var/ftpdir

# 添加 vuser 用户至 ftpusers 禁止用户登录文件
# 增大系统安全, 但是不会影响虚拟用户的登录
[root@ftp-server vsftpd] echo 'vuser' >> ftpusers

此时需要创建支持虚拟用户的 PAM 文件
PAM 是一组安全机制的模块,编辑认证文件 /etc/pam.d/vsftpd

# 备份原有的 PAM 配置文件
[root@ftp-server pam.d] mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd_bak

# 编写新的 PAM 配置文件
# 注意 db 参数指定的是 db_load 生成的文件路径,无需添加后缀
[root@ftp-server pam.d] vim /etc/pam.d/vsftpd
auth    required    pam_userdb.so   db=/etc/vsftpd/ftp_user
account required    pam_userdb.so   db=/etc/vsftpd/ftp_user

最后修改 vsftpd 配置文件

[root@ftp-server pam.d] grep -Ev '^$|^#' /etc/vsftpd/vsftpd.conf
anonymous_enable=NO     # 禁止匿名模式
local_enable=YES        # 允许本地用户
write_enable=YES    
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
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
userlist_deny=YES
tcp_wrappers=YES
guest_enable=YES        				# 开启虚拟用户
guest_username=vuser			      # 指定虚拟用户账号
allow_writeable_chroot=YES      # 如果用户被限制只能在其家目录, 允许用户可以对家目录写入数据

# 重启 FTP 服务
[root@ftp-server pub] systemctl restart vsftpd

【针对不同的虚拟用户设置不同的权限】
用户 FTP 认证的虚拟账号:ftp_user.txt

  • wangj,允许上传,新建,修改,查看,删除权限
  • wangjun,只读权限

这样的需求可以通过 vsftpd 配置文件实现
定义 user_config_dir 参数实现:不同的虚拟用户基于不同的配置文件定义不同的操作权限

# 新建管理虚拟用户权限的文件夹
[root@ftp-server vsftpd] mkdir /etc/vsftpd/virtual_user_dir

# 进入文件夹,创建权限的配置文件
[root@ftp-server vsftpd] cd /etc/vsftpd/virtual_user_dir/

# 允许上传, 新建,修改,查看,删除权限
[root@ftp-server virtual_user_dir] vim wangj
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

# 再创建一个 wangjun 文件, 禁止写入
[root@ftp-server virtual_user_dir] vim wangjun
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

编辑 vsftpd 主配置文件,添加如下一行

[root@ftp-server virtual_user_dir] vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/virtual_user_dir											# 指向我们刚创建的用户配置目录

重启 vsftpd 服务,注意配置文件,不得有任何莫名其妙的空格!否则会重启失败

systemctl restart vsftpd

【此时使用 FTP 客户端登录用户 wangj,进行读写】

image.png

【使用 wangjun 用户登录 FTP 服务端,查看是否能够读写】

image.png

如上案例,两个虚拟用户访问的是 同一个 FTP 跟目录,我们也可以在各自虚拟用户的配置文件中定义各自访问的 FTP 跟目录( 使用 local_root=/var/ftpdir/xxx 选项 )

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
广告 广告

评论区