Centos7.x安装FTP文件传输服务之vsftp,并配置使用虚拟用户

185 次查看 0 条评论

本次实验系统版本为CentOS Linux release 7.6.1810 (Core) 64位操作系统:

47220-r7cm57q1m8.png

1、使用 yum 安装 vsftpd

1.1、首先配置SELINUX为宽松模式避免莫名奇妙的问题,开放防火墙相关端口:

# 配置SELINUX为宽松模式
[root@centos ~]# setenforce 0
# 防火墙发行端口
[root@centos ~]# firewall-cmd --permanent --zone=public --add-port=20-21/tcp
# 重载配置
[root@centos ~]# firewall-cmd --reload
# 查看放行端口
[root@centos ~]# firewall-cmd --list-ports

1.2、开始执行安装

# 检查是否已经安装
[root@centos ~]# rpm -qa | grep vsftpd
# 安装ftp服务端、客户端,客户端可选择性安装
[root@centos ~]# yum install -y vsftpd ftp
# 启动vsftp服务
[root@centos ~]# systemctl start vsftpd.service
# 配置系统shell列表
[root@centos ~]# echo "/sbin/nologin" >> /etc/shells

这时候便已经可以使用匿名用户登录到这个FTP服务器了。匿名用户anonymous默认映射为 ftp 这个系统用户。匿名用户密码为空。

73719-px9gj2ajxqs.png

相关安装信息查看:

# 安装的包版本
[root@centos ~]# rpm -qa | grep vsftpd
vsftpd-3.0.2-25.el7.x86_64
# 查看安装的相关路径
[root@centos ~]# rpm -ql vsftpd-3.0.2-25.el7.x86_64

1.3、报错排查:

500 OOPS: vsftpd: cannot locate user specified in 'ftp_username':ftp

这个通常是匿名用户对用的 ftp 这个系统不存在(可能被删除了),添加上即可。

其实使用 yum 安装 vsftp 是会自动创建ftp用户(之前安装创建过ftp账户,然后删除再安装vsftp貌似不会再自动创建了):

# 添加一个ftp组,并指定组GID为50
[root@centos ~]# groupadd --gid 50 ftp
# 添加一个ftp的用户,并加入ftp组
# 指定/var/ftp为其主目录
# 指定其/sbin/nologin为其shell
# 给用户添加FTP User备注信息
[root@centos ~]# useradd -g ftp ftp -M -d /var/ftp -s /sbin/nologin --comment "FTP User"

34307-jfkfwb2zkus.png

现在匿名用户应该能正常登录了。此时匿名用户只能下载不能上传。需要匿名用户可以上传请继续参阅本文扩展vsftp配置介绍章节。

530 Login incorrect.

由于vsftp配置文件 /etc/pam.d/vsftpdauth required pam_shells.so 配置项的含义为仅允许用户的shell为 /etc/shells
文件内的shell命令时,才能够成功。而创建ftp用户时,为了禁止ssh登录,一般多为/bin/false 、/usr/sbin/nologin 等,显然不是一个有效的bash,也就无法登录了。解决办法:

[root@centos ~]# echo "/sbin/nologin" >> /etc/shells

2、使用本地用户认证,最小配置 vsftp 工作

2.1、开启本地 root 账户允许登录ftp服务

编辑 vim /etc/vsftpd/ftpusers 文件,将 root注释起来。这个文件中的用户会被拒绝ftp登录。到这里 root 用户已经能正常登录ftp服务。

50350-855pbk3wx74.png

2.2、添加其他本地账户以其登录ftp服务:

# 添加一个Jack用户
# 加入ftp用户组
# 指定目录/var/ftp/Jack为其主目录
# 指定shell为/sbin/nologin,及用户不能shell登录
# 添加用户备注(FTP User)
[root@centos ~]# useradd Jack -g ftp -d /var/ftp/Jack -s /sbin/nologin --comment "FTP User"
# 为用户Jack设置密码
[root@centos ~]# echo "123456" | passwd --stdin Jack
# 允许shell为/sbin/nologin用户登录ftp,少了这个会报:530 Login incorrect错误
[root@centos ~]# echo "/sbin/nologin" >> /etc/shells

82709-1n9co6g319l.png

3、配置使用虚拟用户

3.1、首先启用虚拟用户功能,在主配置文件 /etc/vsftpd/vsftpd.conf 添加或修改如下内容:

pam_service_name=vsftpd
guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/virtual_users
virtual_use_local_privs=YES

3.2、然后在参数 user_config_dir 指定目录下创建虚拟用户对应配置文件(文件名及是虚拟用户账号)

[root@centos ~]# mkdir /etc/vsftpd/virtual_users
[root@centos ~]# vim /etc/vsftpd/virtual_users/ftpuser1

3.3、在 /etc/vsftpd/virtual_users/ftpuser1 文件中按如下格式写入虚拟用户权限相关配置:

# 虚拟用户主目录
local_root=/var/ftp/ftpuser1
# 登陆用户有写权限
write_enable=YES
# 允许主目录可写
allow_writeable_chroot=YES
# 匿名用户读权限
anon_world_readable_only=YES
# 允许匿名用户上传(write_enable开启时时有效)
anon_upload_enable=YES
# 允许匿名允许创建目录
anon_mkdir_write_enable=YES
# 允许匿名用户其他权限,例如删除、重命名等
anon_other_write_enable=YES

创建对应目录,并授权:

[root@centos ~]# mkdir -pv /var/ftp/ftpuser1
[root@centos ~]# chown -R ftp:ftp /var/ftp/ftpuser1

更多用户依次类推。

3.4、生成虚拟用户认证文件

首先安装Berkeley DB工具,用于生成虚拟用户认证数据库文件:

# centos7.x
[root@centos ~]# yum install -y libdb-utils
# centos6.x
[root@centos ~]# yum install -y db4 db4-utils

生成认证数据库文件,首先创建一个临时文件,里面按奇、偶数行分别写入认证需要的用户名和密码。然后使用 db_load 工具从该文件生成数据库文件:

#  生成临时文件
[root@centos ~]# touch /etc/vsftpd/vuser_passwd_temp.txt
# 将2个账号及对应密码写入/etc/vsftpd/vuser_passwd_temp.txt文件
[root@docker ~]# cat >> /etc/vsftpd/vuser_passwd_temp.txt <<EOF
ftpuser1
123456
ftpuser2
123456789
EOF
# 使用临时文件内容生成数据库文件
[root@centos ~]# db_load -T -t hash -f /etc/vsftpd/vuser_passwd_temp.txt /etc/vsftpd/vuser_pass.db
# 选择性删除临时文件
[root@centos ~]# rm -f /etc/vsftpd/vuser_passwd_temp.txt

56100-vnoyp5gan3i.png

修改 /etc/pam.d/vsftpd 文件,将原内容全部注释掉增加以下两行:

# 根据上面数据库路径适当修改路径
auth required pam_userdb.so db=/etc/vsftpd/vuser_pass
account required pam_userdb.so db=/etc/vsftpd/vuser_pass

88105-vq2s3gkdg9o.png

配置完毕,重启vsftpd服务后测试使用虚拟用户登录:

4、扩展 vsftp 配置介绍

编辑修改主配置文件 vim /etc/vsftpd/vsftpd.conf ,根据需求适当修改如下参数:

匿名用户相关配置:

anonymous_enable=YES #匿名用户开关
anon_root=/var/ftp/ #匿名用户主目录
anon_upload_enable=YES #是否允许匿名用户上传
anno_mkdir_write_enable=YES #是否允许匿名用户可创建目录及其文件
anno_other_write_ebable=YES #匿名用户是否除了写权限是否拥有删除和修改的权限
anno_umask=077 #匿名用户创建文件的掩码权限

目录限制相关权限:

chroot_local_user=YES #禁锢所有ftp用户在其家目录下
# 允许主目录写权限(解决:500 OOPS: vsftpd: refusing to run with writable root inside chroot()报错)
allow_writeable_chroot=YES

本地用户相关权限配置:

## 用户、特权相关配置 
local_enable=YES #允许本地用户登录
write_enable=YES #允许本地用户写入
local_umask=022 #本地用户上传或创建文件时的权限
userlist_enable=NO
userlist_deny=YES #配置userlist_file参数指定文件为白名单还是黑名单,YES白名单/NO黑名单
userlist_file=/etc/vsftpd/user_list #注意文件/etc/vsftpd/ftpusers中的用户也不允许FTP登录
chroot_list_enable=NO #不允许任何例外用户漂移出主目录
chroot_list_file=/etc/vsftpd/chroot_list #这个参数指定文件中用户可以漂移出主目录

日志相关配置:

xferlog_file=/var/log/vsftpd.log #日志文件路径设置
xferlog_enable=YES #是否记录ftp传输过程
use_localtime=YES #使用本地时间

这里配置的权限的前提是匿名或本地用户有对应目录权限。

默认匿名目录授权:

[root@centos ~]# chown -R ftp /var/ftp/
[root@centos ~]# chmod -R 777 /var/ftp/

5、配置 PASV 被动模式

所谓被动模式,指的是FTP服务器“被动”等待客户端来连接自己的数据端口,其过程具体是:当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。(注意此模式下的FTP服务器不需要开启tcp 20端口了)

配置 vsftp 开启被动模式及,指定被动模式端口范围(为了保证传输稳定,请至少保证20个端口范围):

pasv_enable=YES
pasv_min_port=33000
pasv_max_port=34000

配置防火墙放行vsftp被动端口:

[root@centos ~]# firewall-cmd --permanent --zone=public --add-port=33000-34000/tcp
[root@centos ~]# firewall-cmd --reload

6、卸载vsftp软件

[root@centos ~]# yum remove vsftpd
[root@centos ~]# rm -rf /etc/vsftpd/
[root@centos ~]# rm -rf /var/ftp/
[root@centos ~]# rm -rf /usr/share/doc/vsftpd*
[root@centos ~]# userdel -rf ftp

7、使用Docker搭建vsftp

使用容器搭建可以避免污染宿主环境。使用centos镜像启动一个容器,在这个容器中搭建vsftp服务:

[root@centos ~]# docker run -itd --name centos --hostname vsftp --net=mcvlan --ip=192.168.1.11 --privileged centos:latest /usr/sbin/init

之后进入容器按上述步骤操作即可。


相关文章:

  1. Ubuntu安装vsftpd并配置使用虚拟用户
  2. ubuntu vsftpd 530 Login incorrect 根本原因和解决方案
CentOS FTP

暂无评论