编译安装vsftpd-2.3.4(配置虚拟用户登录)高级应用全攻略[连载之电子商务系统架构]
原文出处:
http://jimmyli.blog.51cto.com/ Jimmy Li Blog
作者:Jimmy Li

联系讨论、扣扣:柒⑥柒陆叁⑤叁伍
关联博文:
http://jimmyli.blog.51cto.com/3190309/683599
centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录)[连载之电子商务系统架构]
------[连载之电子商务系统架构]访问量超过100万的电子商务网站技术架构
 
续上一博文,再深入解说vsftpd配置FTP服务器,实现更深层次的功能,达到更安全的、高效、高级应用技巧。
本文旨在解说,系统安装过程中需要注意的地方,关键环节,工具包之间的依存关系,互换相承支持关系。
详细说明为啥我要这样操作,并且在操作过程遇到的问题,和相应的解决方法。
 
本文要点:
1.实现多虚拟用户。实现多个虚拟宿主用户(本地用户),一个宿主本地用户可以关联多个虚拟用户。
例如,宿主本地用户www,关联多个虚拟用户jimmyli.blog.51cto.com(目录/data/jimmyli.blog.51cto.com),user1(目录/data/user1),…………,N用户(目录N)可自己权限可读写,更改文件、文件夹属性。
2.vsftp手工编译及配置虚拟用户过程。版本vsftpd-2.3.4,系统Centos32位,64位。
3.虚拟用户权限,单独控制目录\文件的权限,读,写,修改,删除,创建目录\文件。
目录:
一、完整的实例
二、编译安装要点分析,详细解说
三、提供参考
四、重要提示
五、配置文件操作解说
六、简单配置实例
七、参考实例
八、常见错误及解决方法
 
一、完整的实例:
yum install pam-devel db4-utils
wget
http://www.92csz.com/downloads/vsftpd-2.3.4.tar.gz
tar zxvf vsftpd-2.3.4.tar.gz
cd vsftpd-2.3.4
make && make install
mkdir -p /data/www/user1
chown wwwftp:wwwftp /data/www/user1
useradd -d /data/www -s /sbin/nologin wwwftp
mkdir -p /etc/vsftpd/
vim /etc/vsftpd/vftpuser.txt
jimmyli.blog.51cto.com
123456
user1
password1
格式为第一行为用户名名,第二行为密码,然后类推
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vsftpd_login.db
chmod 600 /etc/vsftpd/vsftpd_login.db
vim /etc/pam.d/vsftpd.vu
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
vim /etc/vsftpd.conf
local_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd.vu
guest_enable=YES
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
pasv_min_port=5000
pasv_max_port=6000
# 限制所有用户都在家目录
chroot_local_user=yes
mkdir -p /etc/vsftpd/vsftpd_user_conf
vim /etc/vsftpd/vsftpd_user_conf/user1
guest_username=wwwftp
write_enable=YES
anonymous_enable=NO
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
download_enable=Yes
local_root=/data/www/user1
 
二、编译安装要点分析,详细解说:
(一).安装支持工具包
主要使用了PAM数据方式的虚拟用户配置
1、首先是安装PAM、db4工具包
yum install pam-devel db4-utils
确认安装DB4部件包:
查看是否安装 db4 db4-utils
rpm -qa|grep db4  运行后出现下面内容 说明已经安装可以使用db_load命令(主要是 db4-utils)
[root@gb ~]# rpm -qa|grep db4
db4-utils-4.3.29-10.el5_5.2
db4-java-4.3.29-10.el5_5.2
db4-4.3.29-10.el5_5.2
db4-tcl-4.3.29-10.el5_5.2
db4-devel-4.3.29-10.el5_5.2
确认安装PAM服务相关部件:
查看是否安装pam
rpm -qa|grep pam
[root@gb ~]# rpm -qa|grep pam
pam_smb-1.1.7-7.2.1
pam_pkcs11-0.5.3-23
pam-devel-0.99.6.2-6.el5_5.2
pam_ccreds-3-5
pam_passwdqc-1.0.2-1.2.2
pam-0.99.6.2-6.el5_5.2
pam_krb5-2.2.14-21.el5
1.安装Vsftpd服务相关部件:
2.确认安装PAM服务相关部件:
[root@beidou8.com ~]# yum install pam*
开发包,其实不装也没有关系,主要的目的是确认PAM。
3.安装DB4部件包:
这里要特别安装一个db4的包,用来支持文件数据库。
[root@beidou8.com ~]# yum install db4*
===
使用yum泛字符搜索并安装
yum -y install db4* pam*
Running Transaction
  Updating       : pam_krb5                                                 1/5
  Installing     : db4-tcl                                                  2/5
  Installing     : db4-java                                                 3/5
  Installing     : db4-devel                                                4/5
  Cleanup        : pam_krb5                                                 5/5
Installed:
  db4-devel.i386 0:4.3.29-10.el5_5.2      db4-java.i386 0:4.3.29-10.el5_5.2
  db4-tcl.i386 0:4.3.29-10.el5_5.2
Updated:
  pam_krb5.i386 0:2.2.14-21.el5
===
(二).下载编译安装包,编译,编译安装
1.下载
wget
http://www.92csz.com/downloads/vsftpd-2.3.4.tar.gz
wget http://xiazai.xiazaiba.com/Soft/V/vsftpd-2.3.4.tar.gz
wget http://down1.chinaunix.net/distfiles/vsftpd-2.3.4.tar.gz
wget http://www.92csz.com/downloads/vsftpd-2.3.4.tar.gz
wget http://source.ipfire.org/source-2.x/vsftpd-2.3.4.tar.gz
wget ftp://ftp.pku.edu.cn/open/ftp/vsftpd/vsftpd-2.3.4.tar.gz
wget http://www.baiyuxiong.com/wp-content/uploads/2011/07/vsftpd-2.3.4.tar.gz
上面是目前互联网有效的下载地址,使用我惯用的方法,从资源中找到目前互联网有效的下载的地址。探寻下载地址的方法非常好用,百发百中。
http://download.chinaunix.net/download/0001000/19.shtml
2.解压
tar zxvf vsftpd-2.3.4.tar.gz
cd vsftpd-2.3.4
3.建立默认文件夹,编译,安装编译
3A.建立默认文件夹
mkdir -p /usr/local/man/man8 #//安装编译的时候保存的默认文件目录。可能你的系统已经存在此目录,那就不用建立
mkdir -p /usr/local/man/man5 #//安装编译的时候保存的默认文件目录。可能你的系统已经存在此目录,那就不用建立
3B.编译,安装编译
make && make install
cd ../
 
三、提供参考
创建必要的帐号,目录: 
# useradd nobody  //可能你的系统已经存在此帐号,那就不用建立
# mkdir /usr/share/empty  //可能你的系统已经存在此目录,那就不用建立
# mkdir /var/ftp  //可能你的系统已经存在此目录,那就不用建立
# useradd -d /var/ftp ftp  //可能你的系统已经存在此帐号,那就不用建立
# chown root:root /var/ftp
# chmod og-w /var/ftp
请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin
========================================================================
touch /etc/vsftpd.user_list
mkdir /etc/vsftpd
touch /etc/vsftpd/chroot_list
echo "/usr/local/sbin/vsftpd &" >> /etc/rc.local
mkdir /var/ftp
touch /etc/vsftpd/userlist.chroot
touch /etc/vsftpd/userlist_deny.chroot
touch /var/log/vsftpd.log
mkdir -p /usr/share/empty
========================================================================
 
四、重要提示:
由于这里建立vsftpd的虚拟用户登录,编译前请一定要确定 支持PAM认证方式
虚拟用户形式实现(db及mysql形式)
# cd vsftpd-2.3.4  //进入vsftpd-2.0.3的源代码目录
# make clean  //清除编译环境
# vi builddefs.h  \\继续编辑builddefs.h 文件,文件内容如下:
#ifndef VSF_BUILDDEFS_H
#define VSF_BUILDDEFS_H
#undef VSF_BUILD_TCPWRAPPERS
#define VSF_BUILD_PAM
#define VSF_BUILD_SSL
#endif /* VSF_BUILDDEFS_H */
将以上define VSF_BUILD_PAM行的undef改为define,支持tcp_wrappers,支持PAM认证方式,支持SSL,和匿名用户形式是一样的。 
# make  //直接在vsftpd-2.0.3里用make编译
# ls -l vsftpd
-rwxr-xr-x 1 root root 108300 Sep 27 11:15 vsftpd  //可执行程序已被编译成功
========================================================================
源码安装默认不支持tcp_wrappers和ssl
需要修改builddefs.h
/*默认值如下:*/
#undef VSF_BUILD_TCPWRAPPERS  /*是否支持TCP WRAPPERS*/
#define VSF_BUILD_PAM  /*是否支持自定义虚拟用户登录*/
#undef VSF_BUILD_SSL  /*是否支持SSL传输*/
/*支持则将对应项设为define,否则设为undef*/
========================================================================
如何查看vsftpd是否支持PAM认证方式?
查看编译的vsftpd二进制文件是否加载了pam
ldd vsftpd
如下:
        linux-gate.so.1 =>  (0x00393000)
        libwrap.so.0 => /lib/libwrap.so.0 (0x00969000)
        libnsl.so.1 => /lib/libnsl.so.1 (0x00af7000)
        libpam.so.0 => /lib/libpam.so.0 (0x00b9d000)
        libdl.so.2 => /lib/libdl.so.2 (0x00947000)
        libresolv.so.2 => /lib/libresolv.so.2 (0x00106000)
        libutil.so.1 => /lib/libutil.so.1 (0x041a1000)
        libcap.so.1 => /lib/libcap.so.1 (0x00b12000)
        libc.so.6 => /lib/libc.so.6 (0x007ec000)
        libaudit.so.0 => /lib/libaudit.so.0 (0x00b82000)
        /lib/ld-linux.so.2 (0x007c8000)
看到libpam.so.0 => /lib/libpam.so.0 (0x00fc4000)表示已成功加载pam认证模块

五、配置文件操作解说
1.建立虚拟用户对应的系统真实用户
useradd -d /data/www -s /sbin/nologin wwwftp
/data/www是用户的默认home目录;不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin
useradd -d /home/vftpsite -s /sbin/nologin vftpuser
2.建立db数据库,同时只有root用户才能读写
#vim /etc/vsftpd/vftpuser.txt
jimmyli.blog.51cto.com
123456
user1
password1
格式为第一行为用户名名,第二行为密码,然后类推
建立db数据库,同时只有root用户才能读写
db_load -T -t hash -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vsftpd_login.db
chmod 600 /etc/vsftpd/vsftpd_login.db
3.配置pam文件
(32位系统)
vim /etc/pam.d/vsftpd.vu
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
vim /etc/pam.d/vsftpd.vu (64位系统)
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
cat /etc/pam.d/vsftpd
注意:上面的/etc/vsftpd/vsftpd_login 与 建立的 /etc/vsftpd/vsftpd_login.db 是对应关系。
4.默认的配置文件位置
vim /etc/vsftpd.conf
 
六、简单配置实例:
/etc/vsftpd.conf
===
local_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd.vu
guest_enable=YES
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
pasv_min_port=5000
pasv_max_port=6000
===touch user1 user2
vim /etc/vsftpd/vsftpd_user_conf/user1
guest_username=wwwftp
write_enable=YES
anonymous_enable=NO
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
download_enable=Yes
local_root=/data/www/user1
===
vim /etc/vsftpd/vsftpd_user_conf/user2
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/home/vftpsite/jimmyli.blog.51cto.com
===
停止vsftpd进程
pkill vsftpd
启动vsftp
/usr/local/sbin/vsftpd &
 
七、参考实例
vsftpd.conf 配置参考说明:
========================================================================
# 以独立的FTP服务运行
listen=yes
# 允许本地用户登录
local_enable=YES
# 本地用户的写权限
write_enable=YES
# 使用FTP的本地文件权限,默认为077
# 一般设置为022
local_umask=022
# 切换目录时
# 是否显示目录下.message的内容
dirmessage_enable=YES
# 激活上传/下载的日志
xferlog_enable=YES
# 启用FTP数据端口的数据连接
connect_from_port_20=YES
pam_service_name=vsftpd
tcp_wrappers=YES
# 用userlist来限制用户访问
#userlist_enable=yes
one_process_model=NO #无说明
# 允许匿名登录
anonymous_enable=NO
guest_enable=YES #启动vsftpd的虚拟用户功能
guest_username=wwwftp
user_config_dir=/etc/vsftpd_user_config
user_sub_token=$USER
========================================================================
八、常见错误及解决方法
登录错误1:
500 OOPS: cannot locate user entry:wwwftp
当guest_username=wwwftp配置时,系统没有建立wwwftp系统账号导致错误。
解决方法:创建账号
登录错误2:
500 OOPS: cannot change directory:/data/www
当配置文件设置了local_root=/data/www/,但系统没有建立文件夹
解决方法:创建目录
登录错误3:
配置文件开启虚拟用户登陆,但用户无法登陆:
[右] USER adminftp
[右] 331 Please specify the password.
[右] PASS (隐藏)
[右] 530 Login incorrect.
[右] 连接失败
解决方法:检查VSFTP编译安装的时候,时候支持pam,有无加载了pam。
登录错误4:
单独用户未指定用户home目录时候,默认转到的目录为“/var/ftp/”
解决方法:建立默认目录
请关注连载续篇,欢迎朋友一起交流,讨论。扣扣:柒⑥柒陆叁⑤叁伍。
[End]