VSFTPD是一种在UNIX/Linux中非常安全且快速的FTP服务器,目前已经被许多大型站点所采用。VSFTPD支持将用户名和口令保存在数据库文件或数据库服务器中。VSFTPD称这种形式的用户为虚拟用户。相对于FTP的本地(系统)用户来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以匿名下载;既需要对下载用户进行管理,又考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。本文介绍在centos上如何将VSFTPD的虚拟用户名和密码保存在MySQL数据库服务器中。

1)安装vsftp

# tar -zxvf vsftpd-2.0.6.tar.gz

# cd vsftpd-2.0.6

安装步骤可以参照目录下INSTALL文件

# mkdir /usr/share/empty/

# mkdir /var/ftp/

# useradd -d /var/ftp ftp

# chown root.root /var/ftp

# chmod og-w /var/ftp

#make;make install

#cp vsftpd /usr/local/sbin/vsftpd

#mkdir /usr/local/man

#cp vsftpd.conf.5 /usr/local/man/man5

#cp vsftpd.8 /usr/local/man/man8

# cp RedHat/vsftpd.pam /etc/pam.d/ftp

#cp vsftpd.conf /etc

#vi /etc/vsftpd.conf

在最后添加一行

listen=YES

启动vsftp服务

#/usr/local/sbin/vsftpd &

然后用anonymous或者ftp用户测试一下,密码都为空

允许本地用户登陆:

#vi /etc/vsftpd.conf

local_enable=YES

pam_service_name=ftp

然后新建一个用户,重启一下服务登陆测试一下

#killall -HUP vsftpd             //重启vsftpd服务

禁锢用户的主目录:

#touch   /etc/vsftpd.chroot_list

a、限制所有用户不能切换目录

chroot_local_user=YES

b、设置指定的用户不能切换目录

chroot_local_user=NO

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list

然后把需要禁锢主目录的用户输入到/etc/vsftpd.chroot_list文件中就可以了






用DB库存储用户名及密码

a)建立虚拟用户口令库文件,口令库文件中奇数行设置用户名,偶数行设置口令

# cat logins.txt

aaa

123456

bbb

123456

b)生成vsftpd的认证文件

# db_load -T -t hash -f logins.txt   /etc/vsftpd_login.db

# chmod 600 /etc/ vsftpd_login.db

c) 建立虚拟用户所需的PAM配置文件

# cat /etc/pam.d/ftp   (把原来的都注释掉)

auth   required   /lib/security/pam_userdb.so   db=/etc/vsftpd_login

account   required   /lib/security/pam_userdb.so   db=/etc/vsftpd_login

d)建立虚拟用户及要访问的目录并设置相应的权限

# useradd -d /home/ftpsite virtual

# chmod 700 /home/ftpsite/

e)在配置文件/etc/vsftpd/vsftpd.conf中添加虚拟用户的配置内容

guest_enable=YES

guest_username=virtual

pam_service_name=ftp //这行前面已经加过了

然后重启一下vsftp服务,使用aaa和bbb用户测试一下

对虚拟用户设置不同的权限

#vi /etc/vsftpd/vsftpd.conf

添加用户配置文件目录设置,增加一行

user_config_dir=/etc/vsftpd_user_conf

然后建立虚拟用户的配置文件目录

# mkdir /etc/vsftpd_user_conf

为虚拟用户建立单独的配置文件,用户配置文件名称与用户名相同

/etc/vsftpd_user_conf/aaa

/etc/vsftpd_user_conf/bbbb

每个FTP虚拟用户都可以独立设置其权限和不同的家目录

#cat /etc/vsftpd_user_conf/aaa

virtual_use_local_privs=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/var/aaa

-----------------------------------
virtual_use_local_privs参数,
当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。所有虚拟用户的权限使用local参数。
当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限,所有虚拟用户的权限使用anon参数。
这两者种做法相比,后者更加严格一些,特别是在有写访问的情形下。默认情况下此参数是关闭的(NO)。
----------------------------------



使用mysql存储虚拟用户

a)安装mysql

# tar -zxvf mysql-5.0.67.tar.gz

#cd mysql-5.0.67

# ./configure --prefix=/usr/local/mysql

#make;make install

# cp support-files/my-medium.cnf /etc/my.cnf

#useradd mysql

#chown -R root.root /usr/local/mysql/

初始化数据库

# /usr/local/mysql/bin/mysql_install_db

#chown -R root.root /usr/local/mysql/

# chown -R mysql.mysql /usr/local/mysql/mysql/var

# /usr/local/mysql/bin/mysqld_safe --user=mysql &

b)安装pam_mysql

因为mysql是编译安装的,所以在这步可能会出错,做下列的链接就可以

#ln -s /usr/local/mysql/lib/mysql   /usr/lib/mysql

#ln -s /usr/local/mysql/include/mysql   /usr/include/mysql

#tar -zxvf pam_mysql-0.6.2.tar.gz

#cd pam_mysql-0.6.2

#./configure --with-mysql=/usr/local/mysql –with-openssl

#make;make install

#cp /usr/lib/security/pam_mysql.so /lib/security/

c)设置数据库

mysql>create database vftp;

mysql>use vftp;

mysql>create table users(name char(16) binary,passwd char(16) binary);

mysql>insert into users (name,passwd) values ('test1','123456');

mysql>insert into users (name,passwd) values ('test2','123456');

mysql>quit

d)建立pam认证所需文件

#vi /etc/pam.d/ftp

添加如下两行

auth required /lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vftp

table=users usercolumn=name passwdcolumn=passwd crypt=0

account required /lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vftp

table=users usercolumn=name passwdcolumn=passwd crypt=0

注意:

#crypt=0: 明文密码

#crypt=1: 使用crpyt()函数(对应SQL数据里的encrypt(),encrypt()随机产生salt)

#crypt=2: 使用MYSQL中的password()函数加密

#crypt=3:表示使用md5的散列方式#上面是两句配置,第一句是以auth开始的,第二句以account开始的



e)虚拟用户的配置

vsftpd.conf的配置和用DB库存储用户名及密码相同