共计 6314 个字符,预计需要花费 16 分钟才能阅读完成。
注:以下所有操作均在 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://olex-secure.openlogic.com/content/openlogic/vsftpd/3.0.2/vsftpd-3.0.2.tar.gz
# tar zxf vsftpd-3.0.2.tar.gz
# cd vsftpd-3.0.2
# 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.2
这个时候表示安装已经成功。由于采用的是默认安装,所以应用这些默认配置:
- 主程序文件:/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.2/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.2)
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.2)
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.2)
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。
可以看到登录成功,并且登录上去看到的是系统本地用户 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.2 的安装指定安装目录,所以在卸载的时候需要把以下对应的文件删除:
# 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
FTP 协议详解与 vsftpd 在 Linux 上的安装配置 http://www.linuxidc.com/Linux/2016-09/134831.htm
玩转 vsftpd 服务器的四大高级配置:http://www.linuxidc.com/Linux/2013-09/90565.htm
vsFTPd 配置教程:http://www.linuxidc.com/Linux/2013-09/90562.htm
Ubuntu 实用简单的 FTP 架设 http://www.linuxidc.com/Linux/2012-02/55346.htm
Ubuntu 上架设 FTP 服务器和 Apache 服务器 http://www.linuxidc.com/Linux/2011-04/35295.htm
Ubuntu 13.04 安装 LAMP\vsftpd\Webmin\phpMyAdmin 服务及设置 http://www.linuxidc.com/Linux/2013-06/86250.htm
RHEL6 平台下 SeLinux 和 vsftpd 的匿名上传的简单案例 http://www.linuxidc.com/Linux/2013-04/82300.htm
Linux 系统 vsftpd 源码安装 http://www.linuxidc.com/Linux/2013-03/81475.htm
openSUSE 13.2/13.1 下安装配置 FTP 服务器 vsftpd http://www.linuxidc.com/Linux/2014-12/110070.htm
CentOS7 基于虚拟用户的 vsftpd http://www.linuxidc.com/Linux/2016-11/137150.htm
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-12/138040.htm