两种方式建立Vsftpd虚拟用户

我们登录FTP有三种方式:

  • 匿名登录;
  • 本地用户登录;
  • 虚拟用户登录;

匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous。
本地用户登录:使用系统用户登录,在/etc/passwd中。
虚拟用户登录:这是FTP专有用户,有两种方式实现虚拟用户,本地数据文件和数据库服务器。
FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户登录FTP,只能访问FTP服务器提供的资源,大大增强了系统的安全。

本文实验的Linux系统是CentOS 5

一、本地数据文件方式
1. 添加虚拟用户口令文件

vi /etc/vsftpd/vftpuser.txt

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

将刚添加的vftpuser.txt虚拟用户口令文件转换成系统识别的口令认证文件。
首先查看系统有没有安装生成口令认证文件所需的软件db4-utils。

rpm –qa |grep db4-utils
rpm –ivh db4-utils-4.3.29-9.fc6.i386.rpm

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

db_load –T –t hash –f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db

3. 编辑vsftpd的PAM认证文件
在/etc/pam.d目录下,

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虚拟用户需要使用一个系统用户,这个系统用户不需要密码。

useradd –d /home/vftpsite –s /sbin/nologin vftpuser
chmod 700 /home/vftpsite

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

vi /etc/vsftpd/vsftpd.conf
guest_enable=YES #开启虚拟用户
guest_username=vftpuser #FTP虚拟用户对应的系统用户
pam_service_name=vsftpd #PAM认证文件

6. 重启vsftpd服务

service vsftpd restart

7. 根据设置的账号和密码测试FTP链接。

二、数据库服务器(MySQL)方式
1. 安装MySQL

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

useradd –d /home/vftpsite –s /sbin/nologin vftpuser
chmod 700 /home/vftpsite

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

vi /etc/vsftpd/vsftpd.conf
guest_enable=YES #开启虚拟用户
guest_username=vftpuser #FTP虚拟用户对应的系统用户
pam_service_name=vsftpd #PAM认证文件

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

#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文件

#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

如下图:
6. 编译MySQL的PAM认证模块
查看/lib/security目录下有没有MySQL对应的PAM模块。

如果没有则下载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

三、虚拟用户高级设置
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
#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匿名管理员)的配置文件
#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
# setsebool allow_ftpd_full_access 1
# setsebool allow_ftpd_use_cifs 1
# setsebool allow_ftpd_use_nfs 1
# setsebool ftp_home_dir 1
# setsebool httpd_enable_ftp_server 1
# setsebool tftp_anon_write 1
# service vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
# getsebool -a|grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> on
allow_ftpd_use_cifs --> on
allow_ftpd_use_nfs --> on
ftp_home_dir --> on
httpd_enable_ftp_server --> on
tftp_anon_write --> on

listen=YES
listen_port=21
tcp_wrappers=YES //支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)
listen=YES的意思是使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式)
anonymous_enable=NO
local_enable=YES //PAM方式此处必须为YES,如果不是将出现如下错误:
500 OOPS: vsftpd: both local and anonymous access disabled!
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=vsftpd //这两行的意思是采用虚拟用户形式
virtual_use_local_privs=YES //虚拟用户和本地用户权限相同

发表评论

电子邮件地址不会被公开。 必填项已用*标注