http://blog.51cto.com/yuanbin/129071 <http://blog.51cto.com/yuanbin/129071>

 

两种方式建立Vsftpd虚拟用户

 

我们登录FTP有三种方式,匿名登录、本地用户登录和虚拟用户登录。

匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous。

本地用户登录:使用系统用户登录,在/etc/passwd中。

虚拟用户登录:这是FTP专有用户,有两种方式实现虚拟用户,本地数据文件和数据库服务器。

FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户登录FTP,只能访问FTP服务器提供的资源,大大增强了系统的安全。

时时彩源码下载 <http://www.yuanma007.com/>

 

本文实验的Linux系统是CentOS 5 update2

 

一、本地数据文件方式

1. 添加虚拟用户口令文件

 

[root@CentOS5 /]#vi /etc/vsftpd/vftpuser.txt

添加虚拟用户名和密码,一行用户名,一行密码,以此类推。奇数行为用户名,偶数行为密码。

bobyuan #用户名

123456 #密码

markwang #用户名

123456 #密码

 

 

2. 生成虚拟用户口令认证文件

将刚添加的vftpuser.txt虚拟用户口令文件转换成系统识别的口令认证文件。

首先查看系统有没有安装生成口令认证文件所需的软件db4-utils。

 

[root@CentOS5 /]#rpm –qa |grep db4-utils

[root@CentOS5 /]#rpm –ivh db4-utils-4.3.29-9.fc6.i386.rpm

 

时时彩源码下载 <http://www.yuanma007.com/>

下面使用db_load命令生成虚拟用户口令认证文件。

[root@CentOS5 /]#db_load –T –t hash –f /etc/vsftpd/vftpuser.txt
/etc/vsftpd/vftpuser.db

 

3. 编辑vsftpd的PAM认证文件

在/etc/pam.d目录下,

[root@CentOS5 /]#vi /etc/pam.d/vsftpd

将里面其他的都注释掉,添加下面这两行:

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

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

 

 

4. 建立本地映射用户并设置宿主目录权限

所有的FTP虚拟用户需要使用一个系统用户,这个系统用户不需要密码。

[root@CentOS5 /]#useradd –d /home/vftpsite –s /sbin/nologin vftpuser

[root@CentOS5 /]#chmod 700 /home/vftpsite

 

 

5. 配置vsftpd.conf(设置虚拟用户配置项)

 

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf

guest_enable=YES #开启虚拟用户

guest_username=vftpuser #FTP虚拟用户对应的系统用户

pam_service_name=vsftpd #PAM认证文件

 

 

6. 重启vsftpd服务

 

[root@CentOS5 /]#service vsftpd restart

 

7. 测试虚拟用户登录FTP

 

C:\User\Administrator>ftp 192.168.120.240

连接到192.168.120.240。

220 Welcome to BOB FTP server

用户(192.168.120.240(none)):markwang

331 Please specify the password.

密码:

230 Login successful.

 

 

二、数据库服务器(MySQL)方式

1. 安装MySQL

我使用的是Tar包安装的MySQL,版本号:mysql-6.0.8-alpha.tar.gz

具体安装方法,请查看我的另一篇文章“部署LAMP+Discuz!7.0
<http://yuanbin.blog.51cto.com/363003/124826>”。

 

2. 建立本地映射用户并设置宿主目录权限

 

[root@CentOS5 /]#useradd –d /home/vftpsite –s /sbin/nologin vftpuser

[root@CentOS5 /]#chmod 700 /home/vftpsite

 

 

3. 配置vsftpd.conf(设置虚拟用户配置项)

 

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf

guest_enable=YES #开启虚拟用户

guest_username=vftpuser #FTP虚拟用户对应的系统用户

pam_service_name=vsftpd #PAM认证文件

 

 

4. 在MySQL中建立用户口令数据库

 

[root@CentOS5 /]#mysql –u root –p

mysql> create database vftpuser;   #建立虚拟用户数据库,库名vftpuser

mysql> use vftpuser;  #进入vftpuser数据库

 

mysql> create table users(name char(16) binary,passwd char(16) binary); 
#建立虚拟用户口令表,表名users

 

mysql> insert into users (name,passwd) values ('bobyuan',password('111')); 

mysql>  insert into users (name,passwd) values ('markwang',password('111'));

#建立两个虚拟用户,bobyuan和markwang


注:在这里我用这种方法添加的虚拟用户密码都是经过MySQL加密的,加密后的密码pam-mysql不能识别(MySQL和pam-mysql兼容性有些问题),因此本次实验使用明文保存密码。
添加明文密码:
方法一:单个添加用户
mysql> insert into users (name,passwd) values ('bobyuan', '111');
mysql> insert into users (name,passwd) values ('markwang',‘111');
方法二:批量添加用户
新建vftpuser.txt文件
[root@CentOS5 /]#vi vftpuser.txt
添加用户名和密码,注意字段数据之间要用Tab键隔开。
bobyuan  111
markwang 111
mysql>use vftpuser;
mysql>load data local infile “/vftpuser.txt”into table users;

mysql>flush privileges;

 

mysql> grant select on vftpuser.users to vftpuser@localhost identified by
'111111';  #授权vftpuser这个账号可以读取vftpuser数据库的user表

 

5. 验证第4步的设置是否成功

 

[root@CentOS5 /]#mysql –u vftpuser –p

mysql>show databases;

mysql>use vftpuser;

mysql>show tables;

mysql>select * from users;

mysql>quit

如下图:

<http://yuanbin.blog.51cto.com/attachment/200902/6/363003_1233940773qBbv.jpg>

 

6. 编译MySQL的PAM认证模块

查看/lib/security目录下有没有MySQL对应的PAM模块。

<http://yuanbin.blog.51cto.com/attachment/200902/6/363003_1233940776qJ3K.jpg>

如果没有则下载pam-mysql安装(http://sourceforge.net/projects/pam-mysql
<http://sourceforge.net/projects/pam-mysql>),

我下载的是pam_mysql-0.7RC1.tar.gz。

[root@CentOS5 /]#cd /usr/local/src

[root@CentOS5 src]#tar –zxvf pam_mysql-0.7RC1.tar.gz

[root@CentOS5 src]#cd pam_mysql-0.7RC1

[root@CentOS5 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr/local/mysql/
--with-pam-mods-dir=/lib/security/

[root@CentOS5 pam_mysql-0.7RC1]#make

[root@CentOS5 pam_mysql-0.7RC1]#make install

 

 

7. 编辑vsftpd的PAM认证文件

在/etc/pam.d目录下,

 

[root@CentOS5 /]#vi /etc/pam.d/vsftpd

 

将里面其他的都注释掉,添加下面这两行:

auth required pam_mysql.so user=vftpuser passwd=111111 host=localhost
db=vftpuser table=users usercolumn=name passwdcolumn=passwd crypt=0

account required pam_mysql.so user=vftpuser passwd=111111 host=localhost
db=vftpuser table=users usercolumn=name passwdcolumn=passwd crypt=0

crypt=0:表示口令使用明文方式保存在数据库中
crypt=1:表示口令使用UNIX的DES加密方式加密后保存在数据库中
crypt=2:表示口令使用MySQL的password()函数加密后保存在数据库中
crypt=3:表示口令使用MD5散列值的方式保存在数据库中

 

8. 重启vsftpd服务

 

[root@CentOS5 /]#service vsftpd restart

 

9. 测试虚拟用户登录FTP

C:\User\Administrator>ftp 192.168.120.240

Connected to 192.168.120.240.
220 Welcome to BOB FTP server
User (192.168.120.240:(none)): bobyuan
331 Please specify the password.
Password:
230 Login successful.
ftp> quit
221 Goodbye.

 

三、虚拟用户高级设置

1. virtual_use_local_privs参数

 

当virtual_use_local_privs=YES时,虚拟用户和本地用户有相同的权限;

当virtual_use_local_privs=NO时,虚拟用户和匿名用户有相同的权限,默认是NO。

 

 

 

当virtual_use_local_privs=YES,write_enable=YES时,虚拟用户具有写权限(上传、下载、删除、重命名)。

 

 

当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=YES,

anon_upload_enable=YES时,虚拟用户不能浏览目录,只能上传文件,无其他权限。

 

 

当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,

anon_upload_enable=NO时,虚拟用户只能下载文件,无其他权限。

 

 

当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,

anon_upload_enable=YES时,虚拟用户只能上传和下载文件,无其他权限。

 

 

当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,

anon_mkdir_write_enable=YES时,虚拟用户只能下载文件和创建文件夹,无其他权限。

 

 

当virtual_use_local_privs=NO,write_enable=YES,anon_world_readable_only=NO,

anon_other_write_enable=YES时,虚拟用户只能下载、删除和重命名文件,无其他权限。

 

2. 建立各个虚拟用户自身的配置文件

 

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf

添加:

user_config_dir=/etc/vsftpd/vsftpd_user_conf

[root@CentOS5 /]#mkdir /etc/vsftpd/vsftpd_user_conf

 

编辑bobyuan的配置文件

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd_user_conf/bobyuan

添加:

anon_world_readable_only=NO
#开放bobyuan的下载权限(只能下载)。注意这个地方千万不能写成YES,否则bobyuan将不能列出文件和目录。

 

编辑markwang的配置文件

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd_user_conf/markwang

添加:

write_enable=YES #开放markwang的写权限

anon_world_readable_only=NO #开放markwang的下载权限

anon_upload_enable=YES #开放markwang的上传权限

anon_mkdir_write_enable=YES #开放markwang创建目录的权限

anon_other_write_enable=YES #开放markwang删除和重命名的权限

 

四、虚拟用户配置文件(实验)

1. 所有虚拟用户使用统一配置

 

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf

write_enable=YES

anonymous_enable=NO

local_enable=YES

guest_enable=YES

guest_username=vftpuser

virtual_use_local_privs=NO

pam_service_name=vsftpd

anon_world_readable_only=NO #可以下载

anon_upload_enable=NO(默认值) #不能上传

anon_mkdir_write_enable=NO(默认值) #不能新建文件夹

anon_other_write_enable=NO(默认值) #不能删除和重命名文件

ftpd_banner=Welcome to BOB FTP server

xferlog_enable=YES

xferlog_file=/var/log/vsftpd.log

xferlog_std_format=YES

ascii_upload_enable=YES

ascii_download_enable=YES

tcp_wrappers=NO

setproctitle_enable=YES

listen_port=21

connect_from_port_20=YES

idle_session_timeout=600

data_connection_timeout=120

max_clients=0

max_per_ip=3

local_max_rate=512000

 

2. 各个虚拟用户使用自身配置

 

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf

write_enable=YES

anonymous_enable=NO

local_enable=YES

guest_enable=YES

guest_username=vftpuser

virtual_use_local_privs=NO

pam_service_name=vsftpd

user_config_dir=/etc/vsftpd/vsftpd_user_conf

ftpd_banner=Welcome to BOB FTP server

xferlog_enable=YES

xferlog_file=/var/log/vsftpd.log

xferlog_std_format=YES

ascii_upload_enable=YES

ascii_download_enable=YES

tcp_wrappers=NO

setproctitle_enable=YES

listen_port=21

connect_from_port_20=YES

idle_session_timeout=600

data_connection_timeout=120

max_clients=0

max_per_ip=3

local_max_rate=512000

 

 

[root@CentOS5 /]#mkdir /etc/vsftpd/vsftpd_user_conf

编辑bobyuan(FTP匿名用户)的配置文件

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd_user_conf/bobyuan

anon_world_readable_only=NO

编辑ftpadmin(FTP匿名管理员)的配置文件

[root@CentOS5 /]#vi /etc/vsftpd/vsftpd_user_conf/ftpadmin

anon_world_readable_only=NO

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

 

关于使用MySQL实现虚拟用户的另一篇文章,请参考“Vsftpd FTP服务器-虚拟用户(mysql)和本地用户同时验证
<http://blog.chinaunix.net/u1/56627/showart_689317.html>”。

 

 

vsftpd虚拟用户和本地用户不能共存
<https://www.cnblogs.com/redhatlinux/archive/2012/04/18/2455084.html>

https://www.cnblogs.com/redhatlinux/archive/2012/04/18/2455084.html
<https://www.cnblogs.com/redhatlinux/archive/2012/04/18/2455084.html>

 


在配置vsftpd的过程中,听信了网上的谗言,把vsftpd配了一遍,发现配完,虚拟用户和本地用户不能共存,即虚拟用户可以登录ftp,但是本地用户不能登录的ftp。折腾了很久,包括上网找过很多内容都找不到解决方法,大家貌似都没有这样的问题,或者找不到解决办法(在看众多教程中貌似有看到过和本方法一样的配置,但是那份内容里面完全没有提到/etc/pam.d/vsftpd里面为什么要这样写)。在洗澡过程中想了想,既然本地用户无法登录,那应该是pam验证的时候就没有给本地用户过。实验证明人在洗澡的时候是最清醒的时候。哈哈!回来实验,发现如果把/etc/pam.d/vsftpd
中的

auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required pam_userdb.so db=/etc/vsftpd/vuser_passwd


注释掉,然后把里面其它的内容都打开注释(网上大部分教程教建立虚拟用户时,都说把上面两句加入/etc/pam.d/vsftpd中,然后把里面的其它东西注释掉),这时候再尝试,发现本地用户能登录!!!这也证明了是pam模块认证的问题让虚拟用户和本地用户不能共存。所以就去了解了一下pam配置的内容,如下网址:

http://www.ibm.com/developerworks/cn/linux/l-pam/
<http://www.ibm.com/developerworks/cn/linux/l-pam/>

里面提到:
Required:堆栈中的所有 Required 模块必须看作一个成功的结果。如果一个或多个 Required 模块失败,则实现堆栈中的所有
Required 模块,但是将返回第一个错误。


也就意味着,required需要所有内容都满足才行,当我们前两条配置虚拟用户登录验证通过后,继续向下面的配置条目进行验证,验证是否是本地用户时结果发现不是,又因为,验证本地用户的control_flag(见上网址中解释)也为required,所以这时候,就会返回错误,也即验证不成功。

所以我们不能同时设置虚拟用户和本地用户的control_flag为required。按照上面的网址所说:
Sufficient:如果标记为 sufficient 的模块成功并且先前没有 Required 或 sufficient
模块失败,则忽略堆栈中的所有其余模块并返回成功。


我们可以把虚拟用户的验证配置放在最前面,且把control_flag设为sufficient。这样的话,如果遇到是虚拟用户,那么可以通过验证,如果是本地用户,忽略掉sufficient的两条配置规则,只要满足required就行,所以也能通过验证。

如下为/etc/pam.d/vsftpd的内容:
#%PAM-1.0
auth sufficient pam_userdb.so db=/etc/vsftpd/vuser_passwd
account sufficient pam_userdb.so db=/etc/vsftpd/vuser_passwd

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


上面两行为后面加上,虚拟用户pam认证需要的配置条目,下面为原来vsftpd的认证配置规则,可以看到,本地用户用的是password-auth,从这里可以看出如果要虚拟用户和本地用户共存,两部分都不能注释。网上说的注释掉下面的部分,这种情况本地用户都不能登录。
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信