7.2 自定义配置
7.2.1 限制用户访问位置
在客户端cmd界面中可以看到,当使用Linux系统用户登录到FTP服务器后,是允许跳出用户家目录操作的,这就存在安全风险,所以我们会想,能不能把用户锁定在家目录下,不允许其跳出家目录,这就需要在配置文件中加入如下设置项:
vi /etc/vsftpd/vsftpd.conf ---写入
chroot_local_user=yes ---开启锁定用户在家目录下的功能,即在FTP界面下,把家目录当做根,用pwd可见
allow_writeable_chroot=yes ---允许用户登录后读写
chroot_list_file=/etc/vsftpd/grantUser ---开启一个用户列表文件
chroot_list_enable=yes ---该用户列表文件中的用户允许跳出家目录
然后对应配置文件,创建指定的用户列表文件
cd /etc/vsftpd
vi grantUser 写入指定用户,如:zhang,则重启服务后,zhang允许跳出,结果如下图:
图中可见,因为在grantUser文件中只添加了zhang用户,所以moon用户登录后,pwd可看到是 /,其实是moon用户默认把家目录当根了,则不能够跳出了。但zhang用户登录后pwd可见到真实的绝对路径,所以可跳出家目录操作。
7.2.2 匿名用户上传
我们以匿名用户登录后,会发现,默认就被锁定在登录目录下了,且没有上传权限,若要允许匿名登录后上传,需要做如下配置:
chmod 777 /var/ftp/pub ---放开pub目录的安全权限
注:同Samba、NFS一样,FTP访问也必须遵守访问权限规则:网络权限 和 安全权限 二者以最严格的为准。但是由于匿名用户的默认路径/var/ftp/权限必须为755,其他用户本身就不具备写权限,所以只能在/var/ftp下的pub目录上开启写入功能。
vi /etc/vsftpd/vsftpd.conf ---写入
anon_upload_enable=yes ---开启匿名上传功能,该句仅允许上传文件,不支持上传目录和改名删除
anon_mkdir_write_enable=yes ---允许上传目录
anon_other_write_enable=yes ---允许改名删除
systemctl restart vsftpd
重启服务后,客户端以匿名用户登录后,即有写权限了,但是,仅可以在pub目录下做写入操作。
注:客户端在字符界面下登录,可以使用ftp或anonymous代表匿名用户登录,密码为空。
7.2.3 其他辅助设置
除了以上设置外,配置文件中还可以针对连接数、上传、下载速率做设定,具体如下:
max_clients=100 ---设置最大连接数
max_per_ip=10 ---设置单个客户ip最大连接数
local_max_rate=102400 ---设置系统用户登录后的最大传输速率,单位:BPS
anon_max_rate=81920 ---设置匿名用户的最大传输速率,80KB=81920B
ascii_upload_enable=yes
ascii_download_enable=yes
---开启ascii码编码上传/下载传输
systemctl restart vsftpd
重启服务器,客户端可做验证。
7.3 虚拟用户
由之上实验可知,虽然可以对系统用户、匿名用户实现访问管理,但是问题非常明显,不同用户访问FTP时,访问到的都是不同位置,很难实现资源的统一化分享。并且,客户端使用系统用户访问,必须告知其密码,存在一定安全隐患。用户多了也意味着系统用户增多,也扰乱系统管理。解决以上问题,使用的方案是建立虚拟用户。
建立虚拟用户的思路是:Linux系统中,新建一个系统用户,做ftp专用账号,给该账号建立多个虚拟映射账号,并各自配置密码,针对客户端公开虚拟用户信息,则这些所有的虚拟用户登录到FTP服务器后,其实是同一个系统用户身份,则都访问到同一个目录下了。但客户端却使用的是不同的用户名、密码,且客户并不知道真正的系统用户是谁,更为安全。
7.3.1 虚拟用户配置
实验:
1、新建虚拟用户,生成虚拟用户库文件
cd /etc/vsftpd
mkdir vftp ---创建目录,专用于虚拟用户的管理
cd vftp
vi vusers ---创建虚拟用户记录文件,写入
user1 ---格式:一行用户名,一行密码
123123
user2
456456
user3
789789
db_load -T -t hash -f vusers vusers.db
---生成虚拟用户库文件,库文件必须.db后缀
--- -T 制作库文件 -t 指定加密算法 -f 指定用户记录文件
2、创建系统用户,专用于FTP
useradd -d /mnt/ftp vftp ---新建用户,并指定家目录,该目录即是FTP共享目录
passwd vftp
chmod 755 /mnt/ftp ---设定权限,允许非属主访问
3、建立虚拟用户与系统用户的映射,并设置ftp验证方式为虚拟用户验证
vi /etc/vsftpd/vsftpd.conf
删除匿名用户上传的设置,否则,所有虚拟用户都具备上传功能
写入:
guest_enable=yes ---开启虚拟用户功能
guest_username=vftp ---把虚拟用户映射到系统用户上
allow_writeable_chroot=yes ---虚拟用户默认也把家目录当做根,若之前已写则不需写
vi /etc/pam.d/vsftpd ---编辑验证配置文件
注释或删除所有原内容
写入:
auth required pam_userdb.so db=/etc/vsftpd/vftp/vusers
account required pam_userdb.so db=/etc/vsftpd/vftp/vusers
---指定FTP登录验证时,不使用系统登录验证,而去找用户库文件做验证,指定库文件绝对路径时,文件名是生成的库文件名,但不需要加.db
systemctl restart vsftpd ---重启服务
客户端可以验证,登录ftp时,系统用户不可用,只能使用虚拟用户。且所有虚拟用户登录后,访问点都相同,即/mnt/ftp。
7.3.2 虚拟用户上传
上一节中,我们创建完毕虚拟用户后,客户端可验证到,虚拟用户不支持上传,如果要允许所有虚拟用户都能上传,则需把之前匿名用户上传的代码写入主配置文件,但是若要针对不同的虚拟用户设置不同的权限,则需给每个虚拟用户做专项配置,操作如下:
vi /etc/vsftpd/vsftpd.conf ---写入
user_config_dir=/etc/vsftpd/vftp ---指定虚拟用户的访问配置文件路径
cd /etc/vsftpd/vftp
vi user1 ---针对虚拟用户名,创建配置文件,文件名即用户名
anon_world_readable_only=yes ---允许虚拟用户访问默认目录
write_enable=yes ---开启写权限
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
vi user2 ---可再针对user2做配置,本实验中暂不设置。
systemctl restart vsftpd
服务重启后,客户端登录可验证user1登录后有上传权限,其他用户登录后没有上传权限。
若变更虚拟用户设置,可以从新生成虚拟用户库文件,再重启vsftpd服务即可。
说明:虽然虚拟用户访问FTP时是映射到系统用户的,但是作为Linux系统来讲,虚拟用户仍然算作来宾用户,即guest,仍然按匿名用户的权限做限制,并且虚拟用户访问后,把默认访问点当做根,即不允许跳出默认目录做操作。