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 # 拒绝其他的用户登陆