vsftp 实战之虚拟用户
vsftpd 的用户分为两大类: 匿名用户和具体用户. 具体用户的用户又分为: 系统用户和虚拟用户, 系统用户和虚拟用户只能选择一种方式. 虚拟用户相对于Linux 系统用户而言, 虚拟用户只能通过FTP 协议登录FTP服务器, 不能用于ssh 登录Linux 服务器. 虽然说虚拟用户方式配置复杂, 但是笔者更倾向于使用这种方式, 因为如果使用系统用户的话, 那么根本无需搭建FTP 服务器, 直接通过Wincp 等工具直接登录Linux 服务器操作即可.
我们来搭建一个ftp服务, 供开发组测试组同事使用, 用户及其权限如下:
用户角色 | 用户名 | 根目录 | 可读 | 上传文件 | 新建文件夹 | 删除/重命名 | 跳出主目录 |
---|---|---|---|---|---|---|---|
匿名用户 | anonymous | /var/data/ftp/anon | Y | Y | N | N | N |
开发组管理员 | developAdmin | /var/data/ftp/develop | Y | Y | Y | Y | N |
开发组普通用户 | develop | /var/data/ftp/develop | Y | Y | N | N | N |
测试组管理员 | testAdmin | /var/data/ftp/test | Y | Y | Y | Y | N |
测试组普通用户 | test | /var/data/ftp/test | Y | Y | N | N | N |
超级用户 | superAdmin | /var/data/ftp | Y | Y | Y | Y | Y |
- 用户密码均为: 用户名@123
- 虚拟用户需要一个系统用户作为代理用户,笔者使用admin 用户. 也就是说, 虚拟用户在对文件进行增删改操作时, 相当于admin 用户
1 创建用户目录
注意:
- 使用root 用户创建文件夹
- 将新创建文件所有者和所属组修改为admin, 以保证admin用户对此目录有完全访问权限.因为虚拟用户的代理用户为admin.
- 修改anon 目录权限为777,因为虚拟用户相当于其它人, 所以需要将目录其它人权限设置为7, 这样匿名用户才能进行上传下载文件
[root@localhost ~]# mkdir -p /var/data/ftp/anon /var/data/ftp/develop /var/data/ftp/test
[root@localhost ~]# chown admin:admin /var/data/ftp/anon /var/data/ftp/develop /var/data/ftp/test
[root@localhost ~]# chmod 777 /var/data/ftp/anon
[root@localhost ~]# ll /var/data/ftp/
total 16
drwxrwxrwx. 2 admin admin 4096 Jul 1 19:22 anon
drwxr-xr-x. 2 admin admin 4096 Jul 1 19:22 develop
drwxr-xr-x. 2 admin admin 4096 Jul 1 19:22 test
drwxr-xr-x. 2 admin admin 4096 Jun 20 20:09 wars
[root@localhost ~]#
2. 设置数据源
2.1 创建用户名密码文件
- 文件位置: /etc/vsftpd/vusers.list
- 文件格式: 一行用户名一行密码:
[root@localhost ~]# vim /etc/vsftpd/vusers.list
developAdmin
developAdmin@123
develop
develop@123
testAdmin
testAdmin@123
test
test@123
superAdmin
superAdmin@123
2.2 生成用户名密码数据库文件
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vusers.list /etc/vsftpd/vusers.db
[root@localhost ~]# ls /etc/vsftpd/
ftpusers vsftpd.conf vsftpd.conf.rpmsave vusers.list
user_list vsftpd_conf_migrate.sh vusers.db
[root@localhost ~]#
2.3 配置用户数据源
- 编辑文件: /etc/pam.d/vsftpd
- 将原来内容全部注释, 新添加两行, 注意vusers文件不添加后缀名.db
- 对于required 后饮用的库文件, 64位系统和32位系统不一样, 笔者系统为64位操作系统
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd
#%PAM-1.0
#session optional pam_keyinit.so force revoke
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
#auth include password-auth
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
2.4 创建虚拟用户配置目录
- 将不同用户的具体配置文件存放在/etc/vsftpd/vusers_conf 目录下
- 目录中一个用户对应一个文件,文件名为用户名
[root@localhost ~]# mkdir /etc/vsftpd/vusers_conf
2.5 为不同用户创建不同的配置文件
2.5.1 创建配置文件
为每一个用户创建自己的配置文件, 文件名为用户名
[root@localhost ~]# touch /etc/vsftpd/vusers_conf/develop
[root@localhost ~]# touch /etc/vsftpd/vusers_conf/developAdmin
[root@localhost ~]# touch /etc/vsftpd/vusers_conf/test
[root@localhost ~]# touch /etc/vsftpd/vusers_conf/testAdmin
[root@localhost ~]# touch /etc/vsftpd/vusers_conf/superAdmin
[root@localhost ~]# ls /etc/vsftpd/vusers_conf/
develop developAdmin superAdmin test testAdmin
2.5.2 编辑配置文件
- virtual_use_local_privs 如果设置为YES 则表示此用户拥有和代理的系统用户admin 完全一样的权限.因为笔者设置的用户根目录的所有者和所属组均为admin, 所以如果设置了YES 就代表拥有了对这个目录操作的所有权限.
develop
#设定根目录
local_root=/var/data/ftp/develop
# 设定权限,不拥有和代理系统用于同样的权限
virtual_use_local_privs=NO
#设定写权限
write_enable=YES
#设定权限:可以上传文件
anon_upload_enable=YES
#设定权限:不能新建目录
anon_mkdir_write_enable=NO
#设定权限:不能删除/重命名文件
anon_other_write_enable=NO
#设定权限:可以浏览目录下的文件
anon_world_readable_only=NO
#设定上传文件权限
anon_umask=022
developAdmin
#设定根目录
local_root=/var/data/ftp/develop
#设置虚拟用户拥有和代理系统用户同样的权限
virtual_use_local_privs=YES
#设定上传文件权限
anon_umask=022
test
#设定根目录
local_root=/var/data/ftp/test
# 设定权限,不拥有和代理系统用于同样的权限
virtual_use_local_privs=NO
#设定写权限
write_enable=YES
#设定权限:可以上传文件
anon_upload_enable=YES
#设定权限:不能新建目录
anon_mkdir_write_enable=NO
#设定权限:不能删除/重命名文件
anon_other_write_enable=NO
#设定权限:可以浏览目录下的文件
anon_world_readable_only=NO
#设定上传文件权限
anon_umask=022
testAdmin
#设定根目录
local_root=/var/data/ftp/test
#设置虚拟用户拥有和代理系统用户同样的权限
virtual_use_local_privs=YES
#设定上传文件权限
anon_umask=022
superAdmin
#设定根目录
local_root=/var/data/ftp
#设置虚拟用户拥有和代理系统用户同样的权限
virtual_use_local_privs=YES
#设定上传文件权限
anon_umask=022
3. 配置允许用户跳出主目录的用户列表
- 文件位置: /etc/vsftpd/chroot_list
- 文件格式: 一个用户名一行,此处我们只配置superAdmin 用户.
[root@localhost vsftpd]# vim chroot_list
superAdmin
4. 配置vsftpd 核心配置文件
前面做的都是准备工作, 由/etc/vsftpd/vsftpd.conf 配置文件将前面的操作关联起来
# Example config file /etc/vsftpd/vsftpd.conf
########## 全局配置 ##########
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
userlist_enable=YES
tcp_wrappers=YES
#pasv 传输方式端口上下限
pasv_min_port=61000
pasv_max_port=62000
########## 匿名用户配置 ##########
#开启匿名用户访问
anonymous_enable=YES
#指定匿名用户访问根目录
anon_root=/var/data/ftp/anon
#匿名用户允许上传文件
anon_upload_enable=YES
#匿名用户不允许创建文件夹
anon_mkdir_write_enable=NO
#匿名用户不允许删除/更名文件/文件夹
anon_other_write_enable=NO
#匿名用户代理系统用户
ftp_username=ftp
########## 虚拟用户配置 ##########
#指定pam 服务名称, 和/etc/pam.d 目录下的文件vsftpd 保持一致
pam_service_name=vsftpd
# 开启虚拟用户登录
guest_enable=YES
# 设置虚拟用户代理系统用户名
guest_username=admin
# 设置默认登录路径
local_root=/var/data/ftp/anon
# 设置运行本地用户登录,不设置的话, 虚拟用户不能登录
local_enable=YES
# 设置具体用户配置文件目录
user_config_dir=/etc/vsftpd/vusers_conf
########## 设置跳出目录 ##########
#设置禁止用户跳出主目录
chroot_local_user=YES
#设置允许特殊用户跳出主目录
chroot_list_enable=YES
#设置特殊用户配置文件
chroot_list_file=/etc/vsftpd/chroot_list
5. 启动服务器
[root@localhost vsftpd]# service vsftpd start
Starting vsftpd for vsftpd: [ OK ]
附: 搭建问题
- 确保防火墙关闭或释放了ftp 相关端口
- 确保ftp_home_dir, allow_ftpd_full_access, selinux 配置正确
- 确保虚拟用户代理用户admin 对根目录的权限是否正确.
- 注意虚拟用户名不能使用ftp, 否则会出现意想不到的问题的