注:以下所有操作均在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.2+安全配置的更多相关文章

  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. CloudNotes云端个人笔记系统系列文章汇总

    [CloudNotes版本更新信息与下载地址:http://cloudnotes.cloudapp.net/webapi/Home/Release] [CloudNotes RESTful API帮助 ...

  2. 浅析String不可变性

    在所有编程语言领域,我想字符串应该是地球上最常用的表达手段了吧. 在java的世界里,String是作为类出现的,核心的一个域就是一个char数组,内部就是通过维护一个不可变的char数组,来向外部输 ...

  3. 关于WEB Service&WCF&WebApi实现身份验证之WebApi篇

    之前先后总结并发表了关于WEB Service.WCF身份验证相关文章,如下: 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇. 关于WEB S ...

  4. Github团队开发示例(一)

    Github团队开发示例(二) 作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/6044837.html 我们可以在Github上管理自己的团队项目.团队 ...

  5. iOS页面间传值的一些方式总结

    废话不多说,直接进入主题: 这里要说的方式有6种:1.属性传值 2.block 3.delegate 4.UserDefault 5.单例 6.通知(篇幅原因我只写核心代码,如果看不懂可以直接在最下面 ...

  6. Windows 10 版本 1507 中的新 AppLocker 功能

    要查看 Windows 10 版本信息,使用[运行]> dxdiag  回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...

  7. 基于CkEditor实现.net在线开发之路(5)列表页面开发

    这章主要讲解利用控件开发列表页面,我们先从最简单的列表页面开始讲解,这个列表只有一个列表展示.具体开发步骤请看下面动态图 由上动态图可以看出,开发一个简单的列表只有两步, 第一步:拖拽查询控件,设置好 ...

  8. 基于小脚丫DDS 调频 调幅 调相 切换波形 AD5601输出模拟波形

    先讲讲里面的矩阵键盘,矩阵键盘列有下拉电阻,默认全为0000,默认行输入为1111,当有按键按下的时候,列输入会被拉高,这时控制行的输出做行扫描,电子琴用key_flag_r0电平作为使能,这里用ke ...

  9. 转载:《TypeScript 中文入门教程》 15、可迭代性

    版权 文章转载自:https://github.com/zhongsp 建议您直接跳转到上面的网址查看最新版本. 可迭代性 当一个对象实现了Symbol.iterator属性时,我们认为它是可迭代的. ...

  10. c#中奖算法的实现

    算法名称 Alias Method public class AliasMethod { /* The probability and alias tables. */ private int[] _ ...