天天看点

Vsftpd使用虚拟用户,访问FTP

由于需要,公司网站目录需要把上传权限开通,并且同一个目录需要不同的人给与不同的权限。但是上传只能通过ftp进行上传。而网站服务器上的ftp服务器使用的是vsftpd。

具体要求如下:

网站根目录/www,对用户ailanni具有所有权,能上传、下载、删除、创建目录权限。对bilanni用户具有下载、浏览权限。其他用户直接跳转到ftp公共目录下。

根据这个要求我们需要使用到vsftpd的虚拟用户。

vsftp虚拟用户的原理是:把虚拟用户的权限映射到系统用户上。而虚拟用户的权限是有系统用户对目录的控制达到的。

如果安装上述要求的话,我们的思路是这样的。

在系统中新建用户ailanni,使其对/www目录具有所有权。而修改其用户组,使其用户组对/www目录只具有查看、浏览权限。即可。

下面把相关的操作步骤记录如下:

首先、安装vsftpd软件。

yum –y install vsftpd

Vsftpd使用虚拟用户,访问FTP

安装完毕,我们先来建立所需要的用户。注意该系统用户一定要建立家目录,否则在后边无法登陆ftp服务器。

useradd ailanni

useradd bilanni

Vsftpd使用虚拟用户,访问FTP

查看用户所属的用户组:

id ailanni

id bilanni

Vsftpd使用虚拟用户,访问FTP

可以看到目前ailanni用户属于ailanni用户组,bilanni用户属于bilanni用户组。刚刚我们在前边就说过,要达到bilanni对www目录具有浏览、上传权限。我们需要把该用户加入到ailanni用户组,通过这样控制相关权限。

现在来把bilanni用户,加入到ailanni用户组。

usermod -g ailanni bilanni

Vsftpd使用虚拟用户,访问FTP

用户建立完毕,我们现在来创建/www目录,并修改其相关的属性。

mkdir /www

Vsftpd使用虚拟用户,访问FTP

通过上图,我们可以看到目前www目录,所属的用户及用户组为root。现在来进行修改,修改ailanni用户具有所有权限,ailanni用户组具有浏览、权限,其他用户组没有任何权限。把www目录的权限修改为750如下图:

chown –r ailanni:ailanni /www

Vsftpd使用虚拟用户,访问FTP

chmod –r 750

Vsftpd使用虚拟用户,访问FTP

以上我们把有关系统用户及其相关权限设置完毕,下面就来配置vsftpd。

切换到vsftpd的安装目录,编辑vsftpd.conf文件。如下图:

vim /etc/vsftpd/vsftpd.conf

Vsftpd使用虚拟用户,访问FTP

添加如下的内容:

pasv_enable=yes

pasv_min_port=30000

pasv_max_port=31000

chroot_local_user=yes

chroot_list_enable=no

guest_enable=yes

user_config_dir=/etc/vsftpd/vu

pam_service_name=vsftpd.virtual

Vsftpd使用虚拟用户,访问FTP

其中

pasv_enable=yes 指定开启vsftpd被动模式,在被动模式下只需要vsftpd服务器开启相应端口即可,客户端无需再开启端口。

pasv_min_port=30000 指定被动模式最低端口

pasv_max_port=31000 指定模式最高端口

guest_enable表示是否开启vsftpd虚拟用户的功能,yes表示开启,no表示不开启。

user_config_dir指定每个虚拟用户账号配置目录。

pam_service_name设置pam使用的名称,该名称就是/etc/pam.d/目录下vsftpd.virtual的文件。

chroot_local_user=yes是否将所有用户锁定在主目录,yes为启用,no禁用.(包括注释掉也为禁用)。

chroot_list_enable=no是否启动锁定用户的名单,yes为启用,no禁用(包括注释掉也为禁用)。

chroot_local_user=yes和chroot_list_enable=no一起使用表示禁止所有用户切换到上级目录。

配置完毕后,我们需要创建vsftpd虚拟用户账号的配置目录,如下图:

mkdir /etc/vsftpd/vu

Vsftpd使用虚拟用户,访问FTP

创建vsftpd的虚拟用户,把这些用户名和密码存放在一个文件中。该文件内容格式是:用户名占用一行,密码占一行。如下图:

vim /etc/vsftpd/login.txt

Vsftpd使用虚拟用户,访问FTP

这个文件中ilannia与ilannib是vsftpd虚拟的用户名,ilanni为密码。

这个文件的虚拟用户和密码的文本文件无法被系统帐号直接调用,所以我们需要使用db_load命令生成db口令数据库文件,命令如下:

db_load -t -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db

Vsftpd使用虚拟用户,访问FTP

为了使服务器能够使用上述生成的数据库文件,对客户端进行身份验证,需要调用系统的pam模块。pam(plugable authentication module)为可插拔认证模块,不必重新安装应用系统,通过修改指定的配置文件,调整对该程序的认证方式。pam模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量与认证有关的配置文件,并以服务名称命名。

我们现在切换到/etc/pam.d/ 目录下,编辑vsftpd.virtual文件。如下图:

vim /etc/pam.d/vsftpd.virtual

auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/login

account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login

Vsftpd使用虚拟用户,访问FTP

把该文件默认的内容注释掉,添加如下内容:

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/login

account required /lib/security/pam_userdb.so db=/etc/vsftpd/login

Vsftpd使用虚拟用户,访问FTP

auth是指对用户的用户名口令进行验证。

accout是指对用户的帐户有哪些权限哪些限制进行验证。

再后面的/lib/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。

注意该函数会根据系统的位数而所在位置不同。

如果是32bit系统,该文件所在位置是/lib/security/pam_userdb.so,如下图:

Vsftpd使用虚拟用户,访问FTP

如果是64bit系统,该文件所在位置是/lib64/security/pam_userdb.so,如下图:

Vsftpd使用虚拟用户,访问FTP

最后db=/etc/vsftpd/login则指定了验证库函数将到这个指定的数据库中调用数据进行验证。其实该文件指的是/etc/vsftpd/login.db文件。

<b>注意:</b><b>db=/etc/vsftpd/login</b><b>格式是这样的,去掉.db后缀。</b>

pam配置完毕后,我们现在开始创建虚拟用户与系统用户对应的文件。切换到/etc/vsftpd/vu目录下,并创建ilannia文件。注意该文件名称一定要与login.txt中的虚拟用户要对应。比如现在login.txt文件有ilannia用户,那么在 /etc/vsftpd/vu目录下创建一个文件名为ilannia的文件。

如下图:

Vsftpd使用虚拟用户,访问FTP

文件内容如下:

vim /etc/vsftpd/vu/ilannia

guest_username=ailanni

local_root=/www/

virtual_use_local_privs=yes

anon_umask=133

其中guest_username=ailanni表示的是设置ftp对应的系统用户为ailanni

local_root=/www/表示使用本地用户登录到ftp时的默认目录

virtual_use_local_privs=yes虚拟用户和本地用户有相同的权限

anon_umask表示文件上传的默认掩码。计算方式是777减去anon_umask就是上传文件的权限。在此我们设置的是133,也就是说上传后文件的权限是644。即上传的文件对所属用户来说只有读写权限,没有执行权限。

Vsftpd使用虚拟用户,访问FTP

以同样的方法创建文件ilannib,内容与上述相同。

Vsftpd使用虚拟用户,访问FTP

以上配置完毕后,现在我们来启动vsftpd服务。如下图:

Vsftpd使用虚拟用户,访问FTP

/etc/init.d/vsftpd start

现在我们来使用ilannia这账号来连接ftp看看实际的情况:

Vsftpd使用虚拟用户,访问FTP
Vsftpd使用虚拟用户,访问FTP

通过上图我们可以看到,vsftpd虚拟用户ilannia、ilannib都已经可以正常登陆到ftp服务器。

测试用户ilannia的相关权限,如下图:

Vsftpd使用虚拟用户,访问FTP

登录成功

Vsftpd使用虚拟用户,访问FTP

下载及列出目录权限

Vsftpd使用虚拟用户,访问FTP

上传权限

Vsftpd使用虚拟用户,访问FTP

删除权限

Vsftpd使用虚拟用户,访问FTP

创建目录权限

Vsftpd使用虚拟用户,访问FTP

切换目录权限

可以看到ilannia用户具有管理员权限。

下面测试用户ilannib的相关权限,如下图:

Vsftpd使用虚拟用户,访问FTP

登录权限

Vsftpd使用虚拟用户,访问FTP
Vsftpd使用虚拟用户,访问FTP

下载权限

Vsftpd使用虚拟用户,访问FTP
Vsftpd使用虚拟用户,访问FTP

删除文件权限

Vsftpd使用虚拟用户,访问FTP

通过上述截图,我们可以很容易发现ftp用户ilannib只具有下载和切换目录权限,其他的权限是没有的。刚好到达我们的要求。

以上全部是在防火墙iptables关闭的情况下,进行测试的。如果iptables开启的话,只需要开放vsftpd相关的端口即可。如下:

-a input -p tcp -m tcp –dport 2121 -j accept

-a input -p tcp -m tcp –dport 30000:31000 -j accept

有关ftp用户权限控制,这个只是一部分。以后如果有机会,我会在写一写这方面的文章。