slacr_

Just to record my life and thoughts.
笔记/编程/杂乱/极简

[Linux]使用Vsftpd服务传输文件

Oct 18, 2023Linux3300 words in 22 min

文件传输协议

FTP(File Transfer Protocol)是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20用于进行数据传输,端口21用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术,因此得到了广大用户的青睐。

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

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

由于FTP、HTTP、Telnet等协议的数据都是经过明文进行传输,因此从设计的原理上就是不可靠的,但人们又需要解决文件传输的需求,因此便有了vsftpd服务程序。vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP服务程序不具备的特点。在不影响使用的前提下,能够让管理者自行决定是公开匿名、本地用户还是虚拟用户的验证方式,这样即便被骇客拿到了我们的账号密码,也不见得能登陆的了服务器。

1
2
3
4
5
6
7
8
dnf install vsftpd -y
systemctl start vsftpd
systemctl enable vsftpd

iptables -F
iptables-save
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload

vsftpd服务程序的主配置文件/etc/vsftpd/vsftpd.conf

将vsftpd配置文件重命名, 过滤掉注释生成新的配置文件

1
2
3
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_backup
grep -v "#" /etc/vsftpd/vsftpd.conf_backup > /etc/vsftpd/vsftpd.conf
cat /etc/vsftpd/vsftpd.conf

Vsftpd 服务程序

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

  • 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。
  • 本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果被骇客破解了账户的信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。
  • 虚拟用户模式:更安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使骇客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

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

1
dnf install ftp 

windows FTP客户端工具FileZilla FireFTP SmartFTP WinSCP Cyberduck Xftp

匿名访问模式

在vsftpd服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都可以无需密码验证而直接登录到FTP服务器。这种模式一般用来访问不重要的公开文件.

1
vim /etc/vsftpd/vsftpd.conf

1
2
systemctl restart vsftpd
ftp 192.168.128.5

在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空。而且在连接到FTP服务器后,默认访问的是/var/ftp目录。

1
2
3
4
5
6
7
ls -ld /var/ftp/pub
chown -R ftp /var/ftp/pub # 将目录的所有者改为系统账户ftp , 使ftp用户拥有写入权限

getsebool -a | grep ftp
setsebool -P ftpd_full_access=on # -P permanent, 开启SELinux中ftp的权限

ftp 192.168.128.5

除了修改pub目录所有者为ftp组, 也可以通过设置权限的方法使其他用户获取写入权限, 比如777.

局域网主机可以通过ftp客户端软件匿名登录与读写文件

通过文件资源管理器

本地用户模式

1
vim /etc/vsftpd/vsftpd.conf

1
systemctl restart vsftpd

为vsftpd服务程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers和user_list), 要里面写有某位用户的名字,就不再允许这位用户登录到FTP服务器上.

另外在采用本地用户模式登录FTP服务器后,默认访问的是该用户的家目录,而且该目录的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况。但仍需要开启SELinux域中对FTP服务的允许策略

1
2
setsebool -P ftpd_full_access=on
systemctl reload ftpd

虚拟用户模式

虚拟用户模式是这三种模式中最安全的一种认证模式,是专门创建出一个账号来登录FTP传输服务的,而不能用于SSH登录服务器。

  • 创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码.
1
2
cd /etc/vsftpd
vim vuser.list

  • 使用db load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。
1
2
3
db_load -T -t hash -f vuser.list vuser.db
chmod 600 vuser.db
rm -f vuser.list
  • 创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户.

为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为/var目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,我们将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还能够避免骇客通过这个系统本地用户进行登录。

1
2
3
4
useradd -d /var/ftproot -s /sbin/nologin virtual 
# 创建用户virtual, 家目录/var/ftproot, 登录的shell为/sbin/nologin, 禁止直接登录系统
ls -ld /var/ftproot
chmod -Rf 755 /var/ftproot
  • 建立用于支持虚拟用户的PAM文件
    PAM可插拔认证模块是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。

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

新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀.

1
vim /etc/pam.d/vsftpd.vu

在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu,PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。

1
vim /etc/vsftpd/vsftpd.conf

  • 为虚拟用户设置不同的权限
1
mkdir /etc/vsftpd/vusers_dir

  • 添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径.
1
vim /etc/vsftpd/vsftpd.conf

1
2
systemctl restart vsftpd
# setsebool -P ftpd_full_access=on

TFTP 简单文件传输协议

简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议。顾名思义,它提供不复杂、开销不大的文件传输服务,可将其当作FTP协议的简化版本。

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

tftp-server是服务程序,tftp是用于连接测试的客户端工具,xinetd是管理服务.

1
dnf install tftp-server tftp xinetd 

在Linux系统中,TFTP服务是使用xinetd服务程序来管理的。xinetd服务可以用来管理多种轻量级的网络服务,而且具有强大的日志功能,专门用于管理那些比较小的应用程序的开关工作,有点类似于有独立控制的插线板.

在Redhat 9 中 xinetd 的功能已经被集成到了 systemd 中, 已从软件仓库中移除, 无论配置的是本地仓库还是网络仓库都找不到这个package. 详情请参见issuehttps://access.redhat.com/solutions/6988388

1
dnf info systemd
1
2
3
cp /usr/lib/systemd/system/tftp.service /etc/systemd/system/tftp-server.service
cp /usr/lib/systemd/system/tftp.socket /etc/systemd/system/tftp-server.socket
vi /etc/systemd/system/tftp-server.service

1
2
3
4
5
systemctl daemon-reload # 重新载入systemd 守护进程
systemctl enable --now tftp-server # 启用并启动tftp服务

firewall-cmd --add-service=tftp --perm
firewall-cmd --reload

其他

umask

umask 是一个用于设置文件和目录的默认权限掩码的命令或配置选项。它定义了在创建新文件或目录时,系统会从默认权限中减去哪些权限位。Linux系统中新建普通文件后权限是644,新建的目录权限是755.
其实普通文件的默认权限应该是666,目录权限会是777, 这是写在系统配置文件中的。但默认值不等于最终权限值,根据公式“默认权限-umask=实际权限”, 而umask值默认是022,所以实际文件到手就剩下644,目录文件剩下755了。

1
umask 0022

SFTP

SFTP(SSH File Transfer Protocol) 是一种通过 SSH(Secure Shell)安全通道进行文件传输的协议。
SFTP 是在 SSH 协议之上构建的,利用 SSH 的加密和身份验证机制来保护文件传输的安全性。

ss

ss 命令是一个用于获取套接字统计信息的工具,它可以显示正在活动中的套接字、网络连接、路由表等。

1
2
ss -tul
ss -tuln | grep 69

参考

  1. Linux就该这么学
  2. [鸟哥linux基础学习篇4th]
  3. linux命令
  4. 开源许可证总览
  5. LSB标准
  6. 硬盘结构
  7. RHCSA学习
  8. RHEL订阅
  9. 如何在 RHEL 9 上创建本地 Yum/DNF 仓库
  10. VDO github地址
  11. RHEL9 VDO文档
  12. Fedora官方下载
  13. FedoraProject镜像
  14. 使用 RHEL 9 时的注意事项
  15. Linux运维工程师的TFTP服务器配置自定义目录解决方案
  • Author:

    slacr_

  • Copyright:

  • Published:

    October 18, 2023

  • Updated:

    October 18, 2023

Buy me a cup of coffee ☕.

1000000