我曾经在QuickLinux上发表过一篇文档,介绍了如何用VSFTP和Berkeley DB通过PAM实现虚拟用户。现在这篇不是简单的转载过来——虽然目前看起来是这样,后面还是要加入一些新的东西,算是先占个位子吧。后面要加入的是VSFTP+MySQL/PostgreSQL实现虚拟用户,以及磁盘配额。此文档会不定期更新。
 
前言:
本文档基于网络上各vsftp的配置文档结合我自己在QuickLinux上的实践总结而成。网络上的文档或多或少都会有一些问题,完全照搬会很麻烦。本文在QuickLinux上验证无误,并可应用于CentOS系列以及基于CentOS的其他发行版,如Trixbox、Elastic等。
需求:
QuickLinux服务器上需要开ftp服务,在ftp根目录下包含三个字目录:incoming、mcc、vis,包含四个虚拟用户:admin(系统管理员,具有全部权限),upload(可以在incoming目录中上传下载文件,并建文件夹,不能删除及修改),mcc和vis用户只能下载同名目录中的文件,无其他权限。
准备:
1) 确认已经安装vsftpd,使用QL默认安装的rpm即可。
2) 确认安装Berkeley db,QL自带的db4版本不够,且没有utils包,需要升级。
下载db4-4.3.27-3.i386.rpm及db4-utils-4.3.27-3.i386.rpm,执行命令:
~# rpm -Uvh db4-4.3.27-3.i386.rpm
~# rpm -ivh db4-utils-4.3.27-3.i386.rpm
注意,第一个是升级安装,第二个是全新安装。
3) 安装pam_pwdfile,此步至关重要,正是网上广为讨论的priv_sock_get_result问题之所在!
首先下载pam_pwdfile-0.99,可到 [url]http://cpbotha.net/pam_pwdfile.html[/url]
然后下载Linux-PAM-0.75.tar.bz2,可到 [url]http://www.us.kernel.org/pub/linux/libs/pam/pre/library/Linux-PAM-0.75.tar.bz2[/url]
假设将两个包都放在/home/temp下,然后按照下面步骤安装:
~# tar xjvf Linux-PAM-0.75.tar.bz2
~# tar xzvf pam_pwdfile-0.99
~# cp -r pam_pwdfile-0.99 Linux-PAM-0.75/modules
~# cd Linux-PAM-0.75
~# rm -f default.defs
~# ln -s defs/redhat.defs default.defs
~# make
在make这步成功后,就会在Linux-PAM-0.75/modules/pam_pwdfile-0.99/发现一个名叫pam_pwdfile.so的文件, 将其复制到/lib/security/下面
开始:
1) 生成虚拟用户的数据库:
使用pam_userdb来认证虚拟用户。
先创建一个logins.txt,并在里面写入用户名及密码,注意,单数行为用户名,双数行为对应的密码:
~# vi /root/logins.txt
admin
123456
upload
123456
mcc
123456
vis
123456
将logins.txt转换成db文件:
~# db_load -T -t hash -f /root/logins.txt /etc/vsftpd/vsftpd_login.db
~# chmod 600 /etc/vsftpd/vsftpd_login.db
2) 生成一个使用你新的db的PAM文件。
~# vi /etc/pam.d/vsfptd
把原有各行均注释掉,然后加入下面两行:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login crypt=hash
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login crypt=hash
注意crypt=hash必须加上,否则依然会出priv_sock_get_result问题!
~# cp /etc/pam.d/vsftpd /etc/pam.d/ftp.vu
3) 建立虚拟用户的目录,ftpsite即为本机ftp的根目录。
~# useradd -d /home/ftpsite virtual
~# ls -ld /home/ftpsite
(看起来应该是这样的):
drwx------ 3 virtual virtual 4096 Jul 30 00:39 /home/ftpsite
接下来创建ftp根目录中的三个子目录:
~# mkdir /home/ftpsite/incoming
~# chown virtual.virtual /home/ftpsite/incoming
~# mkdir /home/ftpsite/mcc
~# chown virtual.virtual /home/ftpsite/mcc
~# mkdir /home/ftpsite/vis
~# chown virtual.virtual /home/ftpsite/vis
4) 建立你自己的 /etc/vsftpd/vsftpd.conf 文件(可把原来的conf先备份一下)
#=============================vsftpd.conf start====================================
anonymous_enable=NO
local_enable=YES
#这禁止了匿名用户使用FTP 服务,并且允许非匿名用户的登录,就是虚拟用户所需要的权限
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_world_readable_only=NO
#出于安全的目的,禁止写权限,其实后面我们使用虚拟用户自己的配置文件后,上面这几个设置就没用了。
chroot_local_user=YES
#这明确了虚拟用户是被定向到了虚拟的FTP 空间:/home/ftpsite
guest_enable=YES
guest_username=virtual
# 启用虚拟用户,并将虚拟用户映射为本地virtual用户
pam_service_name=ftp.vu
user_config_dir=/etc/vsftpd/user_conf
# 这两行很重要!指定PAM配置文件为 ftp.vu,并指定不同虚拟用户配置文件的存放路径
listen=YES
listen_port=21
# 使 vsftpd 以"standalone" 模式运行- 端口21
pasv_min_port=30000
pasv_max_port=30999
#限定端口,方便防火墙的设置
#===========================vsftpd.conf end=======================================
5)创建virtual文件目录/etc/vsftpd/user_conf 并在文件目录中创建以用户名命名的配置文件
~# mkdir /etc/vsftpd/user_conf
~# vi admin
local_root=/home/ftpsite
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
~# vi upload
local_root=/home/ftpsite/incoming
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=NO
~# vi mcc
local_root=/home/ftpsite/mcs
write_enable=NO
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
~# vi vis
local_root=/home/ftpsite/viss
write_enable=NO
anon_world_readable_only=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
6) 重启 vsftpd.
~# service vsftpd restart
配置到此即告完成,我们可以开始测试使用了!
补充:添加虚拟目录的方法
任意目录,所有权属于virtual.virtual。用mount --bind命令,如mount /mnt/aaa /home/ftpsite/movie/movie1