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



1、编译安装pam_mysql

注意:安装这些软件包之前不要忘记安装开发环境

yum -y groupinstall "Development Tools"

yum -y groupinstall "Development Libraries"

mysql安装请参考本文LAMP最新编译安装

tar xf pam_mysql-0.7RC1.tar.gz

cd pam_mysql-0.7RC1

./configure --with-mysql=/usr/local/mysql

make && make install

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


2、编译安装vsftpd

tar xf vsftpd-2.3.5.tar.gz

cd vsftpd-2.3.5

less INSTALL /建议查看这个安装文档,里面有详细说明安装vsftpd步骤/

make && make install


复制vsftpd的主配置文件

mkdir -pv /etc/vsftpd

cp vsftpd.conf /etc/vsftpd/


编辑配置文件/etc/vsftpd/vsftpd.conf

添加:listen=YES


启动vsftpd服务器

/usr/local/sbin/vsftpd &


-----------------------------------------------------------------------------------------


二、服务配置

1、配置mysql,创建数据库表用户等操作


创建数据库为vsftpd

mysql> create database vsftpd;

Query OK, 1 row affected (0.10 sec)


创建表为users

mysql> use vsftpd;

Database changed

mysql> create table users (

   -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

   -> name CHAR(15) NOT NULL UNIQUE KEY,

   -> password CHAR(48) NOT NULL );

Query OK, 0 rows affected (0.22 sec)


添加两个用户,采用加密模式

mysql> insert into users (name,password) values ('test',password('123456'));

Query OK, 1 row affected (0.06 sec)


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

Query OK, 1 row affected (0.01 sec)


为用户vsftpd授权

mysql> grant select on vsftpd.* to vsftpd@localhost identified by '123456';

Query OK, 0 rows affected (0.08 sec)


mysql> grant select on vsftpd.* to [email protected]  identified by '123456';

Query OK, 0 rows affected (0.01 sec)


最后刷新一下表

mysql> flush privileges;            

Query OK, 0 rows affected (0.05 sec)



2、建立认证文件

cd /etc/pam.d

touch vsftpd.mysqluser

vim vsftpd.mysqluser 添加以下内容

auth required pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

account required pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

保存退出


说明:

auth 对用户所提供的认证信息进行验证,比如检查用户账号及密码

account 执行基于非验证的账号管理。它主要用来允许或者限制用户对某个服务的访问时间,当前有效的系统资源最多可以有多少个用户,限制用户的位置等

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



3、建立虚拟用户映射的系统用户及对应的目录

useradd -s /sbin/nologin -d /var/ftpuser ftpuser

chmod go+rx /var/ftpuser


4、配置vsftpd主配置文件/etc/vsftpd/vsftpd.conf

请确保/etc/vsftpd/vsftpd.conf中已经启用了以下选项

anonymous_enable=YES           #表示允许匿名用户登录访问

local_enable=YES   #表示允许本地系统用户登录访问

write_enable=YES               #表示允许写入权限

anon_upload_enable=NO   #表示匿名用户是否有上传的权限,这里是关闭的,要开启NO改成YES

anon_mkdir_write_enable=NO     #表示匿名用户没有写入的权限,这里是关闭的,开开启NO改成YES

chroot_local_user=NO           #表示把ftp本地用户锁定在家目录,为了安全,建议关闭


添加以下选项

guest_enable=YES   #启用虚拟用户

guest_username=ftpuser   #虚拟用户映射的系统用户,就是上面我们建立的用户,名字是ftpuser

pam_service_name=vsftpd.ftp    #启用PAM认证,并指定文件,这个文件路径在/etc/pam.d/ftp


6、关闭vsftpd和开启vsftpd

关闭vsftpd:killall vsftpd

开启vsftpd:/usr/local/sbin/vsftpd   /etc/vsftpd/vsftpd.conf &


测试:lftp [email protected]


输入密码就可以正常登录了



三、解决系统用户无法登录ftp

如果使用虚拟用户,那么系统本地用户就无法登录了,如果要解决这个问题,必须可以修改/etc/pam.d/vsftpd文件,把虚拟用户基本mysql的配置文件(/etc/pam.d/vsftpd.my),放置到/etc/pam.d/vsftpd里就可以解决了,需要添加和修改的几个选项如下:

#%PAM-1.0

auth sufficient  pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

account sufficient  pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

#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      system-auth

account    include      system-auth

#session    include     system-auth  

#session    required     pam_loginuid.so


此时,再次测试,虚拟用户和系统本地用户都可以正常登录,但是系统本地用户登录的家目录是虚拟用户的家目录,无法登录自己系统

本地的家目录,如果系统用户要想使用家目录,可以用以下参数定义



实验过程中遇到的问题:

问题一、用虚拟账号登录ftp的时候报错:ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

解决方法:chown a-w /var/ftpuser,做完这步但是虚拟用户就无法上传文件了,这时在/



user_config_dir=/etc/vsftpd/users

1. which vsftpd                       # 确定文件路径          

2. vim /etc/hosts.deny                 # 改文件立即生效  

vsftpd: 172.16.0.2300  


#假设仅允许172.16网段访问  

vim /etc/hosts.allow  

vsftpd: 171.16                        # 只允许172.16.0.0/16网段  

vim /etc/hosts.deny  

ALL: ALL                                            # 拒绝其他的用户登陆