目录
一:vsftpd 编译安装流程
更详细的编译安装流程,在解压源码文件后,通过源码文件目录下的 INSTALL 文件可以进行查看。
1、下载源码文件
例如:下载3.0.5版本的源码包
2、启用相关模块
vsftpd
提供了PAM、SSL和TCP WRAPPERS三个模块,因为源码包中已经提供了创建好的MakeFile
文件,所以通过修改builddefs.h
文件可以启用或禁用对应的插件。
PAM默认启用,SSL和TCP WRAPPERS 默认禁用。将配置文件中的undef
修改为define
即表示启用对应插件。
3、编译源码文件
执行make
命令即可编译源码,编译安装后,会在源码生成一个名为vsftpd
的可执行二进制文件。
4、依赖文件检查
例如:启用了PAM模块后,就需要检查编译后的vsftpd是否有对应的依赖库,如果没有,后续配置虚拟用户模式就会不生效。
如果没有引用对应的依赖库,则说明缺少对应的开发包,需要在系统上安装好对应的依赖后,再重新编译vsftpd。
ldd ./vsftpd | grep pam
5、拷贝到指定路径
将可执行文件vsftpd
、配置文件vsftpd.conf
、以及帮助文件vsftpd.conf.x
放在服务器的对应路径下,然后设置PATH变量
- 方式一:执行
make install
,这样会默认按照MakeFile文件中指定的路径,将相关文件进行拷贝到对应路径。 - 方式二:手动 cp 文件,将
vsftpd 、vsftpd.conf.5、 vsftpd.8
三个文件拷贝到对应位置。
说明:
- vsftpd的源码文件没有提供类似于PREFIX选项来指定安装路径,如果需要自定义安装路径,就需要手动拷贝对应的文件到自定义目录下。
- 执行make install时默认的安装路径,可以通过打开Makefile文件进行查看。
例如:手动安装vsftpd
sudo cp vsftpd /usr/local/sbin/
sudo cp vsftpd.conf.5 /usr/local/man/man5/
sudo cp vsftpd.8 /usr/local/man/man8/
6、准备运行环境
(1)创建匿名用户: vsftpd
的匿名模式下需要存在nobody
和ftp
两个用户,所以这两个用户不存在的话需要手动创建。
# 创建 FTP 用户
sudo mkdir -p /var/ftp && sudo chown root:root /var/ftp
# 匿名模式下,vsftpd是在禁锢模式(chroot)下运行,即匿名用户`ftp`和`annymouse`不能对`/var/ftp`目录具有写权限。
sudo chmod -w /var/ftp
sudo useradd -d /var/ftp -s /sbin/nologin ftp
# 创建nobody用户
sudo useradd -r -s /usr/sbin/nologin nobody
(2)创建特定目录:/usr/share/empty/
目录用于 chroot 操作,确保匿名用户不能访问系统的其他部分。
sudo mkdir -p /usr/share/empty/
(3)创建 service 文件:如果是使用systemd
做为init
进程的操作系统,可以将vsftpd
交给systemd
以service
的形式托管。
例如:
# /lib/systemd/system/vsftpd.service
[Unit]
Description=vsftpd FTP server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/vsftpd /etc/vsftpd.conf
ExecReload=/bin/kill -HUP $MAINPID
ExecStartPre=-/bin/mkdir -p /var/run/vsftpd/empty
[Install]
WantedBy=multi-user.target
(4)拷贝配置文件:即使是使用 make install
这种方式来安装vsftpd,配置文件也不会默认拷贝,需要手动将vsftpd.conf文件拷贝到/etc
目录下,因为vsftpd
进程启动时默认会读取/etc/vsftpd.conf
这个配置文件。
如果需要存放到其他路径下,则运行vsftpd进程的时候需要指定配置文件的路径。格式为:vsftpd /path/vsftpd.conf
7、启动服务测试
将vsftpd交给systemd托管时候,需要让vsftpd以独立服务的形式运行(默认就是,一些老版本不是),所以需要在配置文件中加入listen=YES
配置项,从而以独立服务形式运行。
二:vsftpd 配置指令说明
1、配置文件路径和格式
- vsftpd 官方配置参考手册:https://security.appspot.com/vsftpd/vsftpd_conf.html
vsftpd 配置文件的路径:
vsftpd 进程启动后,默认查找的配置文件是/etc/vsftpd.conf,如果配置文件是自定义的路径,则需要在启动vsftpd进程的的时指定配置文件路径,所以可以通过查看vsftpd进程的启动参数来查找配置文件路径。
例如:如果 vsftpd 是通过 systemd 管理的服务,你还可以查看 vsftpd 服务的启动参数来找出配置文件的位置。
vsftpd 配置文件的格式:
- 在 配置文件中,如果以
#
号开头表示注释。 - 配置文件中的指令和值之间的
=
号两边不能存在任何空格。
指定子配置文件方法:
- 通过
user_config_dir
选项可以指定vsftpd的子配置文件路径,一般配置虚拟用户模式的时候会用到。
2、服务和连接相关配置
服务端模式设置:
listen=yes/no
:控制vsftpd
是否作为独立服务运行,需要启用这个配置项。
服务端时间设置:
use_localtime=yes/no
:FTP服务端的时间格式是否和服务器一致,如果不启用,默认使用的是格林威治时间。
服务端口设置:
listen_port=num
:指定vsftpd
监听的端口号。默认是 21,。pasv_min_port
和pasv_max_port
:设置被动模式下允许的数据通道端口范围。默认范围是1024-65535
。ftp_data_port=num
:主动模式下ftp服务端的数据通道端口。默认是 20,需要禁用connect_from_port_20
才会生效。
工作模式设置:
pasv_enable=yes/no
:是否将FTP服务端切换为被动模式,默认就是被动模式下运行。active_enable=yes/no
:是否将FTP服务端切换为主动模式,默认就是被动模式下运行。
服务端日志设置:
xferlog_file=/path
:指定日志文件路径,不指定默认是/var/log/vsftpd.log
xferlog_enable=yes/no
:启用后会记录上传和下载的日志信息,如果要看详细日志信息,就需要开启。xferlog_std_format=yes/no
:禁用后会显示日志的更多详细信息,一般禁用,方便排查问题。log_ftp_protocol=yes/no
:启用后会记录每个FTP会话的详细对话。一般启用,可以查看更多日志信息。
3、用户根目录相关配置
用户目录配置:
local_root=/path
:指定非匿名用户的根目录。anon_root=/path
:指定匿名用户的根目录
禁锢用户访问(Chroot):
chroot_local_user=YES/NO
:启用或禁用非匿名用户被禁锢在其登录目录。allow_writeable_chroot=YES/NO
:允许在禁锢模式下对根目录进行写操作(适用于非匿名用户)。
4、匿名用户的相关配置
匿名用户指的就是FTP客户端通过ftp
或anonymous
这两个用户名登录FTP服务器。所以要使用匿名用户模式,需要确保服务器上存在 ftp
和 nobody
这两个系统用户。
匿名用户模式配置:
anonymous_enable=yes/no
:是否启用匿名模式,如果启用,则允许匿名用户通过ftp
或anonymous
登录。no_anon_password=yes/no
:是否允许匿名用户无需密码即可登录。启用后匿名用户不输入密码直接登录。
匿名用户权限控制:
-
anon_upload_enable=yes/no
:是否允许匿名用户执行上传文件的FTP命令,如果允许则允许匿名用户上传文件到FTP服务端。 -
anon_other_write_enable=yes/no
:是否允许匿名用户执行除了上传和创建目录之外的FTP命令,这类FTP命令会改变服务端的文件系统。 -
anon_mkdir_write_enable=yes/no
:允许或禁止匿名用户创建目录。若允许则匿名用户将能够创建目录。 -
anon_world_readable_only=yes/no
:是否只允许匿名用户下载具有全局读取权限的文件。若启用,则只有ftp或nobody具有读权限的文件才能下载。
说明:匿名用户如果要修改服务端的文件系统,需要启用write_enable配置,让用户有权限执行这些会改变文件系统权限的FTP命令。并且还需要保证ftp或nobody用户具有在操作系统层面上具备相应的文件权限。例如,必须对文件拥有写权限,才能执行删除、修改等操作。
5、本地用户的相关配置
本地用户模式指的是FTP客户端使用操作系统中已存在的用户账户进行登录。此模式下,FTP用户与操作系统用户是绑定的。
本地用户模式配置:
local_enable=yes/no
:是否允许使用操作系统本地用户登录 FTP 服务端。若允许则允许操作系统中已存在的用户使用自己的账户进行登录。
本地用户权限控制:
write_enable=yes/no
:是否允许FTP客户端用户执行可以改变文件系统(例如上传、修改、删除)的FTP命令。
说明:
- 本地用户模式下,只需要允许本地用户执行可以改变文件启动的FTP命令(启用write_enable),然后确保该用户具有对应的文件系统权限去更改这个文件就行了。
- 本地用户必须有一个有效的登录 shell(如 /bin/bash),否则会拒绝该用户的 FTP 登录请求。
6、虚拟用户的相关配置
虚拟用户指的是只在FTP服务中有效,在操作系统中不存在的用户。因为虚拟用户不具有操作系统层面的文件权限,因此需要将虚拟用户与系统用户进行绑定。
虚拟用户配置:
guest_enable=yes/no
:是否启用匿名模式,如果启用了匿名模式,,所有连接到FTP服务端的用户都会被视为虚拟用户进行验证。guest_username=username
:指定将虚拟用户映射为某个实际存在的操作系统用户。如果不指定默认就是ftp这个系统用户。virtual_use_local_privs=yes/no
:是否让虚拟用户拥有guest_username指定的系统用户的文件系统权限,如果不指定的话,默认是匿名用户的权限。、
说明:启用虚拟用户模式,还需要启用local_enable
选项才能正常使用。因为当虚拟用户被映射到一个本地用户时,会使用本地用户来处理权限和文件访问。vsftpd 会通过 local_enable
的设置来决定是否允许该本地用户的操作
虚拟用户权限控制:
指定了 guest_username 和 virtual_use_local_privs
:虚拟用户会映射到指定的 本地系统用户,并使用该本地用户的权限。这时,权限控制将遵循 本地用户模式 的相关配置(如 local_enable、write_enable 等),即通过本地用户的权限控制来管理虚拟用户的操作权限。没有指定 guest_username 和 virtual_use_local_privs
:虚拟用户默认映射到一个ftp这个匿名用户,并使用匿名用户模式的相关配置。这时,权限控制则需要通过 匿名用户模式 的配置项(如 anon_upload_enable、anon_world_readable_only 等)来管理虚拟用户的权限。
说明:
- 启用虚拟用户模式后,FTP登录FTP服务端使用的所有用户都会被认为是虚拟用户。
虚拟用户模式配置流程:
1、需要先检查当前的vsftpd是否加载了PAM相关库文件,如果没加载则pam验证不会生效。
ldd vsftpd | grep pam
2、创建一个系统本地用户,这个用户不要求拥有有效的登录 shell(如 /bin/bash)
useradd -r -m -d /ftp_data -s /sbin/nologin vsftpd
3、创建一个文本文件。文本文件里面存放用户名和密码
# 奇数行是用户名,偶数行是密码
sudo mkdir /etc/vsftpd/
sudo vim /etc/vsftpd/vusers
tom
Abc123
bob
123456
alice
redhat
4、生成Berkeley DB 数据库文件
sudo db_load -T -t hash -f ~/vusers /etc/vsftpd/vusers.db
5、编写PAM验证规则
sudo vim /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
auth required pam_userdb.so db=/etc/vsftpd/vusers
: 这个配置主要负责验证用户提供的密码是否正确。会根据用户输入的用户名去指定的数据库(如/etc/vsftpd/vusers)中查找对应的记录,并核对密码是否匹配account required pam_userdb.so db=/etc/vsftpd/vusers
: 作用主要就是验证提供的账号是否存在于数据库中。会根据用户输入的用户名去指定的数据库(如/etc/vsftpd/vusers)中查找对应的记录
6、需改vsftpd的配置文件
# 虚拟用户配置
# 启用虚拟用户模式
guest_enable=YES
local_enable=YES
# 指定映射的用户
guest_username=vsftpd
# 让虚拟用户拥有和系统用户同样的权限
virtual_use_local_privs=YES
# 指定用于验证的PAM规则文件,不用加全路径,会默认到/etc/pam.d下找
pam_service_name=vsftpd
# 权限配置
# 允许用户指定更改文件系统的FTP命令
write_enable=YES
# 指定用户创建文件的默认权限
local_umask=022
# 指定用户的默认根目录
local_root=/ftp_data
# 将用户禁锢到根目录下,从而使它不能进入更上层目录
chroot_local_user=YES
# 禁锢模式下,如果该用户对根目录有写权限,需要开启该选项
allow_writeable_chroot=YES
7、子配置文件使用方式
子配置文件的方式一般是用在虚拟用户模式下,使不同的虚拟用户具有不同的用户权限,通过将权限配置指定放在不同的子配置文件中,这样使用虚拟用户登录的时候,会单独读取以该用户命名的子配置文件,加载里面的配置项。从而实现这个功能。
例如:给虚拟用户tom配置时使用子配置文件的方式
(1)在主配置文件中通过user_config_dir
指定路径
sudo vim /etc/vsftpd.conf
user_config_dir=/etc/vsftpd.d/
(2)创建子配置文件,vsftpd规定子配置文件名称必须和虚拟用户名一致,且不能带后缀
sudo vim /etc/vsftpd.d/tom
# 配置相关权限
write_enable=YES
local_umask=022
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_world_readable_only=NO
# 数据目录指定
local_root=/ftp_data
chroot_local_user=YES
(3)重启服务检查
sudo systemctl restart vsftpd
三:FTP 的响应码说明
1、2xx:成功响应码
- 220:表示服务已经就绪了,可以执行新用户的请求。
- 230:返回230表示登录成功
2、3xx:需要进一步的信息
- 331: 用户名正确,需要密码。
- 332: 登录时需要账号。
3、4xx:临时失败
- 421: 服务不可用,关闭控制连接。
- 425: 无法打开数据连接。
- 426: 连接关闭;传输中止。
- 430: 用户登录不成功,用户名或密码错误。
- 450: 请求的文件操作未执行。文件不可用(例如,文件繁忙)。
- 451: 请求的操作中止:本地错误。
- 452: 请求的操作未执行。系统存储空间不足。
4、5xx:永久失败、
-
500:表示命令没法执行,服务器无法识别或处理客户端发送的命令
-
530: 未登录。
-
532: 存储文件需要账号。
-
550: 请求的操作未执行。文件不可用(例如,文件未找到,无访问权限)。
-
553: 请求的操作未执行。不允许的文件名。