CentOS/Linux Apache/Web服务器集成vsftp服务器的配置及支持多个虚拟用户的配置方法

如果仅仅是需要简单的上传下载一些文件的话,不建议安装FTP服务器,通过SSH的sftp通道既方便又安全,客户端推荐 FileZilla FTP Client 。
但如果是针对多个用户使用,且对权限等方面有较高的要求,则推荐采用支持虚拟用户的vsftp服务器。

目录

前言

vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器,目前已经被许多大型站点所采用,如ftp.RedHat.com,ftp.kde.org,ftp.gnome.org.等。vsftpd的实现有三种方式
1、匿名用户形式:在默认安装的情况下,系统只提供匿名用户访问
2、本地用户形式:以/etc/passwd中的用户名为认证方式。这种形式FTP服务器的用户本身也是系统用户。这显然是一个安全隐患,因为这些用户不仅能够访问FTP,也能够访问其它的系统资源。如何解决这个问题呢?答案就是创建一个虚拟用户的FTP服务器。虚拟用户的特点是只能访问服务器为其提供的FTP服务,而不能访问系统的其它资源。所以,如果想让用户对FTP服务器站内具有写权限,但又不允许访问系统其它资源,可以使用虚拟用户来提高系统的安全性。

在VSFTP中,认证这些虚拟用户使用的是单独的口令库文件(pam_userdb),由可插入认证模块(PAM)认证。使用这种方式更加安全,并且配置更加灵活。
3、虚拟用户形式:支持将用户名和口令保存在数据库文件或数据库服务器中。相对于FTP的本地用户形式来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源,这大大增强系统本身的安全性。相对于匿名用户而言,虚拟用户需要用户名和密码才能获取FTP服务器中的文件,增加了对用户和下载的可管理性。对于需要提供下载服务,但又不希望所有人都可以匿名下载;既需要对下载用户进行管理,又考虑到主机安全和管理方便的FTP站点来说,虚拟用户是一种极好的解决方案。

FTP服务器的基本原理

1. 基本概念:ftp是文件传输协议,(file transport portocol)
2. 数据传输模式:主动模式和被动模式(要和binary ascii 区分一下)
3. 使用的端口号:
A 主动模式 :命令控制端口:21 数据传输端口:20
B 被动模式 :命令控制端口:21 数据传输端口:1024之后的随机端口

常用的FTP 服务器软件

1. windows下:iis server-U
2. Linux下:wu-ftp proftp vsftp (现在的主流是vsftp,其他的两种基本被淘汰)

常用的ftp客户端软件

1.特点:运行在图形环境下的窗口程序,可使用鼠标和通过菜单进行操作,操作方便
2.常用的ftp客户端软件: windows下有Cuteftp leapftp flashxp filezilla是windows下运行的开源软件
Linux下有gftp,是GNOME桌面环境中运行的ftp客户的软件。

vsftp安装与配置

开启防火墙ftp端口

   vi /etc/sysconfig/iptables     #编辑防火墙配置文件
   -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT(允许21端口通过防火墙)
   -A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT(允许20端口通过防火墙)
   -A INPUT -m state --state NEW -m tcp -p tcp --dport 9000:9045 -j ACCEPT(设置ftp被动模式的端口范围)

注意:如果ftp端口修改为其它的端口(比如2222),这时防火墙就要开启2222端口,这里防火墙是以CentOS 6.0为例

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2222 -j ACCEPT(允许2222端口通过防火墙)

/etc/init.d/iptables restart #重启防火墙使配置生效

检查系统是否已安装vsftp

rpm -q vsftpd
package vsftpd is not installed #说明系统没有安装vsftpd

安装vsftpd

yum install vsftpd
按Y回车,系统自动安装
/etc/init.d/vsftpd start #启动vsftpd
service vsftpd restart #重启
service vsftpd stop #停止
chkconfig vsftpd on #设置开机时自动运行

配置vsftp服务器

配置文件说明:
/etc/vsftpd/vsftpd.conf vsftpd的核心配置文件
/etc/vsftpd/ftpusers 用于指定哪些用户不能访问FTP服务器
/etc/vsftpd/user_list 指定允许使用vsftpd的用户列表文件
/etc/vsftpd/vsftpd_conf_migrate.sh 是vsftpd操作的一些变量和设置脚本
/var/ftp/ 默认情况下匿名用户的根目录
========================================================================
配置/etc/vsftpd/vsftpd.conf
配置前先备份
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
恢复文件
cp /etc/vsftpd/vsftpd.conf.bak /etc/vsftpd/vsftpd.conf

去除配置文件的多余注释,主要是方便阅读
grep -v "^#" /etc/vsftpd/vsftpd.conf > /etc/vsftpd/vsftpd.conf.temp
cat /etc/vsftpd/vsftpd.conf.temp > /etc/vsftpd/vsftpd.conf

vi /etc/vsftpd/vsftpd.conf #配置

#ftp时间和系统同步,如果启动有错误,请注销
use_localtime=YES
#添加此行,解决客户端登陆缓慢问题!重要!默认vsftpd开启了DNS反响解析!这里需要关闭,如果启动有错误,请注销!
reverse_lookup_enable=NO
#默认无此行,ftp端口为21,添加listen_port=2222把默认端口修改为2222,注意:防火墙同时要开启2222端口
listen_port=21
#禁止匿名用户
anonymous_enable=NO
#设定本地用户可以访问。注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问
local_enable=YES
#全局设置,是否容许写入(无论是匿名用户还是本地用户,若要启用上传权限的话,就要开启他)
write_enable=YES
#创建或上传后文件的权限掩码,文件的权限是644
local_umask=022
#禁止匿名用户上传
anon_upload_enable=NO
#禁止匿名用户建立目录
anon_mkdir_write_enable=NO
#设定开启目录标语功能,进入目录时可以显示一些设定的信息,可以通过message_file=.message来设置
dirmessage_enable=YES
#设定开启日志记录功能
xferlog_enable=YES
#主动连接的端口号
connect_from_port_20=YES
#设定禁止上传文件更改宿主
chown_uploads=NO
#设定vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来,并且由于这里更改了vsftpd的服务宿主用户为手动建立的vsftpd。必须注意给与该用户对日志的写入权限,否则服务将启动失败,如chown  vsftpd.vsftpd /var/log/vsftpd.log
xferlog_file=/var/log/vsftpd.log
#格式化日志格式,使用标准格式
xferlog_std_format=YES
#设定支撑vsftpd服务的宿主用户为手动建立的vsftpd用户。注意,一旦做出更改宿主用户后,必须注意一起与该服务相关的读写文件的读写赋权问题。比如日志文件就必须给与该用户写入权限等
nopriv_user=vsftpd
#设定支持异步传输功能
async_abor_enable=YES
#设定支持ASCII模式的上传
ascii_upload_enable=YES
#设定支持ASCII模式的下载
ascii_download_enable=YES
#设定vsftpd的登陆欢迎语
ftpd_banner=Welcome to 3mu FTP service ^_^
#禁止本地用户登出自己的FTP主目录(NO表示禁止登出,YES表示允许登出)
chroot_local_user=NO
#禁止虚拟用户登出自己的FTP主目录,即限定在自己的目录内,不让他出去,就比如如果设置成NO,那么当你登陆到ftp的时候,可以访问服务器的其他一些有权限目录。设置为YES后,即锁定你的目录了
chroot_list_enable=YES
#文件中的用户被禁锢在自己的宿主目录中
chroot_list_file=/etc/vsftpd/chroot_list
#设为YES时,以standalone方式来启动,否则以超级进程的方式启动。顺便展开说明一下,所谓StandAlone模式就是该服务拥有自己的守护进程支持,在ps -A命令下我们将可用看到vsftpd的守护进程名。如果不想工作在StandAlone模式下,则可以选择SuperDaemon模式,在该模式下vsftpd将没有自己的守护进程,而是由超级守护进程Xinetd全权代理,与此同时,vsftp服务的许多功能将得不到实现。
listen=YES
#设定PAM服务下vsftpd的验证配置文件名。因此,PAM验证将参考/etc/pam.d/下的vsftpd文件配置
pam_service_name=vsftpd
#在/etc/vsftpd/user_list中的用户将不得使用FTP,设为YES的时候,如果一个用户名是在userlist_file参数指定的文件中,那么在要求他们输入密码之前,会直接拒绝他们登陆
userlist_enable=YES
#设为YES时,ftp服务器将使用tcp_wrappers作为主机访问控制方式,支持 TCP Wrappers 的防火墙机制
tcp_wrappers=YES
#设定空闲连接超时时间,这里也可以不设置,将具体数值留给每个具体用户具体指定,当然如果不指定的话,还是使用系统的默认值600,单位秒。
idle_session_timeout=300
#空闲1秒后服务器断开
data_connection_timeout=1
#########################################################
#以下这些是关于vsftpd虚拟用户支持的重要配置项目。
#默认vsftpd.conf中不包含这些设定项目,需要自己手动添加配置
#########################################################
#设定启用虚拟用户功能
guest_enable=YES
#指定虚拟用户的宿主用户(这个是我们后面要新建的用户),系统默认是ftp用户,这里是全局设置,在虚拟用户的配置文件中也可以单独指定来覆盖全局设置的用户
guest_username=vsftpd
#设定虚拟用户个人vsftp的配置文件存放路径。也就是说,这个被指定的目录里,将存放每个vsftp虚拟用户个性的配置文件,一个需要注意的
#地方就是这些配置文件名必须和虚拟用户名相同。
#比如说vsftpd.conf的配置文件,你复制到这个目录下,你要mv一下,配置成虚拟用户的名称
user_config_dir=/etc/vsftpd/vsftpd_config
#当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。
#当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限。默认情况下此参数是关闭的(NO)。
virtual_use_local_privs=YES
#设置被动模式的端口范围
pasv_min_port=9000
#设置被动模式的端口范围
pasv_max_port=9045
#保持5秒
accept_timeout=5
#1秒后重新连接
connect_timeout=1

建立vsftpd的日志文件,并更改属主为vsftpd的服务宿主用户(这一步可以放在修改配置表前面):
touch /var/log/vsftpd.log
chown vsftpd.vsftpd /var/log/vsftpd.log

创建要将哪些用户固定在家目录的配置文件

touch /etc/vsftpd/chroot_list
#例chroot_list内容:
web1
web2

将需要固定用户目录的虚拟用户名字写进去即可。每行写一个即可

建立虚拟用户名单文件

touch /etc/vsftpd/virtusers
编辑虚拟用户名单文件:(第一行账号,第二行密码,注意:不能使用root做用户名,系统保留)
vi /etc/vsftpd/virtusers
web1
123456
web2
123456
web3
123456
数据库生成后最好清空该文本文件,并在安全的地方记录用户名和密码
vsftp的虚拟用户,虚拟用户并不是系统用户,也就是说这些FTP的用户在系统中是不存在的。他们的总体权限其实是集中寄托在一个在系统中的某一个用户身上的,所谓vsftpd的虚拟宿主用户,就是这样一个支持着所有虚拟用户的宿主用户。由于他支撑了FTP的所有虚拟的用户,那么他本身的权限将会影响着这些虚拟的用户,因此,处于安全性的考虑,也要十分注意对该用户的权限的控制,该用户也绝对没有登陆系统的必要,这里也设定他为不能登陆系统的用户。

多个虚拟用户对应多个系统用户的配置可参考:http://kinggoo.com/app-installvsftpdconf.htm
=======================================================================

生成虚拟用户数据文件

db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
chmod 600 /etc/vsftpd/virtusers.db
#设定PAM验证文件,并指定对虚拟用户数据库文件进行读取
数据库文件中保存着虚拟帐号的密码信息,为了防止非法用户盗取,我们可以修改该文件的访问权限。生成的认证文件的权限应设置为只对root用户可读可写,即600

以后每次新增虚拟用户的时候,都需要执行以上两个步骤。
=======================================================================

编辑PAM验证配置文件

为了使服务器能够使用数据库文件,对客户端进行身份验证,需要调用系统的PAM模块.PAM(Plugable Authentication Module)为可插拔认证模块,不必重新安装应用系统,通过修改指定的配置文件,调整对该程序的认证方式。PAM模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量与认证有关的配置文件,并以服务名称命名。
在/etc/pam.d/vsftpd的文件头部加入以下信息(在后面加入无效)
修改前先备份 cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
恢复cp /etc/pam.d/vsftpd.bak /etc/pam.d/vsftpd
vi /etc/pam.d/vsftpd

auth sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib/security/pam_userdb.so db=/etc/vsftpd/virtusers

注意:如果系统为64为,则上面的lib改为lib64,否则配置失败
以上两条是手动添加的,内容是对虚拟用户的安全和帐户权限进行验证。
这里的auth是指对用户的用户名口令进行验证。
这里的accout是指对用户的帐户有哪些权限哪些限制进行验证。
其后的sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了。相反,如果没有通过的话,也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核。
再后面的/lib/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行验证。
最后的db=/etc/vsftpd/virtusers则指定了验证库函数将到这个指定的数据库中调用数据进行验证。

建立虚拟宿主用户

新建一个系统用户vsftpd,用户家目录为/home/wwwroot, 用户登录终端设为/bin/false(即使之不能登录系统)

useradd vsftpd -d /home/wwwroot -s /bin/false
   chown vsftpd:vsftpd /home/wwwroot -R
   chown apache:apache /home/wwwroot -R   #如果虚拟用户的宿主用户为apache,需要这样设置。

默认的vsftpd的服务宿主用户是root,但是这不符合安全性的需要。这里建立名字为vsftpd的用户,用他来作为支持vsftpd的服务宿主用户。由于该用户仅用来支持vsftpd服务用,因此没有许可他登陆系统的必要,并设定他为不能登陆系统的用户。

建立虚拟用户个人vsftp的配置文件

mkdir /etc/vsftpd/vconf
cd /etc/vsftpd/vconf
touch web1 web2 web3 #这里创建三个虚拟用户配置文件

vi web1 #编辑用户web1配置文件,其他的跟这个配置文件类似

local_root=/home/wwwroot/web1/ #设定虚拟用户所在的目录
   write_enable=YES
   anon_world_readable_only=NO #允许浏览,下载
   anon_upload_enable=YES
   anon_mkdir_write_enable=YES
   anon_other_write_enable=YES
   chroot_local_user=YES  #禁止本地用户登出自己的FTP主目录。

--------------------------------
这里将原vsftpd.conf配置文件经过简化后保存作为虚拟用户配置文件的模版。这里将并不需要指定太多的配置内容,主要的框架和限制交由vsftpd的主配置文件vsftpd.conf来定义,即虚拟用户配置文件当中没有提到的配置项目将参考主配置文件中的设定。而在这里作为虚拟用户的配置文件模版只需要留一些和用户流量控制,访问方式控制的配置项目就可以了。这里的关键项是local_root这个配置,用来指定这个虚拟用户的FTP主路径。

重启vsftpd服务器

/etc/init.d/vsftpd restart

备注:guest_username=vsftpd #指定虚拟用户的宿主用户(就是我们前面新建的用户)
如ftp的目录是指向网站根目录的,用来上传网站程序的话
guest_username=apache #指定虚拟用户的宿主用户为apache运行账户,可以避免很多权限设置问题

如果生成虚拟用户数据文件的时候出现以下错误
users.db-bash: db_load: command not found
因为在执行db命令时候软件包没有安装
db4
db4-devel
db4-java
db4-tcl
db4-utils

可以运行yum install db4* 命令安装

至此,vsftpd安装配置完成。

测试

通过ftp命令或是其它客户端进行测试
注意:ftp命令是ftp客户端,vsftp是ftp服务器,两者不是一个概念。
如果想用ftp命令进行测试,需要安装ftp客户端
yum install ftp

其它

使用mysql认证vsftpd虚拟用户。
详情可参考:mysql认证vsftpd虚拟用户:http://coolnull.com/762.html

参考资料:
CentOS Linux vsftp服务器配置:http://www.osyunwei.com/archives/651.html
vsftp服务安装搭建,虚拟用户配置:http://kinggoo.com/app-installvsftpdconf.htm
LINUX下安装vsftp,使用虚拟用户:http://blog.sina.com.cn/s/blog_5d3855450100molh.html
VSFTP配置详解+虚拟用户的支持:http://rdlinux.blog.51cto.com/1458031/293784
vsftp虚拟用户配置:http://www.cnblogs.com/cnsanshao/p/3539047.html
让vsftp支持虚拟用户:http://linux.chinaunix.net/techdoc/net/2007/09/22/968451.shtml
vsftp与PAM虚拟用户:http://dngood.blog.51cto.com/446195/1094079
工作笔记—基于虚拟用户方式的vsftp高级设置:http://heylinux.com/archives/726.html
分享一个用于管理vsftp的虚拟用户的脚本:http://heylinux.com/archives/1469.html
CentOS 6.3下安装vsftp,虚拟用户:http://cd4017.blog.sohu.com/230717726.html

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据