注:以下所有操作均在CentOS 6.5 x86_64位系统下完成。
FTP的登录一般有三种方式,分别是:
- 匿名用户形式:默认安装的情况下,系统只提供匿名用户访问,只需要输入用户anonymous/ftp,并将自己的Email作为口令即可登录。
- 本地用户形式:以/etc/passwd中的用户名为认证方式。
- 虚拟用户形式:支持将用户名和密码保存在文件或数据库中,将登录用户映射到指定的系统账号(/sbin/nologin)来访问资源,其中这些虚拟用户是FTP的用户。
这里我们选择了vsftpd这一款常用的FTP服务器软件来搭建FTP服务器。
#准备工作#
这里采用基于PAM的虚拟用户,需要先用yum来安装PAM的组件:
# yum install pam # yum install pam-devel # yum install db4-utils
另外,在默认配置下vsftpd需要使用nobody用户和/usr/share/empty这个目录,查看这两个东西是否存在,如果不存在则添加之(默认是都有了) :
# id nobody uid=99(nobody) gid=99(nobody) 组=99(nobody)
# ls /usr/share/empty
#vsftpd的安装#
vsftpd的源码包里并没有configure文件, 所以没办法类似安装其他软件那样指定安装路径,要修改只有两种方法:
- 修改Makefile文件
- 修改.c源文件
为了不至于过于麻烦, ,这里没有做任何修改,直接编译安装:
# wget https://security.appspot.com/downloads/vsftpd-3.0.3.tar.gz # tar zxf vsftpd-3.0.3.tar.gz # cd vsftpd-3.0.3 # make && make install
注:x86_64位系统在make的时候可能会提示错误:
/usr/bin/ld: cannot find -lcap
这是因为其只会去/lib/或/usr/lib/下查找,而x86_64应该去/lib64/和/usr/lib64/中查找才对,所以需要修改vsf_findlibs.sh文件:
# cp vsf_findlibs.sh vsf_findlibs.sh.default # vim vsf_findlibs.sh // 统一把/lib/改成/lib64/,而/usr/lib则改成/usr/lib64
修改完之后再来编译安装:
# make clean # make && make install # vsftpd -v vsftpd: version 3.0.3
这个时候表示安装已经成功。由于采用的是默认安装,所以应用这些默认配置:
- 主程序文件:/usr/local/sbin/vsftpd
- 主配置文件:/etc/vsfptd.conf
- PAM认证文件:/etc/pam.d/vsftpd
- 匿名用户主目录:/var/ftp
- 匿名用户的下载目录:/var/ftp/pub
接下来修改配置文件并且创建默认的共享目录:
# mkdir /etc/vsftpd/ # cp /usr/local/src/vsftpd-3.0.3/vsftpd.conf /etc/vsftpd/vsftpd.conf # cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.default # mkdir -p /var/ftp/pub # chown root:root /var/ftp # chmod 755 /var/ftp
然后尝试启动ftp服务器:
# /usr/local/sbin/vsftpd & [1] 18181
在本地连接FTP服务器进行测试(如果当前系统没有ftp命令可以yum安装一个) :
# ftp 12.24.67.13 Connected to 12.24.67.13 (12.24.67.13). 220 (vsFTPd 3.0.3) Name (12.24.67.13:root): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> nlist 227 Entering Passive Mode (12,24,67,13,100,50). 150 Here comes the directory listing. nginx-1.7.8.tar.gz php-5.6.4.tar.gz are.tar 226 Directory send OK. ftp> bye
注:由于默认是允许匿名用户登录的,所以用户名输入anonymous而口令直接回车输入空即可登录。
至此,vsftpd已经安装完毕并可以正常启动,但是这种允许匿名的连接方式是不安全的,所以下面我们仍然需要进行一些安全配置来加固。
#vsftpd的安全配置#
vsftpd的安全原则主要有两个:
- 只允许支持虚拟用户登录,关闭本地用户和匿名用户。
- 不允许使用root权限运行。
1)首先创建虚拟用户口令明文文件,使用前面安装的db4-utils组件生成口令认证文件:
# vim /etc/vsftpd/access.txt
brishenzhou
brishenzhou_pwd
# db_load -T -t hash -f /etc/vsftpd/access.txt /etc/vsftpd/access.db
注:access.txt中一行用户名+一行密码,保持这样。
2)编辑vsftpd的PAM认证文件:
# vim /etc/pam.d/vsftpd auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/access account required /lib64/security/pam_userdb.so db=/etc/vsftpd/access
注:这里使用的就是/etc/vsftpd/access.db文件。
3)所有的虚拟用户都需要使用一个系统本地用户,所以这里创建一个不需要登录的系统本地用户,并且设定它的主目录是/data/vsftpd:
# id vsftpd id: vsftpd:无此用户 # groupadd vsftpd # mkdir -p /data/vsftpd/pub # useradd -g vsftpd -d /data/vsftpd -s /sbin/nologin vsftpd # id vsftpd uid=504(vsftpd) gid=504(vsftpd) 组=504(vsftpd) # chown -R vsftpd:vsftpd /data/vsftpd # chmod a-w /data/vsftpd # chmod 777 /data/vsftpd/pub
注:由于需要启用chroot,这里的根目录/data/vsftpd必须不可写,所以不能上传文件,可以新增一个pub的目录来放上传的文件。
4)配置vsftpd开启虚拟用户选项:
# vim /etc/vsftpd/vsftpd.conf #禁止匿名用户 anonymous_enable=NO local_enable=YES write_enable=YES #不启动锁定用户名单,所有的用户都将被锁定不允许访问上级目录,只允许访问其主目录 chroot_local_user=YES chroot_list_enable=NO #启动log xferlog_enable=YES xferlog_std_format=YES xferlog_file=/etc/vsftpd/vsftpd.log #开启虚拟用户 guest_enable=YES #FTP虚拟用户对应的系统用户 guest_username=vsftpd #PAM认证文件/etc/pam.d/vsftpd pam_service_name=vsftpd virtual_use_local_privs=YES
4)最后让vsftpd加载指定的配置文件来启动:
# vsftpd /etc/vsftpd/vsftpd.conf & [1] 19570
这个时候可以测试匿名用户是否可以登录:
# ftp 12.24.67.13 Connected to 12.24.67.13 (12.24.67.13). 220 (vsFTPd 3.0.3) Name (12.24.67.13:root): anonymous 331 Please specify the password. Password: 530 Login incorrect. Login failed. ftp> bye
可以看到匿名用户已经没办法登录,接下来看虚拟用户:
# ftp 12.24.67.13 Connected to 12.24.67.13 (12.24.67.13). 220 (vsFTPd 3.0.3) Name (12.24.67.13:root): brishenzhou 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> nlist 227 Entering Passive Mode (12,24,67,13,54,136). 150 Here comes the directory listing. 226 Directory send OK. ftp> bye
注:上面输入的密码是前面设置的对应brishenzhou用户的密码,密码是brishenzhou_pwd。
注:如果在ftp连接中出现如下错误:
500 OOPS: prctl PR_SET_SECCOMP failed
则在/etc/vsftpd/vsftpd.conf文件中加入下面这句:
#vim /etc/vsftpd/vsftpd.conf
seccomp_sandbox=NO
注:如果在ftp连接中出现如下错误:
425 Security: Bad IP connecting.
则在/etc/vsftpd/vsftpd.conf文件中加入下面这句:
#vim /etc/vsftpd/vsftpd.conf
pasv_promiscuous=YES
可以看到登录成功,并且登录上去看到的是系统本地用户vsftpd的目录:/data/vsftpd/。
如果是使用FlashFTP等软件登录,可以配置如下:
#vsftpd的启动/关闭#
为了方便,这里写一个service启动vsftpd的脚本:
# vim /etc/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 +x /etc/init.d/vsftpd
另外,由于使用的是单独启动模式,而不是xinetd,所以修改文件:
# vim /etc/xinetd.d/vsftpd
disable:yes
之后,就可以使用以下命令来开启/关闭vsftpd了:
service vsftpd start
service vsftpd stop
#vsftpd的卸载#
用于没有给vsftpd-3.0.3的安装指定安装目录,所以在卸载的时候需要把以下对应的文件删除:
# rm /usr/local/sbin/vsftpd # rm /usr/local/man/man5/vsftpd.conf.5 # rm /usr/local/man/man8/vsftpd.8 # rm /etc/xinetd.d/vsftpd # rm -rf /etc/vsftpd # rm -rf /var/ftp # rm -rf /data/vsftpd