FILE TRANSFER PROTOCOL

vsftp

? vsftp是一个基于GPL发布的类uinx系统上的FTP服务器.

? 其名称中的vs即“verysecure”的意思,可见它的代码主要强调的是服务器的安全性。

在速度方面:

? 其速度是WU-FTP的两倍,在Linux2.4.X内核下,千兆网的下载速度达86Mbyte/s。

在稳定性方面:

? 单机可支持4000个以上并发用户,而据redhat的数据,它可以支持15000个并发用户。

FTP使用TCP连接和TCP端口

主动FTP
主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。

clip_image001

主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。

被动FTP
为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。

在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。

当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。

第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。

这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

clip_image003

被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。

主动与被动FTP优缺点的简要总结:
1 主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。

2 主动和被动是有客户端决定的,客户端是什么模式,服务器就采用什么模式。

3.IE 缺省使用被动,linux命令行使用被动,win命令行向主动,后被动。

clip_image004

主动和被动模式抓包分析

两台linux,用命令行测试的。

在客户端输入

#ftp 192.168.0.1

〉ls

〉bye

此时应该是被动的,分析如下:

clip_image006

clip_image008

?

在客户端输入

#ftp 192.168.0.1

〉passive

〉ls

〉bye

此时应该是主动模式

clip_image010

clip_image012clip_image014

VSFTP 服务启动与停止

? #service vsftpd start 启动

? #

实验1

? #匿名用户登录ftp

? #实名用户登录ftp # cd /etc 下载

? 结论:

Vsftp配置文件

? /etc/vsftpd/vsftpd.conf。 主配置文件.

进行Vsftp的配置

? anonymous_enable=YES

? local_enable=YES

? anon_upload_enable=YES

? anon_mkdir_write_enable=YES xferlog_enable=YES

? idle_session_timeout=600

? ftpd_banner=Welcome to chenlf FTP service. 定制欢迎信息

? max_clients=5 默认是0不限止

? max_per_ip=3

试验2

? 只允许匿名登录,不允许实名

anonymous_enable=YES

? local_enable=NO

试验3

不允许匿名用户登录

anonymous_enable=NO

? local_enable=YES

试验4

设置服务器欢迎信息.

? ftpd_banner=Welcome to chenlf FTP

试验5

访问限制

A 黑名单1

? /etc/vsftpd.ftpusers

?

B 黑名单2

1000个用户,999个不能访问,一个可以

? A:

? 文件中用户不能访问,其他可访问.

? userlist_deny=YES

? userlist_file=/etc/ vsftpd.user_list此文件名可以改简单 ,如vs

#/etc/vsftpd.chroot_list

输入 tt

? B:

? 文件中用户能访问,其他用户不可访问(包括ftp匿名用户).

? userlist_deny=NO

? userlist_file=/etc/ vsftpd.user_list 此文件名可以改简单 ,如vs

#/etc/vsftpd.chroot_list

输入 tt

常见错误:在主配置文件中会有userlist_enable=YES 行,而部分同学不起改掉了,会发生列表不起作用情况。

试验 6

限制切换目录----由于普通用户可以浏览操作系统的目录,不安全。

Chroot 禁止切换目录

? 1 所有用户不能切换

? chroot_local_user=YES

? 2 指定用户不能切换

? chroot_local_user=NO

? chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list 此文件名可以改简单 ,如vs

#/etc/vsftpd.chroot_list

输入 tt

试验7

限制客户数

? max_clients=1

? max_per_ip=3

试验8

速率限制----ftp网站收费如何解决

? 方法1:交钱不交钱

? local_max_rate=5000 (5kb/s)

? anon_max_rate=3000

验证 :IE 上传文件看速度

? 方法2:交多少钱给多少速度

? user_config_dir=/etc/ftp

? #mkdir /etc/ftp

? #adduser tt

? #vi /etc/ftp/tt

? local_max_rate=5000

验证 :IE 上传文件看速度

试验9

更改端口号----21端口常被***,如何把其隐藏,改为其它端口,问题别人不知道端口,又不能访问---端口从定向。

? listen_port=2121

? #iptables –t nat –A PREROUTING –i eth0

? -p tcp - -dport 21 –j REDIRECT - -to 2121

试验10

匿名上传

? anon_upload_enable=YES

? anon_mkdir_write_enable=YES

? #chmod 777 /var/ftp/pub

常见错误:#chmod 777 /var/ftp

允许用户删除

anon_upload_enable=YES

? anon_mkdir_write_enable=YES

? anon_other_write_enable=YES

#chmod 777 /var/ftp/pub 只能删除该目录的内容,其他不可以。

试验11

设置共享目录

? local_root=/misc/abc 在做不同用户有不同速率实验,每个用户,都是进入自己目录下载同样的东西,浪费空间,怎么把他们目录集中在一起。

? anon_root=/misc/doc

? 注意 :

? 1. chown pp /misc/abc 此时pp才可以上传,对比/home/pp 既可明白。

? 2.不能chmod -R 777 /misc/doc 对比#chmod 777 /var/ftp

试验12

启用详细的日志记录格式

? #设定记录传输日志的文件名。默认值为/var/log/vsftpd.log。

?

xferlog_enable=YES

xferlog_file=/var/log/vsftp.log

试验13

隐藏内容不可下载,可上传

Chmod –R 771 /var/ftp/pub

VSFTP添加虚拟用户 PAM认证) y/scM^y`K-
~_qL 75u
虚拟用户只能访问为其提供服务的ftp服务器,而不能登录系统。可以提高系统的安全性。 -b{!8Q.h


要实现虚拟用户的支持需要使用单独的口令库文件,并由可插拔认证模块(pam)进行认证。

VSFTPD的本地用户本身是系统的用户,除了可以登录FTP服务器外,还可以登录系统使用其他系统资源,而
VSFTPD的虚拟用户则是FTP服务的专用用户,虚拟用户只能访问FTP服务器资源。对于只需要通过FTP对系统有读
写权限,而不需要其他系统资源的用户或情况来说,采用虚拟用户方式是很适合的。
VSFTPD的虚拟用户采用单独的用户名/口令保存方式,与系统账号(passwd/shadow)分离,这大大增强了
系统的安全性。VSFTPD可以采用数据库文件来保存用户/口令,如hash;也可以将用户/口令保存在数据库服务器
中,如MySQL等。VSFTPD验证虚拟用户,则采用PAM方式。由于虚拟用户的用户名/口令被单独保存,因此在验证
时,VSFTPD需要用一个系统用户的身份来读取数据库文件或数据库服务器以完成验证,这就是guest用户,这正
如同匿名用户也需要有一个系统用户ftp一样。当然,guest用户也可以被认为是用于映射虚拟用户。

virtual_use_local_privs参数,
当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。所有虚拟用户的权限使用local参数。
当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限,所有虚拟用户的权限使用anon参数。
这两者种做法相比,后者更加严格一些,特别是在有写访问的情形下。默认情况下此参数是关闭的(NO)

因此匿名用户的设置即是虚拟用户的设置,在改参数权限时,同时也要修改目录权限
如:让用户不能浏览目录,但仍可以对文件操作且虚拟用户目录的权限改为只能由vsftpdvirtual操作: y#hfg

7

1。生成用户文件。 z*N?;eGl
#vi users.txt 6t>; fy!"
test1 ctD[Qoxs=
test1 aVDCVRpf
test2 a,T HUTB
test2 g{'BS?s8NF
test1是用户的名字,第二行的test2是用户的密码。 ^S[m~)$*`
.N-5oWw|
2 生成数据库 ,修改口令文件权限。

db_load -T -t hash -f users.txt /etc/vsftpd/vsftpd_login.db @<EA*U^AS
chmod 600 /etc/vsftpd/vsftpd_login.db fl&lt;xw kW (也可以不要)
z5tPc?t&I
3. 生成pam文件, 让pam对vsftp L6(lWG 提供认证
生成虚拟用户所需要的pam文件。 )\'zNW~H
#vi /etc/pam.d/vsftpd.vu vJK+B%k

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login J3T
aGi
account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login D ?' w
6
(K
[D-;s^V

4. 建立虚拟用户的访问目录 jkv ?E@MJ
建立虚拟用户所需要访问的目录,并设置访问权限。 - r+*QS
useradd -d /home/vftp vftp 6XiwJ

n
chmod 700 /home/vftp hjp3rN
I

(可以直接adduser vftp 其他都不要即可)

6.设置主配置文件。 S d7&SBhk

guest_enable=YES //启用虚拟用户。 J?0 uoK%
guest_username=vftp //将虚拟用户的主目录映射到本地ftp用户。 SQv;p.&lt;
pam_service_name=vsftpd.vu //设置pam认证文件,指定位置。

#anon_world_readable_only=NO //开放读权限(如果没有该项用户看到的目录是隐藏的,当然也可以不要,分别在每一个用户配置文件中写也可以) 9
~saW?!
dh2vI/R6J>
7 管理虚拟用户。 =`p6/


VSFTP支持对不同的用户进行不同的管理。 RG_Wgbx
A 编辑vsftp的主配置文件,激活对虚拟用户进行不同权限配置的配置语句。 "W=qO2.=
use_config_dir=/etc/vsftpd_user_conf //指定虚拟用户配置文件的存放路径。 lh gX?h "
aA&[5Ifs=
B 创建目录 +M=d? u'9=
mkdir /etc/vsftpd_user_conf &h[ 7gst` (也可以/etc/ftp )

C 创建虚拟用户dede o" 5 za'T$ 让其有读,上传,写权限
vi /etc/vsftpd_user_conf/dede i6c=?(`
anon_world_readable_only=NO //开放读权限(如果没有该项用户看到的目录是隐藏的) 7p~#+:_Q
anon_upload_enable=YES //开放上传的权限。 Z5w;1_Rx'

anon_mkdir_write_enable=YES
anon_other_write_enable=YES //开放写的全限 。

zSQ/:RSe 不用建文件然后777

D 创建虚拟用户bruce 让其只能浏览、下载文件,且只能进入/home/bruce目录。

# vi /etc/vsftpd_user_conf/ i6c=?(`bruce

设置虚拟用户bruce的权限,开启bruce的读权限,且进入FTP服务器后,访问/home/bruce目录

anon_world_readable_only=NO

local_root=/home/bruce

E 创建虚拟用户guoxin 设置虚拟用户guoxin的权限,开启guoxin的读,写,建文件夹,移动文件夹,改名,删除文件及文件夹权限,进入的是默认的目录。

# touch guoxin

# vi /etc/vsftpd/vsftpd_user_conf/guoxin

local_root=/home/ftp/$USER #用户主目录

anon_world_readable_only=NO

write_enable=YES

anon_upload_enable=YES

anon_other_write_enable=YES

anon_mkdir_write_enable=YES

注: db_loads从标准输入中读取数据,放到数据库文件中去,如果数据文件不存在,他会自己建立数据文件。 oIRTKPm+h
-T 选项允许非Berkeley DB的应用的文件被很容易的记录到数据文件中去。通常 -T被指定的话
#ZEMt9
-t也要被指定。 = 9&'z3Rc
-t 选项 指定潜在的存取方法。 \? ^Jb@_a
-f 指定 从文件中读取数据,而不是标准输入。 }

rH
I$:0-
db_dump和db_load相反,它是从数据文件中读入数据,并把他们写入标准输出中。

SeLinuxVSFTP服务器的PAM_MYSQL认证
在关闭SeLinux情况下,已成功设置PAM_MYSQL虚拟用户的VSFTP,但是当重新将SeLinux设置为强制时,VSFTP就无法进行用户认证了,查了错误日志:
message日志:
localhost kernel: audit(1179060097.966:58): avc:  denied  { connectto } for  pid=16135 comm="vsftpd" name="mysql.sock" scontext=system_u:system_r:ftpd_t:s0 tcontext=system_u:system_r:mysqld_t:s0 tclass=unix_stream_socket
Secure日志:
localhost vsftpd: pam_mysql - MySQL error (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13))

查了很多文档,发现是MYSQL的POLICY造成的,主要是pam_mysql.so的SELINUX的角色不能使用MYSQL造成的。但我有没有本事改策略,只好想了个笨办法,因为PHP也需要调用MYSQL,于是我找到PHP当中的MYSQL.so的角色,textrel_shlib_t,将pam_mysql.so原来的lib_t角色改成了textrel_shlib_t角色。呵呵~~,那个烦人的avc:denied再也没出现了,测试了一下,FTP工作正常。
命令是chcon -t testrel_shlib_t /lib/security/pam_mysql.so

如果你用的是Redhat RHEL5的话,可使用audit2allow和semodule命令建立local policy,并加载到内核中,十分方便。只需:
grep setsebool /var/log/audit/audit.log | audit2allow -M <your_module_name>
semodule -i <your_module_name>