FTP介绍

VSFTP,全称为Very Secure FTP,是一种高度安全的FTP服务器软件。它是一款针对安全和性能进行优化的FTP服务器,拥有速度快、稳定、易用和安全性高的特点。VSFTP是在GPL许可证下发布的自由软件,可以在大多数类UNIX系统中使用。VSFTP支持IPv6、SSL/TLS加密传输,同时还提供了多种认证方式,包括本地用户、PAM、LDAP等等。同时,VSFTP也支持虚拟用户和虚拟目录,便于管理员进行用户管理。总之,VSFTP是一款功能强大且安全性高的FTP服务器软件,深受系统管理员和开发者的欢迎。

安装

yum -y install vsftpd

安装Vsftpd及相关依赖

yum -y install vsftpd* pam* db4*

vsftpd: ftp软件

pam: 认证模块

db4: 支持文件数据库

启动

systemctl start vsftpd

配置文件

*配置文件* *作用*
/etc/vsftpd/vsftpd.conf vsftpd的核心配置文件
/etc/vsftpd/ftpusers 用于指定哪些用户不能访问FTP服务器
/etc/vsftpd/user_list 指定允许使用vsftpd的用户列表文件
/etc/vsftpd/vsftpd_conf_migrate_sh 是vsftpd操作的一些变量和设置脚本
/etc/ftp/ 默认情况下匿名用户的根目录

vsftpd 配置详解

属性 属性值 含义
anonymous_enable YES/NO 是否允许匿名用户(anonymous)登录FTP,如果该设置被注释,则默认允许。
local_enable YES/NO 是否允许本地系统用户登录
write_enable YES/NO 是否开启任何形式的FTP写入命令,上传文件
local_umask xxx 本地用户的umask设置,如果注释该设置则默认为077,但一般都设置成022
anon_upload_enable YES/NO 是否允许匿名用户上传文件,如果要设置为允许,则需要先开启write_enable,否则无效,此外对应目录还要具有写权限
anon_mkdir_write_enable YES/NO 是否允许匿名用户创建新目录
dirmessage_enable YES/NO 当进入某个目录时,发送信息提示给远程用户
xferlog_enable YES/NO 是否开启上传/下载的日志记录
connect_from_port_20 YES/NO 是否使用20端口来连接FTP
chown_uploads YES/NO 匿名上传的文件时是否由某一指定用户chown_username所有
chown_username 有效用户名 匿名上传的文件由该设定用户所有
xferlog_file 有效路径 设置日志文件的保存位置,默认为/var/log/xferlog

常用的匿名FTP配置项

anonymous_enable=YES                    # 是否允许匿名用户访问
anon_umask=022 # 匿名用户所上传文件的权限掩码
anon_root=/var/ftp # 设置匿名用户的FTP根目录
anon_upload_enable=YES # 是否允许匿名用户上传文件
anon_mkdir_write_enable=YES # 是否允许匿名用户创建目录
anon_other_write_enable=YES # 是否允许匿名用户有其他写入权 (改名,删除,覆盖)
anon_max_rate=0 # 限制最大传输速率(字节/秒) 0为无限制

身份验证访问

创建虚拟用户

创建用户:

useradd -s /sbin/nologin vu
cd /etc/vsftpd/
vi user
#奇数行代表用户名,偶数行代表密码
zhao
12345
zhang
12345

创建数据文件

db_load -T -t hash -f user user.db
-f 指定数据原文件
-T 允许Berkeley DB的应用程序使用文本格式转换的DB数据文件
-t hash 读取文件的基本方法

建立支持虚拟用户的PAM认证文件

vi /etc/pam.d/vsftpd.vu

编写配置文件,对应刚才生成user.db文件

auth   required   /lib64/security/pam_userdb.so db=/etc/vsftpd/user   
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/user

修改配置文件

vi vsftpd.conf

write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YES
guest_enable=YES
guest_username=vu
pam_service_name=vsftpd.vu
local_enable=YES
local_umask=077
chroot_local_user=YES
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/user_dir

常用的全局配置项

listen=YES                                #是否以独立运行的方式监听服务
listen_address=192.168.10.112 #设置监听FTP服务的IP地址
listen_port=21 #设置监听FTP服务的端口号
write_enable=YES #是否启动写入权限(上传、删除文件)
download_enable=YES #是否允许下载文件
dirmessage_enable=YES #用户切换目录显示.message文件
xferlog_enable=YES # 启用日志文件,记录到/var/log/xferlog
xferlog_std_format=YES # 启用标准的xferlog日志格式,禁用此项将使用vsftpd自己的格式
connect_from _port_20=YES # 允许服务器主动模式 (从20端口建立数据连接)
pasv_enabTe=YES # 允许服务器被动模式
pasv_max_port=24600 # 设置被动模式服务器的最大端口号
pasv_min_port=24500 # 设置黄动模式服务的最小端口
pam_service_name=vsftpd # 用户认证的PAM文件位置
(/etc/pam.d/vsftpd.vu)
userlist_enable=YES # 是否启用user_list列表文件
userlist_deny=YES # 是否禁用user_list中的用户
max_cIients=0 #限制并发客户端连接数
max_per_ip=0 # 限制同一IP地址的井发连接数
tcp_wrappers=YES #是否启用tcp_wrappers主机访问控制
chown_username=root #表示匿名用户上传的文件的拥有人是root,默认关闭
ascii_upload_enable=YES # 表示是否允许用户可以上传一个二进制文件,默认不允许
ascii_download_enable=YES #代表是否允许用户下载个一个二进制文件,默认不允许
nopriv_user=vsftpd #设置支撑vsftpd服务的宿主用户为手动建立的vsftpd用户
async_abor_enable=YES # 设定支持异步传输功能
ftpd_banner=welcome to Awei FTP servers # 设定vsftpd的登录标语
guest_enable=YES # 设置启用虚拟用户功能
guest_username=ftpuser #指定虚拟用户的宿主用户
virtual_use_local_privs=YES # 设定虚拟用户的权限符合他们的宿主用户
user_config_dir=/etc/vsftpd/vconf # 设定虚拟用户个人vsftp的配置文件存放路径

为用户建立独立的配置目录及文件

mkdir /etc/vsftpd/user_dir

进入刚创建的文件夹:

cd /etc/vsftpd/user_dir
vi zhao
# 输入如下命令(虚拟用户数据的存放路径)
local_root=/etc/vsftpd/data

创建虚拟用户数据存放位置

cd ..
mkdir data
chmod 777 data/
  • 本地用户和虚拟用户不能同时登录、因为认证方式只有一种
  • 本地是 pam_service_name =vsftpd
  • 虚拟是 pam_service_name =vsftpd.vu

使用示例:

创建一个系统用户供予虚拟用户映射

useradd vsftpd -d /home/vsftpd -s /bin/nologin
  • useradd: 这是用于创建新用户的命令。
  • vsftpd: 这是你要创建的用户名。在这个例子中,用户名是vsftpd
  • -d /home/vsftpd: 这个选项指定用户的主目录。在这个例子中,用户的主目录被设置为/home/vsftpd
  • -s /bin/nologin: 这个选项指定用户的登录Shell。在这个例子中,用户的登录Shell被设置为/bin/nologin/bin/nologin是一个特殊的Shell,它会阻止用户通过命令行登录系统。这通常用于创建系统用户或服务用户,这些用户不需要交互式登录权限。

vsftpd.conf配置

进入/etc/vsftpd 目录下,执行 vi vsftpd.conf

anonymous_enable=NO #关闭匿名登录
local_enable=YES #允许本地用户登录
write_enable=YES #是否允许登陆用户有写权限。属于全局设置,默认值为YES。
local_umask=022 #本地用户新增档案时的umask 值。默认值为077
anon_upload_enable=YES #(允许匿名ftp 用户上传文件)
anon_mkdir_write_enable=YES #(允许匿名用户 创建新的目录)
anon_other_write_enable=YES #(允许匿名用户改名和删除文件)
dirmessage_enable=YES #激活目录消息,向远程用户发送消息,进入某个目录
xferlog_enable=YES #激活上传/下载 日志记录
connect_from_port_20=YES #确保RORT传输连接来自端口 20
xferlog_file=/var/log/xferlog #日志文件路径
xferlog_std_format=YES #日志文件使用标准ftpd xferlog格式的日志文件 ,默认位置 /var/log/xferlog
ascii_upload_enable=YES #允许ASCII模式上传文件
ascii_download_enable=YES #允许ASCII模式下载文件
ftpd_banner=This FTP is for the use of authorized users only. Individuals using this computer system without authority, or in excess of their authority, are subject to having all of their activities on this system monitored and recorded by system personnel, if such monitoring reveals possible evidence of criminal activity, system personnel may provide the evidence of such monitoring to law enforcement officials.
chroot_list_enable=NO #yes, chroot_list为能访问主目录外的文件的用户
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES #是否以独立运行的方式监听服务
pasv_enable=YES # 默认允许被动模式连接(YES)
pam_service_name=vsftpd #设置用于用户认证的PAM文件位置(/etc/pam.d/目录中对应的文件名)
userlist_enable=YES #是否启用userl_ist用户列表文件;
tcp_wrappers=YES #是否启用tcp_wrappers主机访问控制;
reverse_lookup_enable=NO #禁止DNS解析,解决登录验证过程缓慢问题
guest_enable=YES #是否启用虚拟用户
guest_username=vsftpd #指定映射的系统用户名称
user_config_dir=/etc/vsftpd/vsftpd_user_conf # 指定虚拟用户独立的配置文件目录
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
use_localtime=YES
listen_port=10021 #监听端口
allow_writeable_chroot=YES # centos7添加

生成虚拟用户数据文件

vi /etc/vsftpd/vsftpd_login.txt,写入用户名密码

image-20240709010802796

执行:

db_load -T -t hash -f /etc/vsftpd/vsftpd_login.txt /etc/vsftpd/vsftpd_login.db

配置PAM验证文件

执行:vi /etc/pam.d/vsftpd 注释掉原文件的内容,输入以下内容:

32位系统:

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

64位系统:

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

创建用户配置目录

这个目录和vsftpd.conf中的参user_config_dir配置的路径一致,当前配置的
目录为user_config_dir=/etc/vsftpd/vsftpd_user_conf,所以在/etc/vsftpd路
径下创建vsftpd_user_conf目录。执行:mkdir vsftpd_user_conf

进入vsftpd_user_conf目录,创建与vsftpd_login.txt目录配置的用户名称一样的文件,当前配置的用户为joachiming,所以执行: vi zhuang

加入配置:

anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/home/vsftpd/joachiming
ftpd_banner=This FTP is for the use of authorized users only
anon_other_write_enable=yes

创建数据目录并赋权

配置的joachiming用户数据目录为:/home/vsftpd/joachiming,zhuang用户数据目录为:/home/vsftpd/zhuang,,执行创建目录命令:mkdir -p /home/vsftpd/ding 以及 mkdir -p /home/vsftpd/zhuang 分别创建用户目录

这时候要修改目录的执行权限以及目录所有权,把目录的所有权赋予给虚拟vsftpd用户,执行:chown -R vsftpd:vsftpd /home/vsftpd/ding 以及 chown -R vsftpd:vsftpd /home/vsftpd/zhuang

启动

systemctl start vsftpd.service #启动
systemctl restart vsftpd.service #重启
systemctl status vsftpd.service #查看运行状态

问题

虚拟用户登录的时候提示该用户密码无法登录

问题排查:

1,查看相关日志

/var/log/vsftpd.log

/var/log/auth.log

/var/log/secure

/var/log/audit/audit.log

2,在audit.log中发现SELinux阻止了FTP服务的一些关键操作,具体是因为ftpd_t域没有足够的权限来执行某些操作。

3,解决

设置:

setsebool -P ftpd_full_access on

执行这个命令后,SELinux应该会允许FTP服务执行更多的操作,从而解决你遇到的问题。如果问题仍然存在,请检查其他可能的SELinux布尔值或文件上下文设置。