一、环境
CentOS 5.6
x86_64
ip:192.168.10.100
二、编译依赖组件
yum -y install gcc gcc-c++ db4-utils pam-devel
三、编译安装配置vsftpd
1、编译
wget https://security.appspot.com/downloads/vsftpd-3.0.2.tar.gz
tar -zxf vsftpd-3.0.2.tar.gz
cd vsftpd-3.0.2
#vi builddefs.h
#define VSF_BUILD_TCPWRAPPERS //允许使用TCP Wrappers(默认是undef)
#define VSF_BUILD_PAM //允许使用PAM认证
#define VSF_BUILD_SSL //允许使用SSL(默认是undef)
make && make install
mkdir /etc/vsftpd/
cp vsftpd.conf /etc/vsftpd/vsftpd.bak
grep -v ‘^#‘ /etc/vsftpd/vsftpd.bak > /etc/vsftpd/vsftpd.conf
#为了让vsftpd支持本地用户登录,讲身份认证模块拷贝至系统目录中
cp RedHat/vsftpd.pam /etc/pam.d/vsftpd
2、配置vsftpd独立启动
#vi /etc/xinetd.d/vsftpd
将disable中no改成yes
3、服务启动脚本的制作
在standalone 模式中,经常用上面的命令启动服务比较麻烦,我们做一个脚本来启动和停止服务。建立一个新文件/etc/rc.d/init.d/vsftpd,把以下内容复制到文件中:
#!/bin/bash
#
# vsftpd This Shell script takes care of starting and stopping
# standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program
# that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x /usr/local/sbin/vsftpd ] || exit 0
RETVAL=0
prog="vsftpd"
start() {
# Start daemons.
if [ -d /etc/vsftpd ] ; then
for i in `ls /etc/vsftpd/*.conf`; do
site=`basename $i .conf`
echo -n $"Starting $prog for $site: "
/usr/local/sbin/vsftpd $i &
RETVAL=$?
[ $RETVAL -eq 0 ] && {
touch /var/lock/subsys/$prog
success $"$prog $site"
}
echo
done
else
RETVAL=1
fi
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
stop
start
RETVAL=$?
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
RETVAL=$?
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
exit $RETVAL
保存文件,再给该文件加上执行权限:
# chmod 755 /etc/rc.d/init.d/vsftpd
这样我们就可以通过下面的方法来管理服务了:
# service vsftpd {start|stop|restart|condrestart|status}
例如重新启动服务:
# service vsftpd restart
Shutting down vsftpd: [OK ]
Starting vsftpd for vsftpd: [OK ]
四、创建虚拟用户
1. 添加虚拟用户口令文件
[root@ftp /]#vi /etc/vsftpd/vuser.txt
添加虚拟用户名和密码,一行用户名,一行密码,以此类推。奇数行为用户名,偶数行为密码。
test001 #用户名
123456 #密码
test002 #用户名
123456 #密码
2. 生成虚拟用户口令认证文件
将刚添加的vuser.txt虚拟用户口令文件转换成系统识别的口令认证文件。
[root@CentOS5 /]#db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
3. 编辑vsftpd的PAM认证文件
[root@CentOS5 /]#vi /etc/pam.d/vsftpd
将里面其他的都注释掉,添加下面这两行:
auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vuser
4. 建立本地映射用户并设置宿主目录权限
所有的FTP虚拟用户需要使用一个系统用户,这个系统用户不需要密码。
[root@CentOS5 /]#useradd vftp -d /data -s /bin/false
5. 配置vsftpd.conf(设置虚拟用户配置项)
[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf
guest_enable=YES #开启虚拟用户
guest_username=vftp #FTP虚拟用户对应的系统用户
pam_service_name=vsftpd #PAM认证文件
6. 重启vsftpd服务
[root@CentOS5 /]#service vsftpd restart
7. 测试虚拟用户登录FTP
Z:>ftp 192.168.10.100
连接到192.168.10.100。
220 Welcome to this FTP server
用户(17192.168.10.100(none)):test001
331 Please specify the password.
密码:
230 login successful.
配置文件实例
/etc/vsftpd/vsftpd.conf
listen=yes
ftpd_banner=Welcome to this FTP Server
local_enable=yes
anonymous_enable=no
chroot_local_user=yes
user_config_dir=/etc/vsftpd/userconfig
guest_enable=yes
guest_username=vftp
pam_service_name=vsftpd
write_enable=yes
download_enable=yes
dirlist_enable=yes
hide_ids=yes
use_localtime=yes
check_shell=no
虚拟用户配置实例
/etc/vsftpd/userconfig/test001
test001的根目录为/data,权限为可上传、下载、创建、改名和删除的权限。
local_root=/data
anon_world_readable_only=no
write_enable=yes
anon_upload_enable=yes
anon_other_write_enable=yes
anon_mkdir_write_enable=yes
遇到的问题及解决方法:
/lib/libcap.so.1: could not read symbols: file in wrong format
collect2: ld returned 1 exit status
make: *** [vsftpd] Error 1
解决方法:
修改vsftpd 源码包的vsf_findlibs.sh
vi vsf_findlibs.sh
将locate_library /lib/libpam.so.0 && echo "/lib/libpam.so.0";
改为locate_library /lib64/libpam.so.0 && echo "/lib64/libpam.so.0";
/lib/libcap.so.1: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make: *** [vsftpd] Error 1
解决方法:
同样修改vsf_findlibs.sh
将
# look for libcap (capabilities)
if locate_library /lib/libcap.so.1; then
echo "/lib/libcap.so.1";
else
locate_library /usr/lib/libcap.so && echo "-lcap";
locate_library /lib/libcap.so && echo "-lcap";
fi
修改为
# Look for libcap (capabilities)
if locate_library /lib64/libcap.so.1; then
echo "/lib64/libcap.so.1";
else
locate_library /usr/lib64/libcap.so && echo "-lcap";
locate_library /lib64/libcap.so && echo "-lcap";
fi
3、500 OOPS: vsftpd: refusing to run with writable root inside chroot()
解决方法:
这个错误是在v2.3.5以后才有的,见官方changlog如下(意思是不能使用chroot限制可写的根目录):
Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite people who carelessly
turned on chroot_local_user but such is life.
好吧,我们如果启用chroot,必须保证ftp根目录不可写,这样对于ftp根直接为网站根目录的用户不方便,所以建议假如ftp根目录是/data,那么网站结构可以这样分,/data/log为日志目录,/data/web为网站根目录,这样我们就可以去掉/data目录的写入权限而不影响网站的正常运行。
chmod a-w /data