zhangguanzhang's Blog

vsftpd虚拟用户简单部署

字数统计: 675阅读时长: 3 min
2017/03/20

安装

关闭防火墙和selinux

1
2
3
systemctl disable --now firewalld NetworkManager
setenforce 0
sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config

安装 vsftpd 和 db4

1
2
3
4
5
yum install -y epel-release && \
yum install -y \
vsftpd \
db4-utils \
db4

创建 vsftpd 使用的系统用户,主目录为 /home/vsftpd,禁止 ssh 登录。创建之后所有虚拟用户使用这个系统用户访问文件

1
useradd vsftpd -d /home/vsftpd -s /bin/false

ubuntu 安装的话:

1
2
3
4
5
6
7
8
9
10
export DEBIAN_FRONTEND=noninteractive
sed -ri 's/[a-zA-Z0-9.]+(debian.org|ubuntu.com)/mirrors.aliyun.com/g' /etc/apt/sources.list
addgroup --system --gid 102 ftp
adduser --system --disabled-login \
--ingroup ftp --no-create-home --home /srv/ftp --gecos "ftp daemon" --shell /bin/false --uid 102 ftp
# 配置文件目录记住
mkdir -p /var/run/vsftpd/empty
apt-get update
apt-get install -y vsftpd

创建虚拟用户名和密码文件并增加一个用户和密码

1
2
3
4
cat>>/etc/vsftpd/loginusers.conf<<EOF
test
test1
EOF

根据这个文件创建数据库文件

1
2
db_load -T -t hash -f /etc/vsftpd/loginusers.conf /etc/vsftpd/loginusers.db
chmod 600 /etc/vsftpd/loginusers.db

设置 pam 文件,启用这个数据库文件

1
2
3
4
5
cp /etc/pam.d/vsftpd{,.bak}
cat>/etc/pam.d/vsftpd<<EOF
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/loginusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/loginusers
EOF

创建虚拟用户配置文件m目录,如果ftp的用户单独设置权限则在这个目录里写同名的文件

1
mkdir /etc/vsftpd/userconf

这里的文件名称必须与虚拟用户名一致

1
2
3
4
cat>/etc/vsftpd/userconf/test<<EOF
local_root=/home/vsftpd/test/
write_enable=YES
EOF

创建用户家目录

1
2
mkdir /home/vsftpd/test
chown vsftpd:vsftpd /home/vsftpd/test

最后备份+修改主配置文件

1
2
cp /etc/vsftpd/vsftpd.conf{,.bak}
vi /etc/vsftpd/vsftpd.conf

禁止匿名

1
anonymous_enable=NO

去掉注释

1
2
3
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES

增加

1
2
3
4
5
6
7
guest_enable=YES
guest_username=vsftpd
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/userconf
allow_writeable_chroot=YES
anon_world_readable_only=NO
reverse_lookup_enable=NO

配置介绍

1
2
3
4
5
6
7
8
9
10
anonymous_enable=NO 禁止匿名用户登录
chroot_local_user=YES 禁止用户访问除主目录以外的目录
ascii_upload_enable=YES ascii_download_enable=YES 设定支持ASCII模式的上传和下载功能
guest_enable=YES 启动虚拟用户
guest_username=vsftpd 虚拟用户使用的系统用户名
virtual_use_local_privs=YES 不然`/home/vsftpd/$USER`目录得设置成777才不会报错`550 Permission denied`
user_config_dir=/etc/vsftpd/userconf 虚拟用户使用的配置文件目录
allow_writeable_chroot=YES 最新版的vsftpd为了安全必须用户主目录(也就是/home/vsftpd/ftp1)没有写权限,才能登录,或者使用allow_writeable_chroot=YES
anon_world_readable_only=NO 解决报错`Transfer done (but failed to open directory)`
reverse_lookup_enable=NO 关闭DNS反向解析,解决登陆慢

启动服务并设置为开机自启

1
systemctl enable --now vsftpd

使用test登陆测试,最后配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@ftp-test vsftpd]# grep -Pv '^$|^#' /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_std_format=YES
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES
guest_username=vsftpd
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/userconf
allow_writeable_chroot=YES
anon_world_readable_only=NO
reverse_lookup_enable=NO

lftp 调试

1
lftp ftp://xxx@10.xx.xx.132:7621 -d
CATALOG
  1. 1. 安装
  2. 2. lftp 调试