注:以下所有操作均在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=(nobody) gid=(nobody) 组=(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..tar.gz
# cd vsftpd-3.0.
# 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.

这个时候表示安装已经成功。由于采用的是默认安装,所以应用这些默认配置:

  • 主程序文件:/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./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 /var/ftp

然后尝试启动ftp服务器:

# /usr/local/sbin/vsftpd &
[]

在本地连接FTP服务器进行测试(如果当前系统没有ftp命令可以yum安装一个) :

# ftp 12.24.67.13
Connected to 12.24.67.13 (12.24.67.13).
(vsFTPd 3.0.)
Name (12.24.67.13:root): anonymous
Please specify the password.
Password:
Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> nlist
Entering Passive Mode (,,,1,,).
Here comes the directory listing.
nginx-1.7..tar.gz
php-5.6..tar.gz
are.tar
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=(vsftpd) gid=(vsftpd) 组=(vsftpd) # chown -R vsftpd:vsftpd /data/vsftpd
# chmod a-w /data/vsftpd
# chmod /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 &
[]

这个时候可以测试匿名用户是否可以登录:

# ftp 12.24.67.13
Connected to 12.24.67.13 (12.24.67.13).
(vsFTPd 3.0.)
Name (12.24.67.13:root): anonymous
Please specify the password.
Password:
Login incorrect.
Login failed.
ftp> bye

可以看到匿名用户已经没办法登录,接下来看虚拟用户:

# ftp 12.24.67.13
Connected to 12.24.67.13 (12.24.67.13).
(vsFTPd 3.0.)
Name (12.24.67.13:root): brishenzhou
Please specify the password.
Password:
Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> nlist
Entering Passive Mode (,,,1,,).
Here comes the directory listing.
Directory send OK.
ftp> bye

注:上面输入的密码是前面设置的对应brishenzhou用户的密码,密码是brishenzhou_pwd。

注:如果在ftp连接中出现如下错误:

 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: -
# 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
[ -x /usr/local/sbin/vsftpd ] || exit
RETVAL=
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.
# rm /usr/local/man/man8/vsftpd.
# rm /etc/xinetd.d/vsftpd
# rm -rf /etc/vsftpd
# rm -rf /var/ftp
# rm -rf /data/vsftpd

【推荐】CentOS安装vsftpd-3.0.3+安全配置的更多相关文章

  1. [转]Tomcat9.0安装教程 Tomcat9.0环境变量配置教程

    [转]Tomcat9.0安装教程 Tomcat9.0环境变量配置教程 [转]超详细MySQL安装及基本使用教程

  2. CentOS安装vsftpd

    版本:vsftpd-3.0.2-9.el7.x86_64(CentOS是64位的). 1.安装vsftpd yum -y install vsftpd 2.配置vsftpd 修改配置前把原始配置文件备 ...

  3. Centos 安装vsftpd 服务器

    一:检查有没有安装vsftpd 二:安装vsftpd 三:安装之后重启 四:修改vsftpd配置文件 配置文件路径在/etc/vsftpd目录下 默认是注释掉的,把#号去掉 然后重启vsftpd 五: ...

  4. centos 安装 vsftpd

    1.安装vsftpd yum -y install vsftpd 2.编辑vsftpd的配置文件 cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf- ...

  5. Linux\CentOS 安装 vsftpd 服务器

    安装 查看电脑是否存在 vsftpd 服务器 rmp -qa|grep vsftpd 如果有就删除,没有就使用yum 安装 vsftpd yum -y install vsftpd 配置 在根目录下创 ...

  6. CentOS 安装Nginx1.14.0

    原文地址:http://www.cnblogs.com/ascd-eg/p/9275441.html 一.安装所需环境   1.gcc 安装         yum install gcc-c++   ...

  7. centos 安装 redis3.2.0 集群

    这里创建6个redis节点,其中三个为主节点,三个为从节点. redis和端口对应关系: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 从: 127.0.0 ...

  8. centos 安装 opencv-3.1.0

    官方安装教程 http://docs.opencv.org/3.1.0/d9/d52/tutorial_java_dev_intro.html#gsc.tab=0 注意要先安装jdk和apache a ...

  9. CentOS安装python3.5.0+uwsgi+nginx

    1安装编译工具 yum install zlib-devel bzip2-devel openssl-devel python-devel kernel-devel libffi-devel ncur ...

  10. centos 安装单机版 redis4.0.10

    redis源码地址: http://download.redis.io/releases/ 下载 redis-4.0.10.tar.gz  和  redis-stable.tar.gz 第一步:安装g ...

随机推荐

  1. mybatis中分页查询

    1 如果在查询方法中有多个参数,可以使用map对象将所有数据都存储进去.比如分页查询,需要用到两个参数,可以将这两个参数包装到map中. 例子:分页查询 dao层方法 public List<S ...

  2. unity, 不要用TextMesh,用图片代替

    <方块鸭快跑>(见:http://www.cnblogs.com/wantnon/p/4596222.html)1.0版本开始界面中鸭子的speech bubble中的文字用的是TextM ...

  3. tensorflow 之模型的保存与加载(三)

    前面的两篇博文 第一篇:简单的模型保存和加载,会包含所有的信息:神经网络的op,node,args等; 第二篇:选择性的进行模型参数的保存与加载. 本篇介绍,只保存和加载神经网络的计算图,即前向传播的 ...

  4. js模块化规范AMD、CMD、CommonJS...

    1. AMD 1.1 什么是AMD? AMD 英文名 Asynchronous Module Definition ,中文名 异步模块定义 .这是一个浏览器模块化开发的规范. 由于浏览器环境执行环境的 ...

  5. C++类成员指针(指向类成员的指针)

    1.指向类的数据成员的指针: 声明格式如下: <类型说明符> <类名>::* <指针变量名>; 2.指向类的成员函数的指针: 声明格式如下:   <类型说明符 ...

  6. JavaScript学习日志(2)

    javascript数据类型: 字符串string.数字number.未定义Undefined.空Null.布尔Boolean.数组Array.对象Object.javascript对象: 对象由花括 ...

  7. jsp tag 直接文件实现

    引入 <%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %> 这里注意/WEB-INF/tags ...

  8. java printf long

    System.out.printf("%d\n", 1000000000000000000L); 

  9. PHP学习笔记(1)数组函数

    1.数组的键值操作函数: $arr = array("小明" => 98, "小红" => 76, "小黑" => 66, ...

  10. PHP标签

    1.PHP原标签 2.脚本标签 3.短标签 需要short_open_tag=on,默认情况下为on 4.asp标签 需要asp_tags为on,默认为off