服务器搭建目前采用最多的还是VSFTP服务器,对于公司来讲,很多时间都会需要很多用户,而且针对不同的用户还会有不用的操作权限,如果全部创建为真实的linux用户肯定不是一个很好的选择,所以这时候就会用到虚拟用户的创建
创建虚拟用户的过程如下:
1. 分别创建vsftpd服务的宿主用户vsftpuser和虚拟用户的宿主用户virtualuser,命令如下所示:
useradd vsftpuser -s /usr/sbin/nologin
useradd virtualuser -s /usr/sbin/nologin
-s /usr/sbin/nologin意思是指不允许登录
2. 创建虚拟用户数据文件
cd /etc/vsftpd
vi vftpuser.txt
创建vsftpuser.txt文件存储虚拟用户的用户名和密码
vftpuser.txt文件格式为一行用户名一行密码,格式如下:
username1
password1
username2
password2
...
...
然后再使用db_load将虚拟用户文件vsftpuser.txt转成系统可识别的db文件,命令如下所示:
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db
如果遇到db命令不可用的情况下,请安装db_load软件,具体安装方式可自行google
最后再修改文件权限,防止其他非法用户获取用户信息
chmod 600 /etc/vsftpd/vftpuser.*
3. 通过配置PAM模块对客户端身份进行认证
PAM(Plugable Authentication Module)为可插拔认证模块,不必重新安装应用系统,通过修改指定的配置文件,调整对该程序的认证方式
PAM模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量与认证有关的配置文件,并以服务名称命名,比如说vsftp的配置文件全路径为 /etc/pam.d/vsftp,找到该文件后,修改文件配置项,文件配置项及配置方式如下所示:
# 对用户名口令进行验证,参与验证的模块是pam_userdb.so,参与验证的文件是/etc/vsftpd/vftpuser
auth sufficient /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/vftpuser
# 对用户的帐户有哪些权限哪些限制进行验证
account sufficient /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/vftpuser
# sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了。
# 相反,如果没有通过的话,也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核
required 和 sufficient:sufficient如果验证不通过,就继续往下验证,required是必须的,验证不通过就不往下验证
最终配置文件样式:
# Standard behaviour for ftpd(8).
# 首先验证不可登录的用户
auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.
# 验证虚拟用户
auth sufficient /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/vftpuser
account sufficient /lib/x86_64-linux-gnu/security/pam_userdb.so db=/etc/vsftpd/vftpuser
# Standard pam includes
# 验证本地用户
@include common-account
@include common-session
@include common-auth
auth required pam_shells.so
配置文件的话,本来就是存在的,需要做的只是要可以读懂配置文件内容,然后根据个人的一些需求进行修改
4. 修改VSFTPD的配置文件etc/vsftpd.conf文件
大部分配置正常来说不需要修改的,下面列出虚拟用户用到的一些必须的配置项
# 设置为vsftpd服务的宿主用户
nopriv_user=vsftpuser
# 指向PAM的vsftpd文件
pam_service_name=vsftpd
# 允许guest用户
guest_enable=YES
# 指向宿主用户
guest_username=virtualuser
# 允许虚拟用户的权限和本地用户权限一样
virtual_use_local_privs=YES
# 虚拟用户配置路径
user_config_dir=/etc/vsftpd/user_config
5. 最后根据不同用户进行个性化配置
vsftpd.conf中配置的user_config_dir配置的是虚拟用户的配置路径,根据配置找到对应的路径/etc/vsftpd/user_config,如果没有则创建;
然后在路径下根据之前在虚拟用户数据库配置文件vftpuser.txt中定义的用户名来创建对应的配置文件,比如之前定义的用户名为chris,那么这里创建的用户配置文件全路径为/etc/vsftpd/user_config/chris
用户的主要配置内容如下:
# 虚拟用户是否和本地用户拥有同样的权限
virtual_use_local_privs=YES
# 用户登入FTP时的初始路径
local_root=/home/ftp
# 是否可写
write_enable=YES
# 虚拟用户只读
anon_world_readable_only=NO
# 虚拟用户是否可以上传文件
anon_upload_enable=YES
下面是一些配置项以及相关的作用:
# 设置是否启用chroot_list_file配置项指定的用户列表文件。默认值为NO
chroot_list_enable=YES/NO(NO)
# 用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录
chroot_list_file=/etc/vsftpd.chroot_list
# 用于指定用户列表文件中的用户是否允许切换到上级目录。默认值为NO
chroot_local_user=YES/NO(NO)
通过搭配能实现以下几种效果:
a. 当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd.chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录
b. 当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd.chroot_list文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录
c. 当chroot_list_enable=NO,chroot_local_user=YES时,所有的用户均不能切换到其他目录
d. 当chroot_list_enable=NO,chroot_local_user=NO时,所有的用户均可以切换到其他目录
virtual_use_local_privs参数:
a. 当 virtual_use_local_privs=YES时,虚拟用户和本地用户有相同的权限
b. 当virtual_use_local_privs=NO 时,虚拟用户和匿名用户有相同的权限,默认是NO
c. 当virtual_use_local_privs=YES,write_enable=YES时,虚拟用户具有写权限(上传、下载、删除、重命名)
d. 当 virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=YES,anon_upload_enable=YES 时,虚拟用户不能浏览目录,只能上传文件,无其他权限
e. 当 virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,anon_upload_enable=NO 时,虚拟用户只能下载文件,无其他权限
f. 当 virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,anon_upload_enable=YES 时,虚拟用户只能上传和下载文件,无其他权限
g. 当 virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,anon_mkdir_write_enable=YES 时,虚拟用户只能下载文件和创建文件夹,无其他权限
h. 当 virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,anon_other_write_enable=YES 时,虚拟用户只能下载、删除和重命名文件,无其他权
allow_writeable_chroot=YES 解决 500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
这些配置可以选择配置到/etc/vsftpd/user_config路径下,也可以选择配置到/etc/vsftpd.conf文件中,区别是一个针对单个用户,一个针对所有用户,所以可以根据需要自己进行判断和选择。
所有配置完成后重启即可。