45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:如何在Linux下用vsftpd构建FTP服务器?

如何在Linux下用vsftpd构建FTP服务器?

2016-08-26 14:54:56 来源:www.45fan.com 【

如何在Linux下用vsftpd构建FTP服务器?

在Linux下如何使用vsftpd构建FTP服务器,构建后的FTP服务器有哪些特点?本文将作详细介绍。

vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开发源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。

本文以RedHat Linux 9.0为例介绍一下如何安装和配置vsftpd服务器。

安装服务器程序

程序下载地址:ftp://vsftpd.beasts.org/users/cevans/,目前最新版本为2.0.3,源程序文件名为vsftpd-2.0.3.tar.gz。

1.安装之前的准备:

安装之前我们应该看看用户“nobody”和目录“/usr/share/empty”是否存在,如果不存在需要新建这个用户和目录。

[root@localhost root]# useradd nobody

[root@localhost root]# mkdir /usr/share/empty

如果要允许匿名访问,还需要创建ftp用户,并将其主目录设置为/var/ftp。在RedHat Linux 9.0中这些都已默认设置好了,只需要创建一个/var/ftp目录即可。

[root@localhost root]# mkdir /var/ftp

为了安全,目录“/var/ftp”不应该属于用户“ftp”,也不应该有写权限。在此,我们做如下设置:

[root@localhost root]# chown root.root /var/ftp

[root@localhost root]# chmod 755 /var/ftp

2.开始安装:

以管理员身份登录Linux系统,将vsftpd-2.0.3.tar.gz复制到/root目录下。

[root@localhost root]# tar xzvf vsftpd-2.0.3.tar.gz

[root@localhost root]# cd vsftpd-2.0.3

[root@localhost vsftpd-2.0.3]# make

[root@localhost vsftpd-2.0.3]# make install

3.安装后续工作

由于采用源代码方式安装,很多必要的配置文件没有复制到系统中,需要手动复制。

复制配置文件:

[root@localhost vsftpd-2.0.3]# cp vsftpd.conf /etc

复制pam验证文件:(多数使用vsftpd的用户在用源代码安装后都会遇到这样的问题:匿名用户可以登录,而本地用户无论怎样设置都无法登录,原因就在于vsftpd采用了PAM验证的方式,需要复制一个验证文件本地用户才能访问。)

[root@localhost vsftpd-2.0.3]# cp RedHat/vsftpd.pam /etc/pam.d/ftp

vsftpd的配置

vsftpd服务器的配置文件为/etc/vsftpd.conf,其配置选项比较多,在此我只选择几个常用的配置选项介绍。

1.禁止匿名用户访问。

anonymous_enable=NO

2.允许本地用户登录并允许其上传文件。

local_enable=YES

write_enable=YES

要使上述选项生效,必须复制一个pam验证文件到/etc/pam.d,并改名为ftp。当然也可以改为其他名称,但必须修改pam_service_name的值,默认为ftp。

3.将本地用户锁定在主目录中,不允许切换到上一级目录中。

chroot_local_user=YES

4.禁止某些用户通过ftp登录服务器。

如果设置了local_enable=YES,那么所有的用户包括root也能通过ftp登录服务器,出于安全考虑,需要对某些用户进行限制。

在vsftpd.conf中有三个选项控制:

userlist_deny=YES/NO

userlist_enalbe=YES

userlist_file=/etc/vsftpd.user_list

如果userlist_deny=YES,/etc/vsftpd.user_list中列出的用户名就不允许登录ftp服务器;如果userlist_deny=NO,/etc/vsftpd.user_list中列出的用户名允许登录ftp服务器。

我们只要在/etc目录下创建vsftpd.user_list文件,文件内容为允许登录或禁止登录的用户名,每个用户占一行。

5.禁止用户通过FTP修改文件或文件夹的权限。

chmod_enable=NO(默认值为YES)

6.设置本地用户上传的文件或文件夹的umask值。

local_umask=022(默认值为077)

umask的值设为022表示,上传的如果是文件将权限改为644,如果是文件夹将权限改为755。在上传网页时,如果设置为077,就会出现用户没有权限(Permission denied)访问网页的问题,所以建议将umask的值设为022。

7.添加一个只能从ftp登录服务器,而不能从本地登录的用户。以下创建一个用户ftpuser,不允许从本地登录,并创建该用户的密码。

[root@localhost root]# useradd –g ftp –s /sbin/nologin ftpuser

[root@localhost root]# passwd ftpuser

Changing password for user ftpuser.

New password:

Retype new password:

passwd: all authentication tokens updated successfully.

8.让vsftp服务器限制总的连接数以及每个IP最大的连接数。

#最多同时允许100个客户连接

max_clients=100

#每个ip地址最多允许开3个线程

max_per_ip=3

vsftpd的配置文件中有很多选项,但个人认为,如果是架设一个简单的ftp服务器,以上选项就足够了。

//------------------------------------------------------------------

 

vsftp配置大全---超完整版
作者: haixiao ouyang 如何在Linux下用vsftpd构建FTP服务器? 如何在Linux下用vsftpd构建FTP服务器? 如何在Linux下用vsftpd构建FTP服务器?
2006-02-10

环境:
RedHatAS4
说明:
如果不做说明,一般安装命令均使用ROOT权限,用#表示

特别说明:无

以下文章介绍Liunx环境下vsftpd的三种实现方法

一、软件
ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.3.tar.gz,目前已经到2.0.3版本。假设我们已经将vsftpd-2.0.3.tar.gz文件下载到服务器的/home/xuchen目录

二、代码:
#cd/home/xuchen
#tarxzvfvsftpd-2.0.3.tar.gz//解压缩程序
#cdvsftpd-2.0.3

三、三种方式的实现
1、匿名用户形式实现
#vibuilddefs.h////编辑builddefs.h文件,文件内容如下:

#ifndefVSF_BUILDDEFS_H

#defineVSF_BUILDDEFS_H
#undefVSF_BUILD_TCPWRAPPERS
#defineVSF_BUILD_PAM
#undefVSF_BUILD_SSL

#endif/*VSF_BUILDDEFS_H*/
将以上undef的都改为define,支持tcp_wrappers,支持PAM认证方式,支持SSL

#make//直接在vsftpd-2.0.3里用make编译
#ls-lvsftpd
-rwxr-xr-x1rootroot86088Jun612:29vsftpd//可执行程序已被编译成功

创建必要的帐号,目录:
#useraddnobody//可能你的系统已经存在此帐号,那就不用建立
#mkdir/usr/share/empty//可能你的系统已经存在此目录,那就不用建立
#mkdir/var/ftp//可能你的系统已经存在此目录,那就不用建立
#useradd-d/var/ftpftp//可能你的系统已经存在此帐号,那就不用建立
#chownroot:root/var/ftp
#chmodog-w/var/ftp
请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

安装vsftp配置文件,可执行程序,man等:
#install-m755vsftpd/usr/local/sbin/vsftpd-ano
#install-m644vsftpd.8/usr/share/man/man8
#install-m644vsftpd.conf.5/usr/share/man/man5
#install-m644vsftpd.conf/etc/vsftpd-ano.conf
这样就安装完成了,那么我们开始进行简单的配置

#vi/etc/vsftpd-ano.conf,将如下三行加入文件
listen=YES
listen_port=21
tcp_wrappers=YES
anon_root=/var/ftp//设置匿名用户本地目录,和ftp用户目录必须相同
listen=YES的意思是使用standalone启动vsftpd,而不是superdaemon(xinetd)控制它(vsftpd推荐使用standalone方式)
#/usr/local/sbin/vsftpd-ano/etc/vsftpd-ano.conf&//以后台方式启动vsftpd
注意:每行的值都不要有空格,否则启动时会出现错误,举个例子,假如我在listen=YES后多了个空格,那我启动时就出现如下错误:
500OOPS:badboolvalueinconfigfilefor:listen

测试搭建好的匿名用户方式
#ftp127.0.0.1
Connectedto127.0.0.1.
220(vsFTPd2.0.3)
530PleaseloginwithUSERandPASS.
530PleaseloginwithUSERandPASS.
KERBEROS_V4rejectedasanauthenticationtype
Name(127.0.0.1:root):ftp
331Pleasespecifythepassword.
Password:
230Loginsuccessful.
RemotesystemtypeisUNIX.
Usingbinarymodetotransferfiles.
ftp>pwd
257/"//"
ftp>quit
221Goodbye.
#
OK,已经完成了,verynice.

高级配置
细心的朋友可能已经看出来我们只在默认配置文件增加了四行,就实现了FTP连接(也证明了vsftpd的易用性),那么让我们传个文件吧,呀!!传输失败了(见图1)
为什么呢?因为vsftpd是为了安全需要,/var/ftp目录不能把所有的权限打开,所以我们这时要建一个目录pub,当然也还是需要继续修改配置文件的。
#mkdir/var/ftp/pub
#chmod-R777/var/ftp/pub

为了测试方便,我们先建立一个名为kill-ano的脚本,是为了杀掉FTP程序的
#!/bin/bash
a=`/bin/ps-A|grepvsftpd-ano|awk/'{print   $1}/'`
kill-9   $a

那么现在大家看看我的匿名服务器配置文件吧
anonymous_enable=YES//允许匿名访问,这是匿名服务器必须的
write_enable=YES//全局配置可写
no_anon_password=YES//匿名用户login时不询问口令
anon_umask=077//匿名用户上传的文件权限是-rw----
anon_upload_enable=YES//允许匿名用户上传文件
anon_mkdir_write_enable=YES//允许匿名用户建立目录
anon_other_write_enable=YES//允许匿名用户具有建立目录,上传之外的权限,如重命名,删除
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没有动作被服务器踢出
chown_uploads=YES
chown_username=daemon//上传文件的属主
ftpd_banner=Welcometod-1701.comFTPservice.//FTP欢迎信息
anon_max_rate=80000//这是匿名用户的下载速度为80KBytes/s
check_shell=NO//不检测SHELL

现在再测试,先kill掉再启动FTP程序
#./kill-ano
#/usr/local/sbin/vsftpd-ano/etc/vsftpd-ano.conf&
上传一个文件测试一下,怎么样?OK了吧,下载刚上传的那个文件,恩?不行,提示
550Failedtoopenfile.
传输已失败!
传输队列已完成
1个文件传输失败

没有关系,你记得咱们设置了anon_umask=077了吗?所以你下载不了,如果你到服务器上touch一个文件(644),测试一下,是可以被下载下来的,好了,匿名服务器就说到这里了。

2、本地用户形式实现
#cd/home/xuchen/vsftpd-2.0.3//进入vsftpd-2.0.3的源代码目录
#makeclean//清除编译环境
#vibuilddefs.h////继续编辑builddefs.h文件,文件内容如下:
#ifndefVSF_BUILDDEFS_H

#defineVSF_BUILDDEFS_H
#defineVSF_BUILD_TCPWRAPPERS
#defineVSF_BUILD_PAM
#defineVSF_BUILD_SSL

#endif/*VSF_BUILDDEFS_H*/
将以上defineVSF_BUILD_PAM行的define改为undef,支持tcp_wrappers,不支持PAM认证方式,支持SSL,记住啊,如果支持了PAM认证方式,你本地用户是不能登陆的。

#make//直接在vsftpd-2.0.3里用make编译
#ls-lvsftpd
-rwxr-xr-x1rootroot84712Jun618:56vsftpd//可执行程序已被编译成功

创建必要的帐号,目录:
#useraddnobody//可能你的系统已经存在此帐号,那就不用建立
#mkdir/usr/share/empty//可能你的系统已经存在此目录,那就不用建立
#mkdir/var/ftp//可能你的系统已经存在此目录,那就不用建立
#useradd-d/var/ftpftp//可能你的系统已经存在此帐号,那就不用建立
#chownroot:root/var/ftp
#chmodog-w/var/ftp
请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

安装vsftp配置文件,可执行程序,man等:
#install-m755vsftpd/usr/local/sbin/vsftpd-loc
#install-m644vsftpd.8/usr/share/man/man8
#install-m644vsftpd.conf.5/usr/share/man/man5
#install-m644vsftpd.conf/etc/vsftpd-loc.conf
这样就安装完成了,那么我们开始进行简单的配置

#vi/etc/vsftpd-loc.conf,将如下三行加入文件
listen=YES
listen_port=21
tcp_wrappers=YES//支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)
listen=YES的意思是使用standalone启动vsftpd,而不是superdaemon(xinetd)控制它(vsftpd推荐使用standalone方式),注意事项请参看匿名用户的配置。
anonymous_enable=NO
local_enable=YES//这两项配置说不允许匿名用户登陆,允许本地用户登陆
#/usr/local/sbin/vsftpd-loc/etc/vsftpd-loc.conf&//以后台方式启动vsftpd

测试搭建好的匿名用户方式,先测试root用户吧:)
#ftp127.0.0.1
Connectedto127.0.0.1.
220(vsFTPd2.0.3)
530PleaseloginwithUSERandPASS.
530PleaseloginwithUSERandPASS.
KERBEROS_V4rejectedasanauthenticationtype
Name(127.0.0.1:root):root
331Pleasespecifythepassword.
Password:
230Loginsuccessful.
RemotesystemtypeisUNIX.
Usingbinarymodetotransferfiles.
ftp>pwd
257/"/root/"
ftp>quit
221Goodbye.
我们看到root用户可以登陆到ftp,他的登陆目录就是自己的主目录。
再测试一个系统用户,那我们先建立一个用户名叫xuchen的
#useraddxuchen
#passwdxuchen
Changingpasswordforuserxuchen.
NewUNIXpassword:
RetypenewUNIXpassword:
passwd:allauthenticationtokensupdatedsuccessfully.
建立好了,让我们开始测试吧!!
#ftp127.0.0.1
Connectedto127.0.0.1.
220(vsFTPd2.0.3)
530PleaseloginwithUSERandPASS.
530PleaseloginwithUSERandPASS.
KERBEROS_V4rejectedasanauthenticationtype
Name(127.0.0.1:root):xuchen
331Pleasespecifythepassword.
Password:
230Loginsuccessful.
RemotesystemtypeisUNIX.
Usingbinarymodetotransferfiles.
ftp>pwd
257/"/home/xuchen/"
ftp>quit
221Goodbye.
我们看到xuchen用户可以登陆到ftp,他的登陆目录也是自己的主目录。哈哈,又完成了!
高级配置
细心的朋友可能已经看出来如果我们不支持PAM认证方式,那么本地用户就可以登陆,而默认编译的vsftpd支持PAM认证方式,所以是不支持本地用户登陆的。恩,从这点说,这也是vsftp安全的一个表现----禁止本地用户登陆。
我们登陆后进行测试,传一个文件上去,得,失败了,那下载个文件下来吧,恩,这是成功的(见图2),而且我们发现我们可以进入到系统根目录(见图3),这样很危险。

那么改配置文件吧,为了测试方便,我们先建立一个名为kill-loc的脚本,也是为了杀掉FTP程序的
#!/bin/bash
a=`/bin/ps-A|grepvsftpd-loc|awk/'{print   $1}/'`
kill-9   $a

现在提供我的本地用户验证服务器配置文件吧(在匿名里写过的注释我就不在这里写了)
listen=YES
listen_port=21
tcp_wrappers=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022//本地用户文件上传后的权限是-rw-r-r
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
connect_from_port_20=YES
chroot_local_user=YES//限制用户在自己的主目录
#local_root=/ftp//你可以指定所有本地用户登陆后的目录,如果不设置此项,用户都会登陆于自己的主目录,就跟咱们前面测试的结果是一样的
local_max_rate=500000//本地用户的下载速度为500KBytes/s
idle_session_timeout=600
data_connection_timeout=120
nopriv_user=nobody//设定服务执行者为nobody,vsftpd推荐使用一个权限很低的用户,最好是没有家目录(/dev/null),没有登陆shell(/sbin/nologin),系统会更安全
ftpd_banner=Welcometod-1701.comFTPservice.
check_shell=NO

userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd.denyuser
以上三条设定不允许登陆的用户,用户列表存放在/etc/vsftpd.denyuser中,一行一个帐号如果我把xuchen这个用户加到vsftpd.denyuser里,那么登陆时会出现如下错误:
#ftp127.0.0.1
Connectedto127.0.0.1.
220Welcometod-1701.comFTPservice.
530PleaseloginwithUSERandPASS.
530PleaseloginwithUSERandPASS.
KERBEROS_V4rejectedasanauthenticationtype
Name(127.0.0.1:root):xuchen
530Permissiondenied.
Loginfailed.
呵呵,有意思吧,自己测试吧,本地用户登陆方式就介绍到这里吧!

3、虚拟用户形式实现(db及mysql形式)[已经实践操作,非常好用]
#cd/home/xuchen/vsftpd-2.0.3//进入vsftpd-2.0.3的源代码目录
#makeclean//清除编译环境
#vibuilddefs.h////继续编辑builddefs.h文件,文件内容如下:
#ifndefVSF_BUILDDEFS_H

#defineVSF_BUILDDEFS_H
#defineVSF_BUILD_TCPWRAPPERS
#undefVSF_BUILD_PAM
#defineVSF_BUILD_SSL(如果你系统没装OPENSSL,如果开启的话,MAKE会报错,设置成undef就好了)

#endif/*VSF_BUILDDEFS_H*/
将以上defineVSF_BUILD_PAM行的undef改为define,支持tcp_wrappers,支持PAM认证方式,支持SSL,和匿名用户形式是一样的。

#make//直接在vsftpd-2.0.3里用make编译
#ls-lvsftpd
-rwxr-xr-x1rootroot86088Jun622:26vsftpd//可执行程序已被编译成功

创建必要的帐号,目录:
#useraddnobody//可能你的系统已经存在此帐号,那就不用建立
#mkdir/usr/share/empty//可能你的系统已经存在此目录,那就不用建立
#mkdir/var/ftp//可能你的系统已经存在此目录,那就不用建立
#useradd-d/var/ftpftp//可能你的系统已经存在此帐号,那就不用建立
#chownroot:root/var/ftp
#chmodog-w/var/ftp
请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

安装vsftp配置文件,可执行程序,man等:
#install-m755vsftpd/usr/local/sbin/vsftpd-pam
#install-m644vsftpd.8/usr/share/man/man8
#install-m644vsftpd.conf.5/usr/share/man/man5
#install-m644vsftpd.conf/etc/vsftpd-pam.conf
这样就安装完成了,那么我们开始进行简单的配置

对于用DB库存储用户名及密码的方式来说:
(1)查看系统是否有相应软件包

#rpm–qa|grepdb4
db4-devel-4.2.52-7.1
db4-4.2.52-7.1
db4-utils-4.2.52-7.1
(2)建立一个logins.txt的文件,单行为用户名,双行为密码,例如
#vi/home/logins.txt

xuchen
12345

(3)建立数据库文件并设置文件属性
#db_load-T-thash-f/home/logins.txt/etc/vsftpd_login.db
#chmod600/etc/vsftpd_login.db
(4)建立认证文件
#vi/etc/pam.d/ftp插入如下两行
authrequired/lib/security/pam_userdb.sodb=/etc/vsftpd_login
accountrequired/lib/security/pam_userdb.sodb=/etc/vsftpd_login
(5)建立一个虚拟用户
useradd-d/home/vsftpd-s/sbin/nologinvsftpd
ls-ld/home/vsftpd
drwx------3vsftpdvsftpd1024Jun622:55/home/vsftpd/
(6)编写配置文件(注意事项请参看匿名用户的配置,这里不再赘述)
#vi/etc/vsftpd-pam.conf
listen=YES
listen_port=21
tcp_wrappers=YES//支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)
listen=YES的意思是使用standalone启动vsftpd,而不是superdaemon(xinetd)控制它(vsftpd推荐使用standalone方式)
anonymous_enable=NO
local_enable=YES//PAM方式此处必须为YES,如果不是将出现如下错误:
500OOPS:vsftpd:bothlocalandanonymousaccessdisabled!
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=vsftpd//这两行的意思是采用虚拟用户形式
virtual_use_local_privs=YES//虚拟用户和本地用户权限相同

pasv_enable=YES//建立资料联机采用被动方式
pasv_min_port=30000//建立资料联机所可以使用port范围的上界,0表示任意。默认值为0。
pasv_max_port=30999//建立资料联机所可以使用port范围的下界,0表示任意。默认值为0。
(7)启动程序
#/usr/local/sbin/vsftpd-pam/etc/vsftpd-pam.conf&
(8)测试连通及功能
#vi/home/vsftpd/test//建立一个文件,内容如下
1234567890
#chownvsftpd.vsftpd/home/vsftpd/test

#ftp127.0.0.1
Connectedto127.0.0.1.
220(vsFTPd2.0.3)
530PleaseloginwithUSERandPASS.
530PleaseloginwithUSERandPASS.
KERBEROS_V4rejectedasanauthenticationtype
Name(127.0.0.1:root):xuchen
331Pleasespecifythepassword.
Password:
230Loginsuccessful.
RemotesystemtypeisUNIX.
Usingbinarymodetotransferfiles.
ftp>pwd
257/"//"
ftp>sizetest
21311
ftp>quit
221Goodbye.
OK,用户名为xuchen,密码为12345可以连接到FTP服务器,看不到文件列表,但可以下载已知文件名的文件,不能上传文件,非常安全吧!!

如果我们需要用户看到文件,怎么办?也好办,在配置文件中加入如下语句:
anon_world_readable_only=NO//匿名登入者不能下载可阅读的档案,默认值为YES

如果需要让用户上传文件和下载文件分开,建议如下这么做
#vi/home/logins.txt
xuchen
12345
upload
45678
//首先建立虚拟用户upload,密码为45678
#db_load-T-thash-f/home/logins.txt/etc/vsftpd_login.db//更新数据文件

#mkdir/home/vsftpd/upload
#vi/etc/vsftpd-pam.conf加入如下语句
user_config_dir=/etc/vsftpd_user_conf
#mkdir/etc/vsftpd_user_conf
#vi/etc/vsftpd_user_conf/upload文件内容如下
local_root=/home/vsftpd/upload
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

#chmod700/home/vsftpd/upload
#chownvsftpd.vsftpd/home/vsftpd/upload/

这样,xuchen用户可以下载/home/vsftpd里的文件及upload里的文件,而upload用户可以上传和下载/home/vsftpd/upload文件夹的东西,但不能到/home/vsftpd里下载文件,很简单得实现了分用户上传和下载


对于用Mysql库存储用户名及密码的方式来说:
就是把用户名和密码放在mysql库里,实现起来也相当简单
(1)建立一个库并设置相应权限
#mysql–p
mysql>createdatabaseftpd;
mysql>useftpd;
mysql>createtableuser(namechar(20)binary,passwdchar(20)binary);
mysql>insertintouser(name,passwd)values(/'test1/',/'12345/');
mysql>insertintouser(name,passwd)values(/'test2/',/'54321/');
mysql>grantselectonftpd.usertoftpd@localhostidentifiedby/'123456/';
mysql>flushprivileges;刷新权限设置
mysql>quit
(2)下载libpam-mysql进行安装编译
下载地址如下:
http://nchc.dl.sourceforge.net/s...am_mysql-0.5.tar.gz
假设我们把它放在了/home/xuchen目录下
#cd/home/xuchen
#tarxzvfpam_mysql-0.5.tar.gz
#cdpam_mysql
#make
#cppam_mysql.so/lib/security
(3)建立PAM认证信息
#vi/etc/pam.d/ftp,内容如下
authrequired/lib/security/pam_mysql.souser=ftpdpasswd=123456host=localhostdb=ftpdtable=userusercolumn=namepasswdcolumn=passwdcrypt=0

accountrequired/lib/security/pam_mysql.souser=ftpdpasswd=123456host=localhostdb=ftpdtable=userusercolumn=namepasswdcolumn=passwdcrypt=0

注意:
crypt=n
crypt=0:明文密码
crypt=1:使用crpyt()函数(对应SQL数据里的encrypt(),encrypt()随机产生salt)
crypt=2:使用MYSQL中的password()函数加密
crypt=3:表示使用md5的散列方式
(4)建立本地虚拟用户
#useradd-d/home/ftpd-s/sbin/nologinftpd

(5)下面就差修改vsftpd.conf文件了,我把我的提供给大家参考吧:)
#vi/etc/vsftpd-pam1.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
chroot_local_user=YES
guest_enable=YES
guest_username=ftpd
listen=YES
listen_port=21
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
anon_world_readable_only=NO
virtual_use_local_privs=YES

#user_config_dir=/etc/vsftpd_user_conf
可以看出,和前面的用db库来验证没有多大区别,其实就是一个东西,一个用mysql来验证,一个用db库,我个人比较倾向于用db库来验证,在这个环境下,相对于Mysql来说,安全系数更高一点。

(6)#/usr/local/sbin/vsftpd-pam/etc/vsftpd-pam1.conf&//以后台方式启动

(7)测试连通
#ftp127.0.0.1
Connectedto127.0.0.1.
220(vsFTPd2.0.3)
530PleaseloginwithUSERandPASS.
530PleaseloginwithUSERandPASS.
KERBEROS_V4rejectedasanauthenticationtype
Name(127.0.0.1:root):test1
331Pleasespecifythepassword.
Password:
230Loginsuccessful.
RemotesystemtypeisUNIX.
Usingbinarymodetotransferfiles.
ftp>pwd
257/"//"
ftp>quit
221Goodbye.
看,成功了!!这样就实现了mysql的认证方式,很简单吧??

4、为FTP增加磁盘配额,从而避免恶意用户用垃圾数据塞满你的硬盘
我首先要说的是这个功能是系统自带的,而不是vsftp的功能之一,千万别搞混了。好了,我们先假设我们的系统用户ftpd的主目录是/home/ftpd,它是建立在/home分区中,那么如果我们要对ftpd用户进行磁盘限额,那我们需要修改/etc/fstab中根分区的记录,将/home分区的第4个字段改成defaults,usrquota,如下:
LABEL=/home/homeext3defaults,usrquota12
#reboot//重新启动系统使设置生效
也可以用
#mount-oremount/dev/sda6///dev/sda6的挂接点就是/home,这样可以不用启动系统。
这里我还要说明一下,如果我们对一个组进行磁配额,那我们需要增加参数grpquota,例如
LABEL=/home/homeext3defaults,grpquota12
也可以
LABEL=/home/homeext3defaults,usrquota,grpquota12
你想怎么限制都可以,自己组合参数吧。
#quotacheck-avu
说明:a-自动开启挂载文件系统的配额,v-显示信息,u-启用用户配额org-启用组配额
#edquotaftpd//为用户ftpd设置磁盘配额
OR
#edquota-ggrp//为组grp设置磁盘配额
系统会自动打开配额文件,如下:
Diskquotasforuserftpd(uid502):
Filesystemblockssofthardinodessofthard
/dev/sda6424001300
第一列是启用了配额的文件系统的名称。第二列显示了用户当前使用的块数,单位为KB。随后的两列用来设置用户在该文件系统上的软硬块限度。inodes列显示了用户当前使用的i节点数量。最后两列用来设置用户在该文件系统上的软硬i节点限度.硬限是用户或组群可以使用的磁盘空间的绝对最大值。达到了该限度后,磁盘空间就不能再被用户或组群使用了。软限定义可被使用的最大磁盘空间量。和硬限不同的是,软限可以在一段时期内被超过。这段时期被称为过渡期(graceperiod),默认七天的超越。过渡期可以用秒钟、分钟、小时、天数、周数、或月数表示。如果以上值中的任何一个被设置为0,那个限度就不会被设置。我设置了硬块限度为1KB,是为了测试方便。
#quotaon-avu//打开磁盘配额监控进程,u是用户g是组,这里我没设置g参数
要校验用户的配额是否被设置,我们可以使用以下命令:
#quotaftpd
Diskquotasforuserftpd(uid502):
Filesystemblocksquotalimitgracefilesquotalimitgrace
/dev/sda6424*011300
#edquota–t(-g)来设置过渡期(graceperiod)//当然只针对软限制而言
和另一个edquota命令相似,这个命令也会在文本编辑器中打开当前的文件系统配额:
Graceperiodbeforeenforcingsoftlimitsforusers:
Timeunitsmaybe:days,hours,minutes,orseconds
FilesystemBlockgraceperiodInodegraceperiod
/dev/sda67days7days
按你的需要修改后存盘退出
用以下命令显示磁盘配额使用状态
#repquota-a或repquota/dev/sda6(用户配额)
#repquota-g-a或repquota-a/dev/sda6(组的配额)
如果一切按照你的意思实施了,那么我们就进行测试了!如下图4

我们传了一个>1k的文件,没有成功,这样我们就成功的为用户ftpd增添了磁盘配额,要是哪一天你不想加磁盘配额了,怎么办?参看如下命令:
取消某个文件系统的配额限制
#quotaoff-vug/dev/sda6//删除home分区的磁盘限额
#删除/etc/fstab中设置配额的部分
修改软配额的最大超越时间
注意:
/,/boot/,/proc,/mnt/cdrom等不要使用配额,没用。而且磁盘配额不适合FAT和FAT32系统。
以后当新设置了某个用户的配额,可以使用如下命令,马上生效。
#quotacheck-auvgm--是不尝试重新挂载文件系统

备注:
1、vsftpd配置参数详细整理
#接受匿名用户
anonymous_enable=YES
#匿名用户login时不询问口令
no_anon_password=YES
#匿名用户主目录
anon_root=(none)
#接受本地用户
local_enable=YES
#本地用户主目录
local_root=(none)
#如果匿名用户需要密码,那么使用banned_email_file里面的电子邮件地址的用户不能登录
deny_email_enable=YES
#仅在没有pam验证版本时有用,是否检查用户有一个有效的shell来登录
check_shell=YES
#若启用此选项,userlist_deny选项才被启动
userlist_enable=YES
#若为YES,则userlist_file中的用户将不能登录,为NO则只有userlist_file的用户可以登录
userlist_deny=NO
#如果和chroot_local_user一起开启,那么用户锁定的目录来自/etc/passwd每个用户指定的目录(这个不是很清楚,很哪位熟悉的指点一下)
passwd_chroot_enable=NO
#定义匿名登入的使用者名称。默认值为ftp。
ftp_username=FTP

#################用户权限控制###############
#可以上传(全局控制).
write_enable=YES
#本地用户上传文件的umask
local_umask=022
#上传文件的权限配合umask使用
#file_open_mode=0666
#匿名用户可以上传
anon_upload_enable=NO
#匿名用户可以建目录
anon_mkdir_write_enable=NO
匿名用户其它的写权利(更改权限?)
anon_other_write_enable=NO
如果设为YES,匿名登入者会被允许下载可阅读的档案。默认值为YES。
anon_world_readable_only=YES
#如果开启,那么所有非匿名登陆的用户名都会被切换成guest_username指定的用户名
#guest_enable=NO
所有匿名上传的文件的所属用户将会被更改成chown_username
chown_uploads=YES
匿名上传文件所属用户名
chown_username=lightwiter
#如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录
chroot_list_enable=YES
#允许使用/"asyncABOR/"命令,一般不用,容易出问题
async_abor_enable=YES
管控是否可用ASCII模式上传。默认值为NO。
ascii_upload_enable=YES
#管控是否可用ASCII模式下载。默认值为NO。
ascii_download_enable=YES
#这个选项必须指定一个空的数据夹且任何登入者都不能有写入的权限,当vsftpd不需要filesystem的权限时,就会将使用者限制在此数据夹中。默认值为/usr/share/empty
secure_chroot_dir=/usr/share/empty

###################超时设置##################
#空闲连接超时
idle_session_timeout=600
#数据传输超时
data_connection_timeout=120
#PAVS请求超时
ACCEPT_TIMEOUT=60
#PROT模式连接超时
connect_timeout=60

################服务器功能选项###############
#开启日记功能
xferlog_enable=YES
#使用标准格式
xferlog_std_format=YES
#当xferlog_std_format关闭且本选项开启时,记录所有ftp请求和回复,当调试比较有用.
#log_ftp_protocol=NO
#允许使用pasv模式
pasv_enable=YES
#关闭安全检查,小心呀.
#pasv_promiscuous+NO
#允许使用port模式
#port_enable=YES
#关闭安全检查
#prot_promiscuous
#开启tcp_wrappers支持
tcp_wrappers=YES
#定义PAM所使用的名称,预设为vsftpd。
pam_service_name=vsftpd
#当服务器运行于最底层时使用的用户名
nopriv_user=nobody
#使vsftpd在pasv命令回复时跳转到指定的IP地址.(服务器联接跳转?)
pasv_address=(none)

#################服务器性能选项##############
#是否能使用ls-R命令以防止浪费大量的服务器资源
#ls_recurse_enable=YES
#是否使用单进程模式
#one_process_model
#绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是那个什么standalone模式
listen=YES
#当使用者登入后使用ls-al之类的指令查询该档案的管理权时,预设会出现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名称,则将此功能开启。
text_userdb_names=NO
#显示目录清单时是用本地时间还是GMT时间,可以通过mdtm命令来达到一样的效果
use_localtime=NO
#测试平台优化
#use_sendfile=YES

################信息类设置################
#login时显示欢迎信息.如果设置了banner_file则此设置无效
ftpd_banner=欢迎来到湖南三辰Fake-TaFTP网站.
#允许为目录配置显示信息,显示每个目录下面的message_file文件的内容
dirmessage_enable=YES
#显示会话状态信息,关!
#setproctitle_enable=YES

##############文件定义##################
#定义不能更改用户主目录的文件
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
#定义限制/允许用户登录的文件
userlist_file=/etc/vsftpd/vsftpd.user_list
#定义登录信息文件的位置
banner_file=/etc/vsftpd/banner
#禁止使用的匿名用户登陆时作为密码的电子邮件地址
banned_email_file=/etc/vsftpd.banned_emails
#日志文件位置
xferlog_file=/var/log/vsftpd.log
#目录信息文件
message_file=.message

##############目录定义#################
#定义用户配置文件的目录
user_config_dir=/etc/vsftpd/userconf
#定义本地用户登陆的根目录,注意定义根目录可以是相对路径也可以是绝对路径.相对路径是针对用户家目录来说的.
local_root=webdisk#此项设置每个用户登陆后其根目录为/home/username/webdisk
#匿名用户登陆后的根目录
anon_root=/var/ftp

#############用户连接选项#################
#可接受的最大client数目
max_clients=100
#每个ip的最大client数目
max_per_ip=5
#使用标准的20端口来连接ftp
connect_from_port_20=YES
#绑定到某个IP,其它IP不能访问
listen_address=192.168.0.2
#绑定到某个端口
#listen_port=2121
#数据传输端口
#ftp_data_port=2020
#pasv连接模式时可以使用port范围的上界,0表示任意。默认值为0。
pasv_max_port=0
#pasv连接模式时可以使用port范围的下界,0表示任意。默认值为0。
pasv_min_port=0

##############数据传输选项#################
#匿名用户的传输比率(b/s)
anon_max_rate=51200
#本地用户的传输比率(b/s)
local_max_rate=5120000

########################################
别外,如果要对每个用户进行单独的控制,只需要在user_config_dir中建立username文件,内容为数据传输和用户权利里面设置个人的合适的选项,用户自定义文件同样适合用pam支持的虚拟用户
附:FTP数字代码的意义
110重新启动标记应答。
120服务在多久时间内ready。
125数据链路埠开启,准备传送。
150文件状态正常,开启数据连接端口。
200命令执行成功。
202命令执行失败。
211系统状态或是系统求助响应。
212目录的状态。
213文件的状态。
214求助的讯息。
215名称系统类型。
220新的联机服务ready。
221服务的控制连接埠关闭,可以注销。
225数据连结开启,但无传输动作。
226关闭数据连接端口,请求的文件操作成功。
227进入passivemode。
230使用者登入。
250请求的文件操作完成。
257显示目前的路径名称。
331用户名称正确,需要密码。
332登入时需要账号信息。
350请求的操作需要进一部的命令。
421无法提供服务,关闭控制连结。
425无法开启数据链路。
426关闭联机,终止传输。
450请求的操作未执行。
451命令终止:有本地的错误。
452未执行命令:磁盘空间不足。
500格式错误,无法识别命令。
501参数语法错误。
502命令执行失败。
503命令顺序错误。
504命令所接的参数不正确。
530未登入。
532储存文件需要账户登入。
550未执行请求的操作。
551请求的命令终止,类型未知。
552请求的文件终止,储存位溢出。
553未执行请求的的命令,名称不正确。

2、VSFTPD官方资料翻译版(不完整版)---摘自中国Linux公社
翻译了部分VSFTPD的官方资料。
有些知道是什么意思,但难于翻译。有些涉及专业的知识,我自己也不懂,只好按字面翻译。有些我自己看不懂,只好尽量翻译。
如果看了其中一部分觉得糊涂,请参阅官方文挡。

安装篇
===============
这个文件详细介绍了如何从VSFTPD的.tar.gz分发包开始,建立和安装并运行VSFTPD。

1)建立VSFTPD
先进入解压.tar.gz文件后产生的目录内。如下:
cdvsftpd-2.0.1

编辑/"builddefs.h/"以操作compile-time设定。(tcp_wrappersbuild,等)

输入make,回车(如果它不工作请发邮件通知我.
这将产生一个二进制文件,你可以验证一下。如下:
[chris@localhostvsftpd]   $ls-lvsftpd
-rwxrwxr-x1chrischris61748Sep2700:26vsftpd

2)满足VSFTPD安装所需的一些条件
VSFTPD默认设置需要一个/"nobody/"用户,如果这个用户不存在,那么添加它。如下:
[root@localhostroot]#useraddnobody
useradd:usernobodyexists

VSFTPD默认设置需要一个空目录:/usr/share/empty.增加这个目录,如果它还不存在的话。如下:
[root@localhostroot]#mkdir/usr/share/empty/
mkdir:cannotcreatedirectory`/usr/share/empty/':Fileexists

如果容许匿名用户(anonymous),那么你将需要一个/"ftp/"用户和其home目录(这个home目录不属于“ftp”用户,而且“ftp/"用户也对其没有写权限)在你的系统中存在。
以下命令用来创建一个/"ftp/"用户,如果它还不存在的话。
[root@localhostroot]#mkdir/var/ftp/
[root@localhostroot]#useradd-d/var/ftpftp

(即使你的/"ftp/"用户已经存在,完成以下这两步也是很有好处的:)
[root@localhostroot]#chownroot.root/var/ftp
[root@localhostroot]#chmodog-w/var/ftp

3)安装VSFTPD的配置、执行和帮助文件。
输入/"makeinstall/"后会将二进制文件和帮助文件拷贝到适当的目录。
你也可以手工拷贝这些文件:
cpvsftpd/usr/local/sbin/vsftpd
cpvsftpd.conf.5/usr/local/man/man5
cpvsftpd.8/usr/local/man/man8

/"makeinstall/"不会拷贝默认的配置文件,所以建议你手工拷贝:
cpvsftpd.conf/etc
daidong注:根据你系统版本的不同,也可能是cpvsftpd.conf/etc/vsftpd

4)测试(无inetd影响)
VSFTPD能运行在独立模式(standalone)或者通过inetd(xinetd)来启动。
你能通过inetd来运行vsftpd以更好地控制它。但我们在首次运行时不这么做,以便检查系统是否现在配置正常。
编辑/etc/vsftpd.conf(daidong注:也可能是/etc/vsftpd/vsftpd.conf),并在最下面加入以下这一行:
listen=YES

这将告诉VSFTPD不要从inetd启动。
OK,现在试着启动FTP。
以ROOT登录。
确定你没有运行其他FTP服务(否则VSFTPD不能占用FTP所需的21端口)。
运行那个二进制文件,如下:
[root@localhostroot]#/usr/local/sbin/vsftpd&
[1]2104

如果一切正常,那么你将连上FTP服务器,如下:
[chris@localhostchris]   $ftplocalhost
Connectedtolocalhost(127.0.0.1).
220(vsFTPd1.1.1)
Name(localhost:chris):ftp
331Pleasespecifythepassword.
Password:
230Loginsuccessful.Havefun.
RemotesystemtypeisUNIX.
Usingbinarymodetotransferfiles.
ftp>ls
227EnteringPassiveMode(127,0,0,1,229,133)
150Herecomesthedirectorylisting.
d--x--x--x2004096Jan142002bin
d--x--x--x2004096Apr2120:52etc
drwxr-xr-x2004096Apr2120:52lib
drwxr-sr-x20504096Jul2622:58pub
226DirectorysendOK.
ftp>

5)从inetd或者类似方式启动(官方推荐使用standalone方式)
你也许想通过inetd或者类似方式启动VSFTPD,因为这能给你更多的感受。例如xinetd就有很多的设置。
(注意:VSFTPD的内在机制屏蔽了xinetd的大多数的有用的设置)。

如果使用标准的/"inetd/",你需要编辑/etc/inetd.conf,在其中加入以下一行:
ftpstreamtcpnowaitroot/usr/sbin/tcpd/usr/local/sbin/vsftpd

(确定你删除或者注释掉一些已存在的FTP服务配置行。如果你没有安装tcp_wrappers,或者不想使用它们,那么请去掉/usr/sbin/tcpdpart).

inetd需要指定并重新载入它的配置文件:
kill-SIGHUP`pidofinetd`

如果你想使用/"xinetd/",请参阅我们提供的范例/EXAMPLE/INTERNET_SITE/README.而其他范例文件将告诉你如何调配出更强大的xinetd功能。

6)为本地登录配置PAM文件(可选)
如果你在一台激活了PAM的设备上运行VSFTPD,你需要提供一个/etc/pam.d/ftp文件。否则非匿名用户将无法登录服务器。
(注:如果你的PAM版本比较老,那么这个文件也许是/etc/pam.conf).

做为一个标准设置,你可以拷贝一个已提供的范例文件,如下:
cpRedHat/vsftpd.pam/etc/pam.d/ftp

7)自定义你的配置文件
完成以上的配置后,建议你安装一个配置文件。默认的配置文件位置是/etc/vsftpd.conf.在VSFTPD软件分发包内有一个范例配置文件。
你可以拷贝其为/etc/vsftpd.conf以做进一步修改。
cpvsftpd.conf/etc
(daidong注:也可能是cpvsftpd.conf/etc/vsftpd).

这个默认配置即不容许本地登录也不容许匿名用户上传,也许你希望更改这个配置。


其它
===================
测试平台(已通过)
-流行的,功能完善的平台都能测试通过。在以下平台的较新版本,VSFTPD工作得很好。在其大部分较早的版本下,也运行正常。
-RedHatLinux
-RedHatEnterpriseLinux
-Solaris/GNUtools(Solaris8ornewer)
-SuSELinux
-DebianLinux
-OpenBSD
-FreeBSD
-NetBSD
-HP-UX/GNUtools
-IRIX/GNUtools
-MacOSX(note;olderversionshavesetgroups()problem.10.3.4reportedOK)
虚拟用户1
=============
这个例子示范了如何为虚拟用户设置VSFTPD/PAM。
虚拟用户是一个在系统中并不作为一个登录实体而存在的用户。使用虚拟用户比使用真实的用户更安全,因为这个账号只能用于FTP服务器。

虚拟用户经常用来提供给不大可信任的用户访问某些资源,而这些资源通常是其他普通用户不能访问的。

1)创建虚拟用户数据库
我们将使用pam_userdb来认证虚拟用户。这需要提供一个“db/"格式(一种通用数据库格式)的用户名/密码文件。
创建一个/"db/"格式的文件,首先要创建一个标准文本文件,并把用户名,密码以竖直排列方式输入。如logins.txt:
tom
foo
fired
bar
这个例子中,tom用户的密码是foo.fired用户的密码是bar.
以ROOT登录,创建一个数据库文件,如下:
db_load-T-thash-flogins.txt/etc/vsftpd_login.db&nb


本文地址:http://www.45fan.com/dnjc/67896.html
Tags: linux 构建 VSftpd
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部