奥塔在线:vsftp用户及权限管理体系初探

最近在项目中需要使用FTP服务,原来一般是在windows下安装部署个FileZilla Server就好。但是本次项目没有任何的win系列机器,只有Linux机器,所以对VSFTP服务进行了学习及使用。

在使用期间,总是觉得vsftp的用户及权限管理体系方面的资料太少,有点讳莫如深的感觉,当然也可能是大神们觉得太简单的缘故。所以趁此机会,也搜集整理了不少的相关资料,在这里一起总结写出来。

一般情况下,vsftp包括以下三类用户:

用户类型 说明
本地用户 使用系统本地账号为FTP登录账号进行登录
匿名用户

使用ftp或anonymous账号登录vsftp 

虚拟用户 vsftp创建的访问用户

下面对三类用户及权限配置进行详细说明。

1、本地用户
所谓本地用户,指的是vsftp使用系统本地账号为FTP登录账号,用户在FTP客户端可通过输入本地账号、密码授权登录FTP服务。

奥塔在线:vsftp用户及权限管理体系初探_第1张图片 本地用户认证过程

 从根本来说,本地用户是由系统相关指令管理账号,与vsftp服务具有无关性。添加本地用户常见指令如下:

#添加ftp用户,指定访问路径及不允许进行登陆

useradd ftpa -d /home/myroot/ -g ftps -s /sbin/nologin

#设置用户访问密码

passwd ftpa

其中,/home/myroot为用户登录后的主访问目录,注意查看当前用户是否对主目录有访问权限,否则会导致用户登录后报权限拒绝错误;-s 后面的参数/sbin/false 表示禁止登陆, /sbin/nologin表示禁止用户直接登陆(如通过ssh等方式登录系统)。

本地用户创建完成后,在vsftp默认配置下,应该已经可以正常访问FTP访问。

状态:    正在连接 192.168.0.98:21...
状态:    连接建立,等待欢迎消息...
状态:    不安全的服务器,不支持 FTP over TLS。
状态:    已登录
状态:    读取目录列表...
状态:    列出“/”的目录成功

如果出现访问服务器时报“530 Permission denied.”,那我们还需要对vsftp进行配置后才能正常使用本地用户进行登录。

在/etc/vsftpd目录下,有四个文件,其中三个文件与用户及访问权限配置有关。

奥塔在线:vsftp用户及权限管理体系初探_第2张图片 vsftp用户配置

 在上图中,我们可以看到,/etc/vsftpd目录下有4个文件,他们的定义如下:

 
文件名 说明
ftpusers 拒绝访问名单(黑名单)
user_list 允许访问名单(白名单——具体由主配置文件中userlist前缀对应参数确定)
vsftpd.conf 主配置文件
vsftpd_conf_migrate.sh 文件迁移脚本(兼任老版本,将/etc目录下的FTP相关文件迁移到/etc/vsftpd目录)

首先,我们将新创建的ftpa用户加入user_list文件中。

奥塔在线:vsftp用户及权限管理体系初探_第3张图片 user_list配置

然后,我们对vsftpd.conf中userlist前缀的参数进行配置。

奥塔在线:vsftp用户及权限管理体系初探_第4张图片 主配置文件中userlist参数配置

安装vsftp后,默认的配置参数如上图。此时,我们添加userlist_deny=NO参数,然后我们就可以尝试通过白名单方式进行FTP登陆。

1)用户认证的控制

在vsftpd.conf中,userlist参数是用于对用户进行认证的控制参数。对userlist参数配置说明如下:

  YES NO
userlist_enable 启用userlist配置文件 不启用userlist配置文件
userlist_deny userlist_file参数指定的user_list文件中用户拒绝访问 userlist_file参数指定的user_list文件中用户允许访问

默认的配置文件中,没有包含userlist_deny参数的配置,按照我们的尝试,在没有配置userlist_deny的情况下,userlist_deny将默认为YES,也就是说,此时包含在user_list中的用户将无法通过认证。这也是我们在不做任何配置的情况下,可以使用本地系统账户直接访问FTP的原因。

但是直接使用系统账户进行FTP服务器的访问,可能会有不少的安全风险,所以我们建议必须对FTP用户认证进行控制,也就是在ftpusers和user_list文件中分别添加用户访问黑名单和白名单,降低FTP服务的风险。

#允许本地用户登录

local_enable=YES

#用户登录认证(白名单模式)配置样例

userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list

2)用户主目录控制

奥塔在线:vsftp用户及权限管理体系初探_第5张图片 本地用户登陆成功

本地用户登录到vsftp服务后,用户主访问目录为系统当前账号配置的HOME目录(可通过usermod -d修改用户默认目录);在上图中,我们还可以观察到,默认情况下,本地用户可离开指定的主目录,切换到有权访问的其它目录(有一定的安全风险)。此时,出于安全考虑,我们会要求对当前账号限制访问目录,比如只能看到及操作自己的主目录。

在vsftpd.conf中,以chroot(change root)为前缀的配置项是用于限制访问外部目录的控制参数。

#用户访问目录权限控制样例

chroot_local_user=YES  #所有用户都被限制在其主目录下
chroot_list_enable=NO   #是否允许例外用户

chroot_list_file=/etc/vsftpd/chroot_list  #指定例外用户文件

配置以上参数后,我们再次使用ftpa访问vsftp服务器,就只会看到当前用户主目录数据了。

特别注意的是,我们在对参数进行配置时,YES/NO是大写,同时不允许在后面加空格等字符,否则都可能引起无法启动vsftpd服务的异常。

3月 19 12:22:44 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
3月 19 12:22:44 localhost.localdomain vsftpd[32595]: 500 OOPS: bad bool value in config file for: allow_writeable_chroot
3月 19 12:22:44 localhost.localdomain systemd[1]: vsftpd.service: control process exited, code=exited status=2
3月 19 12:22:44 localhost.localdomain systemd[1]: Failed to start Vsftpd ftp daemon.
3月 19 12:22:44 localhost.localdomain systemd[1]: Unit vsftpd.service entered failed state.
3月 19 12:22:44 localhost.localdomain systemd[1]: vsftpd.service failed.

上面的错误既是在最后不小心按了个空格导致配置参数无效。

为了配合chroot参数,vsftp还提供了另外一个配置文件进行访问目录权限控制。我们新增一个chroot_list文件,文件内容格式与ftpusers、user_list一样,一行一个用户账号。

#创建文件

echo ftpa >> /etc/vsftpd/chroot_list;

同时,我们在vsftpd.conf中做如下配置:

#是否启用将用户限制在主目录

chroot_local_user=YES

#是否允许例外用户

chroot_list_enable=YES

#外部chroot_list文件(例外文件)全路径

chroot_list_file=/etc/vsftpd/chroot_list

CSDN博客上有人对chroot参数进行了详细的说明:vsftpd 配置:chroot_local_user与chroot_list_enable详解

  chroot_local_user=YES chroot_local_user=NO
chroot_list_enable=YES

1.所有用户都被限制在其主目录下

2.使用chroot_list_file指定的用户列表,这些用户作为“例外”,不受限制

1.所有用户都不被限制其主目录下

2.使用chroot_list_file指定的用户列表,这些用户作为“例外”,受到限制

chroot_list_enable=NO

1.所有用户都被限制在其主目录下

2.不使用chroot_list_file指定的用户列表,没有任何“例外”用户

1.所有用户都不被限制其主目录下

2.不使用chroot_list_file指定的用户列表,没有任何“例外”用户

安全提示:对外开放本地账号登陆的情况下,若被黑客破解了账户的信息,就可以畅通无阻地登录FTP服务器,从而可能完全控制整台服务器,安全风险比较高。

2、匿名用户
有时候,我们可能会开放某个目录或某些文件,允许所有用户均可访问,此时进行本地用户的配置就显得没有太大必要。vsftp提供匿名用户来满足这类需求。

一般情况下,匿名用户的登录名为ftp或anonymous;匿名用户不能离开指定的主目录(默认为/var/ftp),且默认权限只能上传不能下载。在Centos系统中,没有anonymous这样的账号存在,理论上应该是映射的ftp账号。

vsftpd服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。需要注意的是,针对匿名用户放开这些权限会带来潜在危险。

匿名用户配置项说明
序号 配置项 参数说明
1 anonymous_enable=[YES|NO] 是否允许匿名用户访问
2 anon_upload_enable=[YES|NO] 是否允许匿名用户上传文件
3 anon_umask=022 匿名用户上传文件的umask值
4 anon_root=/var/ftp 匿名用户的FTP根目录
5 anon_mkdir_write_enable=[YES|NO] 是否允许匿名用户创建目录
6 anon_other_write_enable=[YES|NO] 是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限)
7 anon_max_rate=0 匿名用户的最大传输速率(字节/秒),0为不限制
     

在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空。而且在连接到FTP服务器后,默认访问的是/var/ftp目录。
匿名用户模式是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器,如果对外开放,很可能会被恶意攻击。所以如非必要,建议不要使用该认证模式。 

3、虚拟用户
在FTP使用人员较多时,大批量的通过创建系统账号来访问FTP服务没有意义,也很麻烦;vsftp还支持在vsftp中创建ftp账户来进行FTP的访问,这种用户我们把它称为虚拟用户。
其实虚拟用户也是需要关联一个系统本地用户对系统的目录、文件进行操作,虚拟用户与本地用户是多对一的关系。

虚拟账号创建步骤

1)、建立虚拟账号口令库文件;

#创建账号信息文件
#注意:不要有空行,一行账号 一行密码;奇数行为帐号,偶数行为密码
vi /etc/vsftpd/vuser.list
*************************************************************************
hank
123456
*************************************************************************
#使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件
#可能需要安装相关的工具 yum install db4-utils
db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db
#降低数据库文件的访问权限
chmod 600 /etc/vsftpd/vuser.db
#可删除明文账号信息文件
#一般建议不删除,因为下次新加虚拟用户还需要用到
rm -f /etc/vsftpd/vuser.list

2)、建立虚拟账号所需的PAM配置文件;
PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想。
新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀。

vi /etc/pam.d/vsftpd.vu
*************************************************************************
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser
*************************************************************************

3)、建立虚拟用户所要访问的目录并设置相应权限;

mkdir /home/vroot
chmod -Rf 755 /home/vroot/
useradd -d /home/vroot -s /sbin/nologin -g ftps virtual

4)、设置vsftpd.conf配置文件;
在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu,PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。
默认状态下,pam_service_name=vsftpd。

 vi /etc/vsftpd/vsftpd.conf
*************************************************************************
anonymous_enable=NO     #禁止匿名开放模式
local_enable=YES     #允许本地用户模式
guest_enable=YES     #开启虚拟用户模式
guest_username=virtual    # 指定虚拟用户关联的本地账户
pam_service_name=vsftpd.vu     #指定PAM文件
allow_writeable_chroot=YES     #允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
user_config_dir=/etc/vsftpd/user_conf   #不同的虚拟用户采用不同的配置目录(访问权限、根目录这些配置)
*************************************************************************

5)、对每个虚拟用户配置访问目录及权限
在虚拟用户配置目录下创建以虚拟用户命名的配置文件。配置项样式如下:

local_root=/home/vroot/hank
anon_world_readable_only=NO #匿名用户可以浏览FTP目录和下载文件
anon_umask=022   #由于web页面的特殊性,故单独设置上传文件权限为755,此掩码值可根据具体情况更改
write_enable=YES   #写权限
anon_mkdir_write_enable=YES  #新建目录权限
anon_upload_enable=YES   #上传权限
anon_other_write_enable=YES  #删除/重命名的权限
virtual_use_local_privs=YES  #虚拟用户和本地用户权限相同。很重要,保证虚拟用户有和映射的本地用户相同的权限

需要注意的是,该用户配置文件属性必须是root。

虚拟用户认证模式是上述三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

最后重启你的vsftpd服务。

systemctl restart vsftpd  #centos7x

service vsftpd restart  #centos6x

4、特别注意:

如果在FTP服务正常启动情况下,用户不能访问FTP服务,考虑是否是防火墙问题,把防火墙关闭或者开放21端口应该就可以了;

如果登录失败,提示被拒绝,可以考虑下面的解决方案。

ERROR:530 Permission denied.
#将user_list作为黑名单用户列表(userlist_deny=YES),同时虚拟用户对应的用户不在ftpusers和user_list中。
ERROR:500 OOPS: config file not owned by correct user, or not a file
#虚拟用户的配置文件属性必须要是root。

如果FTP服务登陆成功,但是无法创建目录和写入文件,检查下FTP用户的主目录权限,同时可能是selinux访问权限问题,将selinux关闭即可。

#临时关闭:
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
#永久关闭:
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled

#重启服务reboot

你可能感兴趣的:(Linux)