一、环境
CentOS 5.6 x86_64
ip:192.168.10.100
二、编译依赖组件
yum -y install gcc gcc-c++ db4-utils pam-devel libcap
三、编译安装配置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 /]#useradd test -s /sbin/nolog -d /var/opt/test
[root@ftp /]#passwd test
3. 编辑vsftpd的PAM认证文件
[root@CentOS5 /]#vi /etc/pam.d/vsftpd
如果系统是64位,将lib改为lib64
5. 配置vsftpd.conf
[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf seccomp_sandbox=no local_enable=YES write_enable=YES local_umask=022 idle_session_timeout=600 data_connection_timeout=120 chroot_list_enable=YES chroot_local_user=NO chroot_list_file=/etc/vsftpd/chroot_list pam_service_name=vsftpd hide_ids=YES user_config_dir=/etc/vsftpd/vsftpd_user_dir userlist_enable=NO userlist_deny=NO userlist_file=/etc/vsftpd/user_list allow_writeable_chroot=YES xferlog_file=/var/log/vsftpd.log xferlog_std_format=YES
6. 重启vsftpd服务
[root@CentOS5 /]#service vsftpd restart
7. 用户配置文件
在/etc/vsftpd目录下增加文件和目录
文件chroot_list,user_list,并将用户test添加到文件中
目录vsftpd_user_dir,在目录下创建用户对应的文件test
vi test
local_root=/var/opt/cms_video local_umask=022 local_max_rate=500000000
遇到的问题及解决方法:
/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
4. 报530 Login incorrect无法登录问题解决
验证/etc/pam.d/vsftpd 文件中lib是否是lib64