说明:
– vsftpd的版本:vsftpd-3.0.2-29.el7_9.x86_64
– ftp根目录:/var/www
– ftp 配置文件目录:/etc/vsftpd
– ftp 虚拟用户权限配置文件目录:/etc/vsftpd/user_conf
实现目标:
– 匿名用户可以登录,但是不能访问虚拟用户的宿主目录,只能访问共享目录
– 虚拟用户对自己的宿主目录有任何权限,且只能在自己宿主目录中操作
搭建过程
1. 安装vsftpd,ftp和libdb-utils(需要安装db包,用来加密虚拟用户的账号信息,centos7已经安装好了)
#阿里云服务器默认安装,此处可忽略
[root@CentOS ~]# yum install -y vsftpd ftp
- 创建本地用户(用于映射虚拟用户)
# 建立ftp用户目录
[root@CentOS ~]# mkdir -p /var/www/test.com
# 创建用户
[root@CentOS ~]# useradd -d /var/www/ vsftp -s /sbin/nologin
# 更改权限和主组权限
[root@CentOS ~]# chmod 755 /var/www/
[root@CentOS ~]# chown vsftp.vsftp /var/www/ -R
- 修改配置文件
[root@CentOS ~]# cd /etc/vsftpd
[root@CentOS ~]# mv vsftpd.conf vsftpd.conf.bak
[root@CentOS ~]# vim /etc/vsftpd/vsftpd.conf
# 不允许匿名用户访问
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
#修改ftp默认端口(涉及等保和网络安全检查会扫描默认的21端口,所以修改端口号)
listen_port=1802
# 限制pasv的打开端口范围(不开这个ftp客户端连不上)
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10010
# 修改ftp默认目录
chroot_local_user=YES
local_root=/var/www/test.com
anon_root=/var/www/test.com
anon_umask=022
# pam认证文件,注意下列值要跟第5步文件名一致
pam_service_name=vsftpd
#虚拟用户权限配置目录
user_config_dir=/etc/vsftpd/user_conf
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YES
one_process_model=NO
#开启虚拟用户
guest_enable=YES
guest_username=vsftp
- 创建存储虚拟用户的文件
[root@CentOS ~]# mkdir /etc/vsftpd/user_conf/
[root@CentOS ~]# cd /etc/vsftpd/user_conf
[root@CentOS ~]# vim xxx
# 设置登录后禁锢的目录
local_root=/var/www/test.com
# 开放写权限
write_enable=yes
# 开放下载权限
anon_world_readable_only=no
# 开放上传权限
anon_upload_enable=yes
# 开放创建目录的权限
anon_mkdir_write_enable=yes
# 开放删除和重命名的权限
anon_other_write_enable=yes
- 生成数据库文件并创建PAM认证文件
[root@CentOS ~]# cd /etc/vsftpd/
[root@CentOS ~]# vim virtusers
xxx
gF9@@rH1%hxxyyyyyxxxxxxxxx22;8~
[root@CentOS ~]# db_load -T -t hash -f virtusers virtusers.db
[root@CentOS ~]# chmod 600 virtusers.db
[root@CentOS ~]# cd /etc/pam.d/
[root@CentOS ~]# mv vsftpd vsftpd.bak
[root@CentOS ~]# vim /etc/pam.d/vsftpd
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
- 启动vsftpd服务
[root@CentOS ~]# systemctl start vsftpd
[root@CentOS ~]# systemctl enable vsftpd
- 更改虚拟用户目录权限
[root@CentOS ~]# mkdir /var/ftp/admin && chmod 700 /var/ftp/admin
[root@CentOS ~]# mkdir /var/ftp/user && chmod 700 /var/ftp/user
[root@CentOS ~]# chown -R vsftp.root /var/ftp
- 测试访问
[root@CentOS ~]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): xxx
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit
221 Goodbye.
- 添加新用户(不需要重启vsftpd服务)
[root@CentOS ~]# vim /etc/vsftpd/vuser_list
admin
123456
user
123456
test
123456
#创建test用户对应的目录并授权
[root@CentOS ~]# mkdir /var/ftp/test && chown vsftp:root /var/www/test
#重新生成加密的db文件
[root@CentOS ~]# cd /etc/vsftpd
[root@CentOS ~]# db_load -T -t hash -f vuser_list vuser_list.db
# 删除用户就是把添加用户的操作撤销,然后删除加密的db文件重新生成即可。
# 测试访问,此时添加的test用户的/var/ftp/test目录的权限是755,匿名用户可以登录。若要屏蔽,修改权限为700即可。
- 问题处理
– 报错1:226 Transfer done (but failed to open directory)
解决:关闭selinux和防火墙
– 报错2:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解决:配置文件中加入 allow_writeable_chroot=YES 针对标准vsftpd(standonly)模式,然后重启ftp。
- vsftp上传文件权限问题
file_open_mode上传档案的权限,与chmod 所使用的数值相同。如果希望上传的文件可以执行,设此值为0777。
默认情况下vsftp上传之后文件的权限是600,目录权限是700
* local_umask=xxx这是指定本地用户上传后的文件权限设置
* anon_umask=xxx这是指定虚拟用户上传后的文件权限设置
* umask是unix操作系统的概念,umask决定目录和文件被创建时得到的初始权限
* umask = 022时,新建的目录 权限是755,文件的权限是 644
* umask = 077时,新建的目录 权限是700,文件的权限时 600