@TOCvsftpd是一个比较稳定的FTP服务软件,它提供的FTP服务可以根据具体的业务需要灵活的配置为匿名访问、本地用户访问和虚拟用户访问。其中安全性最高的是虚拟用户访问方式,本文就搭建并配置一个虚拟用户访问的FTP服务器。

匿名访问让所有人都可以上传文件到服务器上而无需鉴权,因此安全性不高,本地用户方式安全性高于匿名访问方式,可是没有虚拟用户访问方式安全,因此建议大家如果在生产环境中配置FTP最好使用虚拟用户模式。
1.安装ftp客户端

📓 以下操作都在root用户下,当然也可以使用sudo,如果你在生产服务器上部署还是建议使用sudo.

在centos8.5中并没有默认安装ftp的客户端,为了方便后续的测试我们先安装一个ftp客户端。

yum install -y ftp

2.安装iptables.service

在centos8.5中没有默认安装iptables.service这将导致iptables的设置无法保存,系统重启后iptables又自动恢复了。而我们在配置vsftpd服务器需要先将iptables清空一下。

yum install -y iptables-services.x86_64

3.安装vsftpd
要配置vsftpd当然先安装该软件,我使用的是阿里的yum源,安装非常的简单,交给我们的“大黄”就办了。

yum install -y vsftpd

vsftpd安装成功之后,不要忘记添加开机自启动。

systemctl enable vsftpd

如果出现如下信息说明添加开机自启动成功。

Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.

查看一下vsftpd安装包的详细信息

rpm -qi vsftpd

centos8配置ftp服务器 centos8 ftp服务_虚拟用户


开启vsftpd服务

systemctl start vsftpd

查看服务是否正常运行

systemctl status vsftpd

centos8配置ftp服务器 centos8 ftp服务_linux_02


4.清空默认的防火墙规则

iptables -F

查看一下

iptables -L

centos8配置ftp服务器 centos8 ftp服务_虚拟用户_03


默认规则已经被清除了,然后再保存一下这个空规则。

service iptables save

centos8配置ftp服务器 centos8 ftp服务_linux_04


5.创建一个虚拟用户用来登录FTP

什么是虚拟用户呢?也就是linux系统中能够实现某能力,而无法像普通用户那样登录系统的用户,这样做就提高了系统的安全性。

查看一下我们初装的系统有哪些用户吧?

vim /etc/passwd

centos8配置ftp服务器 centos8 ftp服务_运维_05


看到没,除了root用户还有我们安装系统时指定的普通用户是不是还有一堆你不认识的用户啊?系统之所以能够完成各种系统功能,当然少不了这些虚拟用户的功劳😄

好了为我们的FTP创建一个虚拟用户吧。

我打算在我的系统上部署一个论坛程序,当然少不了用户上传头像、图片之类的功能了,所以我把虚拟用户的家目录指定为/var/www/ftp,当然虚拟用户访问的FTP主目录是可以通过配置文件来设置的。这里我们先这么创建着。

如果/var/www文件夹不存在,先创建一下。

mkdir -p /var/www
useradd -d /var/www/ftp -s /sbin/nologin ftpuser

上述命令通过-s /sbin/nologin创建了一个无法登录系统的用户,并通过 -d /var/www/ftp指定了这个用户的家目录为` /var/www/ftp。查看一下

ls -ld /var/www/ftp

ftp文件夹赋权

chmod -R 755 /var/www/ftp

若出现如下信息说明赋权限成功

ls -ld /var/www/ftp
drwxr-xr-x. 5 ftpuser ftpuser 103 Dec 18 13:55 /var/www/ftp

如果出现权限提示的话首先检查文件夹的用户和属组,以及文件夹属性是否为755

创建ftpuser的密码

passwd ftpuser

密码创建成功(此处我使用了弱密码,如果是生产环境千万不可)

[root@localhost www]# passwd ftpuser
Changing password for user ftpuser.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.

为虚拟用户指定登录的默认shell

echo "/sbin/nologin" >> /etc/shells

centos8配置ftp服务器 centos8 ftp服务_虚拟用户_06

这一步非常重要,如果没有指定虚拟用户默认登录的shell的话会出现Error EElFTPSUnacceptedReplyError: Unaccepted server reply (error code is 530)的报错,这个错误排查起来非常困难。

centos8配置ftp服务器 centos8 ftp服务_linux_07

6.创建虚拟FTP用户数据库文件

cd /etc/vsftpd
vim vuser.list

vuser.list文件中写入如下信息

ftpuser
aaaaaa

其中单数行为账号,双数行为该账号的密码。

使用db_load命令用HASH算法生成FTP用户数据库文件vuser.db

db_load -T -t hash -f vuser.list vuser.db

查看vuser.db中的内容

db_dump -d a vuser.db

如果我们需要添加新的虚拟用户向vuser.db中添加新的用户名密码

重新编辑vuser.list文件,在这个文件中加入新的用户名和密码,然后运行命令

db_load -T -t hash -f vuser.list vuser.db

就会把新的用户名密码追加到vuser.db中去了。

vuser.db赋600权限。

chmod 600 vuser.db

📓 上述操作完成后就生成了数据库文件,而vuser.list是明文的。

vuser.list文件删除。

rm -rf /vuser.list

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

vim /etc/pam.d/vsftpd.vu

输入以下的内容

auth    required        pam_userdb.so   db=/etc/vsftpd/vuser
 account required        pam_userdb.so   db=/etc/vsftpd/vuser

8.配置vsftpd.conf

vim /etc/vsftpd/vsftpd.conf

配置信息如下

anonymous_enable=NO
local_enable=YES
guest_enable=YES
pam_service_name=vsftpd.vu
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vusers_dir

参数名

作用

anonymous_enable=NO

NO|禁止匿名开放模式

YES|开启匿名开放模式

local_enable=YES

NO|不允许本地用户模式

YES|允许本地用户模式

guest_enable=YES

开启虚拟用户模式

guest_username=virtual

指定虚拟用户帐号

pam_service_name=vsftpd.vu

指定pam文件

allow_writeable_chroot=YES

允许禁锢的FTP根目录可写而不拒绝用户登入请求

开启PAM模块并配置FTP被动模式的端口。(这个端口范围要在防火墙上打开的,所以根据应用情况尽量范围小些)

pam_service_name=vsftpd
pasv_min_port=30001
pasv_max_port=30010

我最终的配置文件如下

anonymous_enable=NO
local_enable=YES
guest_enable=YES
pam_service_name=vsftpd.vu
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vusers_dir
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
pasv_min_port=30001
pasv_max_port=30010
userlist_deny=YES
userlist_enable=YES

9.为虚拟用户设置不同的权限
虚拟用户的默认权限都是不能上传、创建、修改文件的,要通过以下的用户权限配置为每个虚拟用户加权。

新建 /etc/vsftpd/vusers_dir,并新建一个和虚拟用户同名的文件,用来设置虚拟用户的权限

mkdir /etc/vsftpd/vusers_dir
cd /etc/vsftpd/vusers_dir
vim /etc/vsftpd/vusers_dir/ftpuser

添加如下内容

guest_username=ftpuser
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
write_enable=YES
local_root=/var/www/ftp
anon_umask=0002

注意/var/www/ftp的属主和属组,以及文件夹属性是否为755,否则会出现无法新建文件夹的情况

然后在配置文件中指定用户独立的权限配置文件的存放目录。

vim /etc/vsftpd/vsftpd.conf

10.打开防火墙相关的端口

firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --zone=public --add-port=20/tcp --permanent
firewall-cmd --zone=public --add-port=30000-30010/tcp --permanent
firewall-cmd --reload

11.设置selinux相关权限

setsebool -P allow_ftpd_full_access on
setsebool -P tftp_home_dir on

12.重启vsftpd验证

systemctl restart vsftpd
ftp localhost

centos8配置ftp服务器 centos8 ftp服务_centos8配置ftp服务器_08


使用软件验证。

centos8配置ftp服务器 centos8 ftp服务_运维_09


大家看到虚拟用户的使用方便之处没有?如果想再加用户只需要

  1. 添加虚拟用户并设置虚拟用户的主目录及密码
  2. 将虚拟用户名、密码添加到用户数据库
  3. vusers_list目录(此目录是你在主配置文件中配置的)添加和虚拟用户同名的文件,只要在这个文件中写入相应的配置就OK了。