天天看点

vsftpd的 配置

vsftpd的 配置

在网站的建设中,FTP是一项重要的服务,利用它可以更容易分享有限的软件资源。Linux下有代表性的FTP服务器软件是Wu-FTP、ProFTP 及vsftpd。Wu-FTP(Washington University FTP)是由美国华盛顿大学开发的、以效率和稳定性为参考量的FTP软件。它的功能强大,配置较复杂,由于开发时间较早,应用十分广泛,也因此成为黑客们 主要的攻击目标。Wu-FTP的早期各级版本不断出现安全漏洞,系统管理员不得不因安全因素而经常对其进行升级。ProFTP针对Wu-FTP的弱项而开 发,除了在安全性方面进行了改进外,还具备设置简单的特点,并提供了一些Wu-FTP没有的功能,大大简化了架设和管理FTP服务器的工作。vsftpd 则凭借在安全性方面的出色表现,被很多大型网站广为采用。

  vsftpd简介

  vsftpd在安全性、高性能及稳定性三个方 面有上佳的表现。它提供的主要功能包括虚拟IP设置、虚拟用户、Standalone、inetd操作模式、强大的单用户设置能力及带宽限流等。在安全方 面,它从原理上修补了大多数Wu-FTP、ProFTP,乃至BSD-FTP的安装缺陷,使用安全编码技术解决了缓冲溢出问题,并能有效避免 “globbing”类型的拒绝服务攻击。目前正在使用vsftpd的官方网站有Red Hat、SuSE、Debian、GNU、GNOME、KDE、Gimp和OpenBSD等。

  安装

  本文以1.1.3版本为例进行介绍(这是2002年11月9日发布的最新正式发行版本)。下载地址为ftp://vsftpd.beasts.org/users/cevans/。

  1.构建vsftpd

  首先解压缩包,代码如下:

$ tar xzvf vsftpd-1.1.3.tar.gz

   进入安装目录cd vsftpd-1.1.3。如果想在以后使用中启用tcp_wrapper功能,可在编译前修改“builddefs.h”文件中的语句,将 “#undef VSF_BUILD_TCPWRAPPERS”改为“#define VSF_BUILD_TCPWRAPPERS”。tcp_wrapper功能主要应用于IP管理控制,比如可以为单独的一个IP地址使用特殊优先的FTP 配置文件。然后,键入“make”生成一份可执行二进制程序代码。

  2.前期准备

  vsftpd的默认配置中需要用户“nobody”。添加该用户命令如下:

$ useradd nobody

  vsftpd的默认配置中需要目录“/usr/share/empty”。添加该目录的命令如下:

$ mkdir /usr/share/empty/

  匿名FTP需要用户“ftp”的存在,并有一个有效的主目录(不允许用户“ftp”有拥有权和可写权)。如没有此目录则建立它,命令如下:

$ mkdir /var/ftp/

$ useradd -d /var/ftp ftp

  3.安装相关配置文件、执行文件、帮助手册页等

  运行“make install”,将源代码、帮助手册页等复制到相关路径。如果采用手工复制,命令如下:

$ cp vsftpd /usr/local/sbin/vsftpd

$ cp vsftpd.conf.5 /usr/local/man/man5

$ cp vsftpd.8 /usr/local/man/man8

  另外,“make install”不能复制样例配置文件,建议手工复制,命令如下:

$ cp vsftpd.conf /etc

  整个安装过程很简单,下面来看看如何操纵vsftpd的强大功能,进行vsftpd.conf文件的配置。

  两种运行模式

   像其它守护程序一样,vsftpd提供了standalone和inetd(inetd或xinetd)两种运行模式。简单解释一下, standalone一次性启动,运行期间一直驻留在内存中,优点是对接入信号反应快,缺点是损耗了一定的系统资源,因此经常应用于对实时反应要求较高的 专业FTP服务器。inetd恰恰相反,由于只在外部连接发送请求时才调用FTP进程,因此不适合应用在同时连接数量较多的系统。此外,inetd模式不 占用系统资源。除了反应速度和占用资源两方面的影响外,vsftpd还提供了一些额外的高级功能,如inetd模式支持per_IP(单一IP)限制,而 standalone模式则更有利于PAM验证功能的应用。

  1.inetd运行模式

  从某种inetd运行 vsftpd可以提供一种不错的功能——per_IP连接限制。这也是vsftpd 1.1.3版本最新推出并推荐的一种运行模式。实现per_IP连接限制要依赖于vsftpd提供的tcp_wrappers支持。如果使用标准的 “inetd”,需编辑/etc/inetd.conf文件,并添加下面一行代码:

$ ftp stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/vsftpd

  确保删除或注释掉任何原存的FTP服务语句行。假如没有安装tcp_wrappers,或不需要使用它,可去掉“/usr/sbin/tcpd”部分。然后重载配置文件,命令如下:

$ kill -SIGHUP 'pidof inetd'

  大多数较新的系统采用的是xinetd超级服务守护进程。使用“vi /etc/xinetd.d/vsftpd” 看一下它的内容,如下:

disable = no

socket_type = stream

wait = no

  # 这表示设备是激活的,它正在使用标准的TCP Sockets。

user = root

server = /usr/local/sbin/vsftpd

  # 说明服务程序/usr/local/sbin/vsftpd已被用来控制FTP接入请求,并且该程序是作为root身份运行的(可能瞬间拥有过大的特权)。请确信已经把vsftpd二进制执行代码安装在了“/usr/local/sbin”目录下。

per_source = 5

instances = 200

  # 由于安全原因,从一个单一IP地址联入的最大允许数值是5。当前最大连接总数是200。

no_access = 192.168.1.3

  # 地址192.168.1.3将被拒绝访问。

banner_fail = /etc/vsftpd.busy_banner

  # 显示给用户当连接被禁止时的文件。不论因任何原因而被拒绝(太多用户,IP被禁止)。

  下面一行是产生的例子:

echo "421 Server busy, please try later." < /etc/vsftpd.busy_banner

log_on_success += PID HOST DURATION

log_on_failure += HOST

  这将按照时间顺序日志所有尝试连接的IP地址,无论连接成功与否。假如连接启动了一个FTP服务,其进程ID和使用期也将被载入日志。如果使用的是Red Hat,这个日志信息将出现在/var/log/secure文件中。

  最后,重启xinetd,命令如下:

$ /etc/rc.d/init.d/xinetd restart

  需要注意的是,“/etc/xinetd.d”目录中仅能开启一个FTP服务。

  2.standalone模式

   standalone模式便于实现PAM验证功能。进入这种模式首先要关闭xinetd下的vsftpd,设置“disable = yes”,或者注销掉“/etc/inetd.conf”中相应的行。然后修改“/etc/vsftpd.conf”中的选项为“listen= YES”。

  配置vsftpd.conf

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

# Access rights

anonymous_enable=YES

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

hide_ids=YES

pasv_min_port=50000

pasv_max_port=60000

# Features

xferlog_enable=YES

ls_recurse_enable=NO

ascii_download_enable=NO

async_abor_enable=YES

# Porformance

one_process_model=YES

idle_session_timeout=120

data_connection_timeout=300

accept_timeout=60

connect_timeout=60

anon_max_rate=50000

   至此,一个匿名服务器已经可以正常运行了,并且进行了安全方面的设置。实际中,根据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的应用

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

  1.创建虚拟用户数据库

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

$ vi logins.txt

  编辑文件内容如下:

tom

foo

fred

bar

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

$ db_load -T -t hash -f logins.txt /etc/vsftpd_login.db

  # 要求已安装了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”文件。

  功能扩充

   虽然第一个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删除一个文件,应不能删除。

  总结

  以上实例均在Red Hat 8.0系统上试验通过,如遇到问题请仔细检查每个细节的正确性。实例中的内容可以根据具体环境进行增减、修改。相信稍加变通便可以打造出一个满意的、安全的FTP服务器。

实现虚拟账号;

1. 创建虚拟账号文件,奇数行为用户名,偶数行为口令:

vi /etc/vsftpd/account.txt

user1

pass1

user2

pass2

2. 将虚拟账号加入数据库

db_load –T –t hash –f /etc/vsftpd/account.txt /etc/vsftpd_login.db

chmod 600 /etc/vsftpd_login.db

3. 修改/etc/pam.d/ftp

auth required pam_userdb.so db=/etc/vsftpd_login

account required pam_userdb.so db=/etc/vsftpd_login

4. 建立虚拟账号本地映射

useradd –d [vuser_home] –g [groupname] –G [addtogroup] –s /sbin/nologin vuser

5. 或者直接编辑/etc/passwd设置虚拟账号本地不能登录

vi /etc/passwd

vuser:x:uid:gid::[vuser_home]:/sbin/nologin

6. 设置虚拟账号本地映射目录权限

chgrp

chown vuser

chmod

7. 配置/etc/vsftpd-pam.conf

anonymous_enable=NO

anon_upload_enable=NO

anon_mkdir_write_enable=NO

local_enable=YES

guest_enable=YES

guest_username=vuser

8. 配置vsftpd自动运行,编辑/etc/profile,添加

/usr/local/sbin/vsftpd-pam /etc/vsftpd-pam.conf &

锁定不同用户到不同目录,配置不同的读写权限

配置/etc/vsftpd-pam.conf

#锁定用户目录

chroot_list_enable=YES

#指定用户配置文件位置

user_config_dir=/etc/vsftpd_user_conf

配置/etc/vsftpd_user_conf/,添加与账号对应的userid文件,内容如下:

#指定用户登录根目录

local_root=[login_root]

#指定用户读写权限

write_enable=YES|NO

anon_world_readable_only= YES|NO

anon_upload_enable= YES|NO

anon_mkdir_write_enable= YES|NO

anon_other_write_enable= YES|NO

#指定用户下载速度

local_max_rate=500000

更改vsftpd端口

执行以下两行指令,只允许2121和2020端口打开,其余端口关闭:

#iptables -A INPUT -p tcp -m multiport --dport 2121,2020 -j ACCEPT

#iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset

修改/etc/vsftpd/vsftpd.conf文件,在文本最后添加以下两行:

listen_port=2121

ftp_data_port=2020

只允许指定ip访问

直接在/etc/hosts.allow中定义允许或拒绝某一源地址,可以通过以下配置来实现。先确保/etc/vsftpd/vsftpd.conf中tcp_wrappers=YES。

假设提供168.192.2.1和210.31.8.1到210.31.8.254的连接,则可对/etc/hosts.allow进行如下设定:

vsftpd : 168.192.2.1 210.31.8. : allow

ALL : ALL : DENY

给vsftpd增加新硬盘

将新硬盘分区格式化后,挂到vsftpd用户目录下,并设定好用户为vuser,指定好读写权限。

给vsftpd分配磁盘配额

用系统自带磁盘配额,对vuser用户进行磁盘限额,修改/etc/fstab中根分区的记录,将/home分区的第4个字段改成defaults,usrquota,如下:

LABEL=/home /home ext3 defaults,usrquota 1 2

# reboot //重新启动系统使设置生效

也可以用

# mount -o remount /dev/sda6 ///dev/sda6的挂接点就是/home,这样可以不用启动系统。

如果对一个组进行磁配额,需要增加参数grpquota,例如

LABEL=/home /home ext3 defaults,grpquota 1 2

也可以

LABEL=/home /home ext3 defaults,usrquota,grpquota 1 2

# quotacheck -avu

说明:a-自动开启挂载文件系统的配额,v-显示信息,u-启用用户配额or g-启用组配额

# edquota vuser //为用户ftpd设置磁盘配额

OR

# edquota -g vuser //为组vuser设置磁盘配额

系统会自动打开配额文件,如下:

Disk quotas for user vuser(uid 502):

Filesystem blocks soft hard inodes soft hard

/dev/sda6 424 0 0 13 0 0

第一列是启用了配额的文件系统的名称。第二列显示了用户当前使用的块数,单位为KB。随后的两列用来设置用户在该文件系统上的软硬块限度。inodes 列显示了用户当前使用的i节点数量。最后两列用来设置用户在该文件系统上的软硬i节点限度。硬限是用户或组群可以使用的磁盘空间的绝对最大值。达到了该限度后,磁盘空间就不能再被用户或组群使用了。软限定义可被使用的最大磁盘空间量。和硬限不同的是,软限可以在一段时期内被超过。这段时期被称为过渡期(grace period),默认七天的超越。过渡期可以用秒钟、分钟、小时、天数、周数、或月数表示。如果以上值中的任何一个被设置为 0,那个限度就不会被设置。

# quotaon -avu //打开磁盘配额监控进程,u是用户g是组

可以使用以下命令校验用户的配额是否被设置:

# quota vuser

Disk quotas for user vuser (uid 502):

Filesystem blocks quota limit grace files quota limit grace

/dev/sda6 424* 0 1 13 0 0

# edquota –t(-g)来设置过渡期(grace period) //当然只针对软限制而言

和另一个 edquota 命令相似,这个命令也会在文本编辑器中打开当前的文件系统配额:

Grace period before enforcing soft limits for users:

Time units may be: days, hours, minutes, or seconds

Filesystem Block grace period Inode grace period

/dev/sda6 7days 7days

按需要修改后存盘退出

用以下命令显示磁盘配额使用状态

# repquota -a 或 repquota /dev/sda6(用户配额)

# repquota -g -a 或 repquota -a /dev/sda6 (组的配额)

取消某个文件系统的配额限制

#quotaoff -vug /dev/sda6 //删除home分区的磁盘限额

#删除/etc/fstab中设置配额的部分

修改软配额的最大超越时间

注意:

/,/boot/,/proc,/mnt/cdrom等无法使用配额,没用。而且磁盘配额不适合FAT和FAT32系统。

以后当新设置了某个用户的配额,可以使用如下命令,马上生效。

# quotacheck -auvgm --是不尝试重新挂载文件系统

vsftpd.conf中更多参数

dirmessage_enable=YES //当使用者转换目录,则会显示该目录下的.message信息

xferlog_enable=YES //记录使用者所有上传下载信息

xferlog_file=/var/log/vsftpd.log //将上传下载信息记录到/var/log/vsftpd.log中

xferlog_std_format=YES //日志使用标准xferlog格式

idle_session_timeout=600 //客户端超过600S没有动作就自动被服务器踢出

data_connection_timeout=120 //数据传输时超过120S没有动作被服务器踢出

ftpd_banner=Welcome Words. //FTP欢迎信息

anon_max_rate=80000 //这是匿名用户的下载速度为80KBytes/s

tcp_wrappers=YES //支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)

local_umask=022 //本地用户文件上传后的权限是-rw-r-r

chroot_local_user=YES //限制用户在自己的主目录

#local_root=/ftp //你可以指定所有本地用户登陆后的目录,如果不设置此项,用户都会登陆于自己的主目录

#如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录

chroot_list_enable=YES

#定义不能更改用户主目录的文件

chroot_list_file=/etc/vsftpd/vsftpd.chroot_list

userlist_enable=YES

userlist_deny=YES

userlist_file=/etc/vsftpd.denyuser

以上三条设定不允许登陆的用户,用户列表存放在/etc/vsftpd.denyuser中。

#定义PAM 所使用的名称,预设为vsftpd。

pam_service_name=vsftpd

【作者: Liberal】【访问统计:<script language="JavaScript" src="http://counter.blogchina.com/PageServlet?pageid=6248635&blogid=8561"></script>】【2007年04月28日 星期六 17:06】【注册】【打印】