vsftpd是一个比较稳定的FTP服务软件,它提供的FTP服务可以根据具体的业务需要灵活的配置为匿名访问、本地用户访问和虚拟用户访问。其中安全性最高的是虚拟用户访问方式,本文就搭建并配置一个虚拟用户访问的FTP服务器。
匿名访问让所有人都可以上传文件到服务器上而无需鉴权,因此安全性不高,本地用户方式安全性高于匿名访问方式,可是没有虚拟用户访问方式安全,因此建议大家如果在生产环境中配置FTP最好使用虚拟用户模式。
1.安装ftp客户端
:notebook: 以下操作都在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
开启vsftpd服务
systemctl start vsftpd
查看服务是否正常运行
systemctl status vsftpd
4.清空默认的防火墙规则
iptables -F
查看一下
iptables -L
默认规则已经被清除了,然后再保存一下这个空规则。
service iptables save
5.创建一个虚拟用户用来登录FTP
什么是虚拟用户呢?也就是linux系统中能够实现某能力,而无法像普通用户那样登录系统的用户,这样做就提高了系统的安全性。
查看一下我们初装的系统有哪些用户吧?
vim /etc/passwd
看到没,除了root用户还有我们安装系统时指定的普通用户是不是还有一堆你不认识的用户啊?系统之所以能够完成各种系统功能,当然少不了这些虚拟用户的功劳:smile:
好了为我们的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
这一步非常重要,如果没有指定虚拟用户默认登录的shell的话会出现Error EElFTPSUnacceptedReplyError: Unaccepted server reply (error code is 530)
的报错,这个错误排查起来非常困难。
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
:notebook: 上述操作完成后就生成了数据库文件,而vuser.list
是明文的。
将vuser.list
文件删除。
rm -rf /vuser.list
7.建立支持虚拟用户的PAM认证文件
vim /etc/pam.d/
输入以下的内容
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=
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vusers_dir
参数名 | 作用 |
---|---|
anonymous_enable=NO | NO|禁止匿名开放模式<br />YES|开启匿名开放模式 |
local_enable=YES | NO|不允许本地用户模式<br />YES|允许本地用户模式 |
guest_enable=YES | 开启虚拟用户模式 |
guest_username=virtual | 指定虚拟用户帐号 |
pam_service_name= | 指定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=
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/html/ftp
注意/var/www/html/ftp
的属主和属组,以及文件夹属性是否为755,否则会出现无法新建文件夹的情况
然后在配置文件中指定用户独立的权限配置文件的存放目录。
vim /etc/vsftpd/vsftpd.conf
添加
user_config_dir=/etc/vsftpd/vuser_dir
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
使用软件验证。
大家看到虚拟用户的使用方便之处没有?如果想再加用户只需要
- 添加虚拟用户并设置虚拟用户的主目录及密码
- 将虚拟用户名、密码添加到用户数据库
- 在
vusers_list
目录(此目录是你在主配置文件中配置的)添加和虚拟用户同名的文件,只要在这个文件中写入相应的配置就OK了。
好了,本教程就到这了,如果有问题可以留言给我。