您好,欢迎来到测品娱乐。
搜索
您的当前位置:首页第13章 使用vsftpd构建安全的FTP服务

第13章 使用vsftpd构建安全的FTP服务

来源:测品娱乐


第13章 使用vsftpd构建安全的FTP服务

本章重点

vsftpd的特性及安装过程

配置文件介绍

启动 FTP 服务

安全配置vsftpd.conf

FTP协议的安全隐患不能成为拒绝使用FTP的原因,本文介绍一种构建安全FTP服务的方法。

文件传输协议(FTP)是互联网上用户使用频率很高的一种协议,它基于客户机/服务器(client/server)架构,主要用来提供用户的文件传输以及上传下载功能。然而,由于该协议在最初的设计过程当中没有充分考虑到网络日益发展的今天可能存在的诸多安全性问题,因而存在着很大的安全隐患。本文将对该文件传输协议进行原理介绍,并讲述如何在Linux环境下,使用vsftpd(very secure FTP daemon)来构建安全的FTP应用。

一、vsftpd的特性

vsftpd 是一个基于GPL发布的类Unix类操作系统上运行的服务器的名字(是一种守护进程),它可以运行在诸如Linux、BSD、Solaris、HP-UX以及IRIX上面。它支持很多

其他传统的FTP服务器所不支持的特征。它具有如下特点:非常高的安全性、带宽、良好的扩展性 、支持创建虚拟用户、支持IPv6、支持虚拟IP、高速、稳定。

vsftpd的名字代表“very secure FTP daemon”,它的开发者Chris Evans考虑的首要问题就是数据传输的安全性。所以,在上述所有的特性当中,较高的安全性是处于最重要的地位。vsftpd比其他诸如Wu-ftpd和Proftpd之类的FTP服务器更加优越。另外,在速度方面,据统计,使用ASCⅡ模式下载数据的速度是Wu-ftpd的两倍。在Linux2.4系列版本的内核下,千兆以太网的下载速度可以达到86MB/S;在稳定性方面,根据ftp.redhat.com的数据,它可以支持15000个并发用户,所以其总体性能也是非常高的。

二、vsftpd的安装过程

vsftpd 守护程序的安装相当简单,在每个主要发行版中都可以找到vsftpd的RPM包,很多情况下,它已经被装上了。如果没有的话,源代码可以在网站:http://vsftpd.beasts.org/上找到,下载后执行手工安装。目前最新的版本为:vsftpd2.0.3。

得到源代码并解开tar包后,进入新建的目录,并运行make。下面是进行手工安装的示例:

# tar xzvf vsftpd-2.0.3.tar.gz

# cd vsftpd-2.0.3

# make

这之前我们应该看看用户“nobody”和目录“/usr/share/empty”是否存在,如果需要的话我们就新建这一对用户和目录。如果我们允许用户匿名访问,用户“ftp”和目录“var/ftp”也需要创建。使用如下两个命令完成:

# mkdir /var/ftp

# useradd -d /var/ftp ftp

由于安全原因,目录 “/var/ftp” 不应该属于用户 “ftp”,也不应该有写权限。如果用户已经存在的话,用下面的两个命令,我们可以改变目录的所有者并去掉其他用户的写权限:

# chown root.root /var/ftp

# chmod og-w /var/ftp

达到了所有的先决条件后,我们可以安装 vsftp-daemon 了。

# make install

这样,就完成了vsftpd的安装,当然,这个安装过程比较复杂,在我们现在使用的Linux系统当中,很多都是使用RPM包来安装的,这样简单快捷,下面介绍如何通过使用RPM包来安装vsftpd。

在RedHat Linux9中自带了vsftpd,下面是安装的步骤:

1. 首先查看是否安装了vsftpd,如果已经安装,则可以直接使用。

# rpm - q|grep vsftpd

2. 没有安装的话,将下载来的vsftpd-1.1.3-8.i386.rpm的RPM包进行安装。

# rpm - vh vsftpd-1.1.3-8.i386.rpm

通过以上两步,就能顺利地完成安装过程。

三、配置文件介绍

配置文件的路径为 /etc/vsftpd.conf。和Linux系统中的大多数配置文件一样,vsftpd的配置文件中以#开始注释,下面对配置文件的重要内容选项进行详细的介绍,合理的使用配置文件是保证FTP安全传输的前提。

查看配置文件:

#vi /etc/vsftpd.conf

设置是否允许匿名访问:

# Anonymus FTP-access permitted? YES/NO

anonymous_enable=NO

设置是否允许匿名上传文件:

# Permit anonymus upload? YES/NO

anon_upload_enable=NO

设置是否运允许匿名建立目录:

# Permission for anonymus users to make new directories? YES/NO

anon_mkdir_write_enable=NO

设置是否允许匿名用户进行删除或者改名等操作:

# Permission for anonymus users to do other write operations - like renaming or deleting? YES/NO

anon_other_write_enable=NO

设置是否允许本地用户登录:

# Log on by local users permitted? YES/NO

local_enable=YES

设置是否将本地用户锁定在主目录:

# Shall local users be locked into their home directory? YES/NO

chroot_local_user=YES

设置最高传输速度:

# Highest permitted data transfer rate in bytes per second for local logged on users. Default = 0 (unlimited)

local_max_rate=7200

设置是否允许通常的写操作:

# General write permission? YES/NO

write_enable=YES

设置是否在改变目录后发送消息:

# Enable messages when changing directories? YES/NO

dirmessage_enable=YES

设置服务器向登录客户端发送的欢迎信息:

# Welcome banner at users logon.

ftpd_banner=\"Welcome to neo5k's FTP service.\"

设置是否激活日志功能:

# Activate logging? YES/NO

xferlog_enable=YES

设置是否对所有的FTP操作作日志,如果设置是,则可能产生巨大的数据:

# Logging of all FTP activities? YES/NO

# Careful! This can generate large quantities of data.

log_ftp_protocol=NO

设置是否只允许在端口20建立连接:

# Confirm connections are established on port 20 (ftp data) only. YES/NO

connect_from_port_20=YES

设置无任何操作的超时时间:

# Timeout during idle sessions

idle_session_timeout=600

设置数据连接的超时时间:

# Data connection timeout

data_connection_timeout=120

设置访问所使用的PAM:

# Access through Pluggable Authentication Modules (PAM)

pam_service_name=vsftpd

设置工作模式是否为模式:

# Standalone operation? YES/NO - depending on operation mode xinetd, Standalone)

inetd, (

# The author's FTP service is being startet with xinetd, therefore the value here is NO.

listen=YES

设置是否使用tcp_wrappers作为主机访问控制方式:

tcp_wrappers =YES

四、启动 FTP 服务

启动vsftpd可以采用三种方式:inetd、xinetd和standalone()工作模式。由于目前使用的xinetd扩展了inetd,它比inetd更加高效和实用,包括诸如请求记录、访问控制、将业务与网络接口绑定等改进,所以通常使用xinetd,本文将介绍xinetd以及standalone两种启动方式。

1. xinetd方式启动

使用该启动方式,在上述的配置文件当中,应该将listen=YES设为list=NO,并且将tcp_wrappers=YES设为tcp_wrappers=NO,并且使用如下命令将vsftpd的文档目录拷贝到/etc/xinetd.d目录下:

# cp /usr/share/doc/vsftpd-1.1.3/vsftpd.xinetd /etc/xinetd.d/vsftpd

# vi /etc/xinetd.d/vsftpd

将disable=yes设为disable=no即可。一个关于该启动方式的的配置文件如下所示:

# cat /etc/xinetd.d/vsftpd

# default: on

# description: The vsftpd FTP server serves FTP connections. It uses \\

# normal, unencrypted usernames and passwords for authentication.

service ftp

{

socket_type = stream

wait = no

user = root

server = /usr/sbin/vsftpd

nice = 10

disable = no

flags = IPv4

}

现在,就可以使用如下命令来启动vsftpd了。

停止运行的vsftpd:

# service vsftpd stop

重新启动xinetd守护进程:

# service xinetd restart

另外一点需要说明的是:如果想在系统启动时就自动运行该服务,那么需要使用setup命令,在网络服务配置的项目中,选中vsftpd守护进程即可。

2. 工作模式启动

vsftpd也可以工作在工作模式下。这样,我们需要再次打开“/etc/vsftpd.conf”做如下修改:

# Shall the vsftp daemon run in standalone operation? YES/NO

listen=YES

在这项设置之后,守护进程可以用如下方式启动:

# service vsftpd start

同样地,在工作模式下,我们必须保证vsftpd没有被xinetd启动,这个可以使用如下命令来进行检查:

# pstree|grep vsftpd

测试运行

在成功地安装和配置之后,我们将对该FTP服务器进行简单的测试运行,示例如下:

# ftp liyang

Connected to liyang.

220 (vsFTPd 1.1.3)

Name (liyang:root): anonymous

331 Please specify the password.

Password:

230 Login successful. Have fun.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> ls -l

229 Entering Extended Passive Mode

150 Here comes the directory listing

drwxr-xr-x 20 500 100 400 Jun 04 16:14 mp3

drwxr-xr-x 3 500 100 4 Feb 09 21:28 test

drwxr-xr-x 57 500 100 5143 Jun 15 19:23 working

226 Directory send OK.

上述过程测试了FTP服务器的成功运行,并且浏览了服务器上的几个文件夹。我们注意到,vsftpd的安装和配置都很简单,但它提供了很多特性和很高的安全性。一个非常显著的例子就是vsftpd是在chroot模式下工作的。chroot模式就是登录的用户单独指定一个固定的目录,这个目录一般是用户登录的主目录。在使用过程当中,用户被不能访问除那个目录之外的其他任何程序和文件,所以这样就使得在系统中潜在的攻击者被严格地和其他用户目录空间隔离开来,从而不能破坏提供服务的FTP服务器。这样即算出现攻击事件,也极大地缩小了受损的范围空间和大部分的程序文件,从而提高了系统的安全性。

五、安全配置vsftpd.conf

一)常用的控制语句

下面来了解一下核心配置文件vsftpd.conf。它的地址为“/etc/vsftpd.conf”,控制语句格式为“语句=值”,注意不要在格式间加入任何空格和标点符号。man手册页中把控制语句分为布尔类(值为YES或NO)、数字类(值为数字)和字符串类(值为字符串)三种。为了管理方便、思路清晰,按照访问权(Access rights)、安全(Security)、功能(Features)和性能(Performance)分成四大类。下面是一个样本配置文件内容,用来说明常用的控制语句:

# Access rights

anonymous_enable=YES

/*若不想启用匿名访问请修改值为NO*/

local_enable=NO

/*关闭本地用户登陆服务,指所有非匿名用户*/

write_enable=NO

/*关闭任何用户的写权限*/

anon_upload_enable=NO

/*关闭匿名用户上传数据的能力*/

anon_mkdir_write_enable=NO

/*关闭匿名用户建立目录的能力*/

anon_other_write_enable=NO

/*关闭匿名用户执行建立和上传之外的写入类命令的操作,比如更

改名字和删除操作的能力*/

# Security

anon_world_readable_only=YES

/*开启匿名用户只能使用许可权为全部可读的资源*/

connect_from_port_20=YES

/*从标准端口20触发连接*/

hide_ids=YES

/*隐藏FTP服务器中用户的ID,用“FTP\"取代*/

pasv_min_port=50000

pasv_max_port=60000

/*设置pasv传输模式下的端口范围为50000-60000*/

# Features

xferlog_enable=YES

/*开启日志,记录传输状态到文件/var/log/vsftpd.log*/

ls_recurse_enable=NO

/*关闭“ls -R\"命令,该命令常被用于DoS攻击,非常浪费系统资源,

但“mirror\"镜像工具会用到它*/

ascii_download_enable=NO

/*关闭ASCII模式下载,防止被用于DoS攻击,ASCII下载很消耗CPU负担*/

async_abor_enable=YES

/*开启支持早期FTP客户端“async ABOR\"命令的能力*/

# Porformance

one_process_model=YES

/*开启每个IP单一进程模式,该模式仅支持具备一定能力的内核,

比如linux kernel 2.4*/

idle_session_timeout=120

/*踢出空闲了两分钟后的用户*/

data_connection_timeout=300

/*踢出空闲了五分钟后的下载*/

accept_timeout=60

/*踢出挂起了一分钟后的passive连接*/

connect_timeout=60

/*踢出挂起了一分钟后的活动连接*/

anon_max_rate=50000

/*限止单个用户的下载速度为不超过50kbytes每秒*/

至此,一个匿名服务器已经可以正常运行了,并且进行了安全方面的设置。实际中,根据FTP服务器不同的需求,比如想启用本地用户登录、想让某类用户具备上传能力、想让登录者看到一份友好的欢迎信息等,还可以在vsftpd.conf中进行相应的设置(用“man vsftpd.conf”参考man手册可获得更多的详细资料)。

有一些设置选项跟运行模式或外挂模块有关,还有一些选项必须依赖于另一个选项的启用状态。总之,只要精心搭配,完全可以定制出一个称心的FTP服务器。

二)tcp_wrappers的应用

要使用这项功能需要在安装编译之前构建包含tcp_wrappers的vsftpd。可通过编辑“builddefs.h”文件,将“#undef VSF_BUILD_TCPWRAPPERS”修改为“#define VSF_BUILD_TCPWRAPPERS”,然后重新构建编译,生成可执行代码。其次,要开启在配置文件vsftpd.conf中的选项“tcp_wrappers=YES”。该功能依赖于对文件“/etc/hosts.allow”的配置。以下是一个样例:

vsftpd: 192.168.1.3: setenv VSFTPD_LOAD_CONF /etc/vsftpd_tcp_wrap.conf

vsftpd: 192.168.1.4: DENY

其中,第一行表示如果一个客户端从192.168.1.3连接,那么vsftpd将应用“/etc/vsftpd_tcp_wrap.conf”的vsftpd配置文件给该连接。这些设置被应用在默认的vsftpd.conf之前。这一点十分有用,可用它为一些IP应用不同的访问(例如上传的能

力);还可以指定某些IP有能力来超越连接(max_clients=0);或者为某些IP增减带宽。第二行表示拒绝192.168.1.4连接的能力。这一点对别有用心的连接者很有用。

三)PAM(Pluggable Authentication Modules for Linux)的应用

PAM应用也就是在开启了PAM的系统上应用“虚拟用户”功能。下面一个样例演示怎样利用“虚拟用户”来设置vsftpd的PAM。虚拟用户是指不像系统上的真实用户一样客观存在的用户。虚拟用户因此而比真实用户更安全,因为一个像这样有威胁系统安全的账户却仅能使用FTP服务。虚拟用户常用来服务那些不想开放给不被信任用户的内容,一般不影响正常的普通用户。

1).创建虚拟用户数据库

使用pam_userdb来鉴别虚拟用户。这需要一个“db”格式的用户名/密码文件。要创建一个“db”格式文件,首先要创建一个在交替行上写有用户名和密码的无格式文本文件,代码如下:

$ vi logins.txt

编辑文件内容如下:

tom

foo

fred

bar

上面的“tom”对应着密码“foo”,“fred”对应着密码“bar”。同时用root身份登陆,创建实际的数据库文件,代码如下:

#要求已安装了Berkeley db 程序

这样即可创建“/etc/vsftpd_login.db”。如果想改变访问许可权限,可用如下命令:

$ chmod 600 /etc/vsftpd_login.db

此外,如果想了解更多有关如何维护登陆数据库的知识,可寻找在“Berkeley DB”上的文档资料,网址为http://www.sleepycat.com/docs/utility/index.html。

2).建一个使用新数据库的PAM文件

创建编辑文件vsftpd.pam,包含以下两行:

auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login

accound required /lib/security/pam_userdb.so db=/etc/vsftpd_login

告诉PAM使用新数据库来鉴别用户。把该PAM文件保存到PAM目录(通常为“/etc/pam.d/cp vsftpd.pam /etc/pam.d/ftp”)。

3).为虚拟用户设置文件位置

接下来使用以下命令为为虚拟用户设置文件位置:

$ useradd -d /home/ftpsite virtual

$ ls -ld /home/ftpsite

将显示如下:

drwx------3 virtual virtual 4096 Jul 30 00:39 /home/ftpsite

已经创建一个叫做“virtual”的用户,并且有一个主目录“/home/ftpsite”。增加一些内容到这个下载区域,代码如下:

$ cp /etc/hosts /home/ftpsite

$ chown virtual.virtual /home/ftpsite/hosts

4).定制vsftpd.conf配置文件

重新定制vsftpd.conf文件:

anonymous_enable=NO

local_enable=YES

# 由于安全因素应关闭匿名FTP,并开启非匿名FTP(虚拟用户需使用)。

write_enable=NO

anon_upload_enable=NO

anon_mkdir_write_enable=NO

anon_other_write_enable=NO

# 出于安全目的写下这些确保命令,不许写命令执行

chroot_local_user=YES

# 虚拟用户到我们上面设置的虚拟FTP区域 /home/ftpsite。

guest_enable=YES

guest_username=virtual

# guest_enable很重要,能激活虚拟用户。guest_username表示所有

的虚拟用户都被映射到上面设置的真实用户“virtual”。这也将确定在文件系统上

虚拟用户的最终归宿,用户“virtual”的主目录“/home/ftpsite”。

listen=YES

listen_port=10021

# 这置vsftpd在“standalone”模式,不从inetd运行。这意味着仅需执行vsftpd

运行命令一次,它就开始运行起来。这也使得vsftpd监听在10021的非标准端口上

的FTP需求(FTP通常使用端口21)。

pasv_min_port=30000

pasv_max_port=30999

# 这些命令在被动FTP接收端放置一个端口序列。对配置防火墙很有用。

5).开始运行vsftpd

进入vsftpd源代码所在的目录,并执行“./vsftpd”,如果光标一直停在那里说明无误;否则将会看到一些错误信息。

6).测试

装载另一个Shell会话进程(或者把程序切换到后台运行,按CTRL+Z然后敲“bg”)。以下是一个FTP会话样例:

ftp localhost 10021

Connected to localhost (127.0.0.1).

220 ready, dude (vsFTPd 1.1.3: beat me, break me)

Name (localhost:chris): tom

331 Please specify the password.

Password:

230 Login successful. Have fun.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> pwd

257 \"/\"

ftp> ls

227 Entering Passive Mode (127,0,0,1,117,135)

150 Here comes the directory listing.

226 Transfer done (but failed to open directory).

ftp> size hosts

213 147

ftp>

这里给出的密码是“foo”。不要因为出现“failed to open directory”而害怕,那是因为目录“/home/ftpsite”不全部可读。可以看到,通过size命令已经访问到复制进虚拟FTP区域的“hosts”文件。

7)功能扩充

虽然第一个vsftpd已经可以运行,但下面的内容可以扩充“VIRTUAL_USERS”,使设置变得稍微复杂一些。假定需要两类虚拟用户,一类仅仅能浏览和下载内容,另一种除能下载存在的内容之外还能上传新内容。可使用vsftpd强大的单用户使用配置能力(版本1.1.0以上)来完成这个设置。我们在早先的虚拟用户样例中创建了tom和fred两个用户,并设置fred拥有写权限,可访问上传的新文件;tom仅能下载。

1.激活单用户配置能力

要激活vsftpd的这个强大功能,增加下面的内容到“/etc/vsftpd.conf”:

user_config_dir=/etc/vsftpd_user_conf

并用“mkdir /etc/vsftpd_user_conf”创建目录。

2.给tom读取所有文件/目录的能力

在上个样例的末尾, 我们注意到虚拟用户仅能看全可读文件和目录。可以使“/home/ftpsite”目录全可读,并且上传有全可读许可的文件。但是做到这点的另一种方法是给tom下载非全可读文件的能力。

对于用户tom,强行提供一个配置设置给“anon_world_readable_only”,代码如下:

echo \"anon_world_readable_only=NO\" > /etc/vsftpd_user_conf/tom

然后检测一下,用tom登录,键入“ls”将返回目录清单。而用fred登录则应不显示。

可以重启vsftpd使刚才对“/etc/vsftpd.conf”文件的更改有效(高级用户可发送SIGHUP给vsftpd监听进程)。

3.给fred读取所有文件/目录和创建新文件/目录的权限,但是不具有干扰已经存在文件的能力,代码如下:

echo \"anon_world_readable_only=NO\" > /etc/vsftpd_user_conf/fred

echo \"write_enable=YES\" >> /etc/vsftpd_user_conf/fred

echo \"anon_upload_enable=YES\" >> /etc/vsftpd_user_conf/fred

最后检测一下,用tom登陆应该不能上传;而用fred登录能上传。并试着分别用tom和fred删除一个文件,应不能删除。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- cepb.cn 版权所有 湘ICP备2022005869号-7

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务