vsftpd服务器同事支持匿名用户、本地用户、虚拟用户三类用户帐号,使用虚拟用户帐号可以提供集中管理的FTP根目录,同时将用于FTP登录的用户名,密码与系统用户帐号区分开,进一步增强了FTP服务器的安全性
以下是搭建基于虚拟用户的vsftpd服务的详细工程:
1.建立虚拟用户的用户名/密码数据库
vsftpd服务的虚拟用户数据库使用Berkeley DB格式的数据文件,建立数据文件需要用到db_load命令工具,要使用db_load这个命令,需要安装三个文件,
安装如下:
[root@locidcs CentOS]# rpm -ivh db4-utils-4.3.29-10.el5_5.2.i386.rpm
warning: db4-utils-4.3.29-10.el5_5.2.i386.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
Preparing... ########################################### [100%]
1:db4-utils ########################################### [100%]
首先建立文本格式的用户名密码列表文件,奇数行为用户名,偶数hang为上一行用户所对应的的密码。例如:添加用户mike、john,密码分别为123、456.
[root@locidcs ~]# vim /etc/vsftpd/vusers.list
mike
123
john
456
使用db_load工具将列表文件转化为DB数据库文件
[root@locidcs ~]# cd /etc/vsftpd/
[root@locidcs vsftpd]# db_load -T -t hash -f vusers.list vusers.db
[root@locidcs vsftpd]# file vusers.db
vusers.db: Berkeley DB (Hash, version 8, native byte-order)
[root@locidcs vsftpd]# chown 600 /etc/vsftpd/vusers.* //降低文件权限以提高安全性
在db_load命令中,“-f”选项用于指定用户和密码列表 “–T”选项允许非Berkeley DB的应用程序使用文本格式转换的DB数据文件,“-t hash”指定读取数据文件的基本方法。
这里我顺便把这个命令简单说明一下
查看db4的db_load命令使用方法:
[root@KSRV2 vsftpd]# db_load
usage: db_load [-nTV] [-c name=value] [-f file]
[-h home] [-P password] [-t btree | hash | recno | queue] db_file
usage: db_load -r lsn | fileid [-h home] [-P password] db_file
解释在本篇中,db_load命令几个相关选项很参数
The -T option allows non-Berkeley DB applications to easily load text files into databases.
If the database to be created is of type Btree or Hash, or the keyword keys is specified as set, the input must be paired
lines of text, where the first line of the pair is the key item, and the second line of the pair is its corresponding data
item. If the database to be created is of type Queue or Recno and the keywork keys is not set, the input must be lines of text, where each line is a new data item for the database.
选项-T允许应用程序能够将文本文件转译载入进数据库。由于我们之后是将CentOS vsftpd虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个
应用程序能够通过文本来载入用户数据,必须要使用这个选项。
If the -T option is specified, the underlying access method type must be specified using the -t option.
如果指定了选项-T,那么一定要追跟子选项-t
Specify the underlying access method. If no -t option is specified, the database will be loaded into a database of the same type as was dumped; for example, a Hash database will be created if a Hash database was dumped.
Btree and Hash databases may be converted from one to the other. Queue and Recno databases may be converted from one to the other. If the -k option was specified on the call to db_dump then Queue and Recno databases may be converted to Btree or Hash, with the key being the integer record number.
子选项-t,追加在在-T选项后,用来指定转译载入的数据库类型。扩展介绍下,-t可以指定的数据类型有Btree、Hash、Queue和Recon数据库。这里,接下来我们需要指定的是Hash型。
查看生成的CentOS vsftpd虚拟用户数据文件
[root@localhost vsftpd]# ll
-rw-r--r-- 1 600 root 12288 01-21 20:26 vusers.db
需要特别注意的是,以后再要添加虚拟用户的时候,只需要按照"一行用户名,一行口令"的格式将新用户名和口令添加进虚拟用户名单文件。但是光这样做还不够, 不会生效的哦!还要再执行一遍" db_load -T -t hash -f 虚拟用户名单文件 vsftpd虚拟用户数据库文件.db "的命令使其生效才可以!
数据库文件中保存着虚拟帐号的密码信息,为了防止非法用户盗取哈,我们可以修改该文件的访问权限。生成的认证文件的权限应设置为只对root用户可读可写,即600
[root@localhost vsftpd]# chmod 600 /etc/vsftpd/vusers.db
[root@localhost vsftpd]# ll /etc/vsftpd/vusers.db
-rw------- 1 600 root 12288 01-21 20:26 /etc/vsftpd/vusers.db
2.建立FTP访问的根目录及虚拟用户对应的系统帐号。
vsftpd虚拟用户需要有一个对应的系统用户帐号(该帐号无需设置密码及登录shell),该用户帐号的宿主目录作为所有虚拟用户登录后的共同FTP根目录。
[root@locidcs ~]# useradd -d /var/ftproot -s /sbin/nologin virtual //建立映射帐号virtual
[root@locidcs ~]# chmod 755 /var/ftproot/ //更改FTP根目录权限
[root@locidcs ~]# ls -lh /boot > /var/ftproot/vutest.file //建立测试文件
3.建立PAM认证文件
为了使服务器能够使用数据库文件,对客户端进行身份验证,需要调用系统的PAM模块.PAM(Plugable Authentication Module)为可插拔认证模块,主要用于为程序提供用户认证控制,vsftpd服务使用的默认PAM配置文件为“/etc/pam.d/vsftpd”,可以参考该文件的格式建立心的PAM配置文件,用于虚拟用户认证控制。
[root@locidcs ~]# vi /etc/pam.d/vsftpd.vu
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
配置时注意将db选项指定为先前建立的虚拟用户的数据库文件vusers(省略.db扩展名)。
4.修改vsftpd.conf配置文件,添加虚拟用户支持
在vsftpd.conf配置文件中添加guest_enable、guest_username 配置项,将访问FTP服务的所有虚拟用户对应到同一系统用户帐号virtual,并修改pam_service_name配置项,指向上一步建立的PAM配置文件“/etc/pam.d/vsftpd.vu”
[root@locidcs ~]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES //使用虚拟用户需要启用本地用户
anon_umask=022 //设置虚拟用户所上传文件的默认权限掩码
write_enable=YES
guest_enable=YES //启用用户映射功能
guest_username=virtual //将映射用户制定为virtual
vsftpd对于文件传输速度限制并不是绝对锁定在一个数值上哈,而是在80%~120%之间变化哈~比如设置100KB/s则实际是速度在80KB/s~120KB/s之间变化哈~
在vsftpd服务中,虚拟用户账户默认作为匿名用户处理以降低权限,因此对应的权限设置通常使用以anon_开头的配置项。例如,在设置虚拟用户所上传文件的默认权限掩码时应采用配置项anon_umask 而不是local_umask。
提示:每行的值都不要有空格,否则启动时会出现错误,举个例子,假如我在listen=YES后多了个空格,那我启动时就出现如下错误:500 OOPS: bad bool value in config file for: listen
5.为不同的虚拟用户建立独立的配置文件
通过配置前面的四个步骤,实际上已经可以重新启动vsftpd并提供服务了,使用虚拟用户帐号可以登录FTP服务器并下载文件,本步骤将介绍如何为个别虚拟用户设置不同的访问权限。
以为虚拟用户john添加上传文件、创建目录的权限为例,推荐实现步骤如下:
①修改vsftpd.conf主配置文件,添加用户配置目录支持
[root@locidcs ~]# vi /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir //添加此行配置项,制定用户配置目录位置
②为用户mike、john建立独立的配置目录及文件
[root@locidcs ~]# mkdir /etc/vsftpd/vusers_dir //创建用户配置目录
[root@locidcs ~]# cd /etc/vsftpd/vusers_dir/
[root@locidcs vusers_dir]# vi john //为john用户建立独立的配置文件
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@locidcs vusers_dir]# touch mike //为mike用户建立独立的配置文件(无额外权限设置)
如果需要禁用或者仅允许一部分虚拟用户帐号,同样可以使用“/etc/vsftpd/user_list”列表文件。需要注意的是,在“/etc/vsftpd/ftpusers”文件中加入虚拟用户名,并不能禁止对应的系统账户。
6.重新启动vsftpd服务
[root@locidcs ~]# service vsftpd restart
关闭 vsftpd: [确定]
启动 vsftpd: [确定]
7.测试
[root@locidcs ~]# ftp 192.168.1.101
Connected to 192.168.1.101.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.101:root): mike
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,1,101,62,181)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 474 Jan 12 09:15 vutest.file
226 Directory send OK.
[root@locidcs ~]# ftp 192.168.1.101
Connected to 192.168.1.101.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.101:root): john
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,1,101,76,150)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 474 Jan 12 09:15 vutest.file
226 Directory send OK.
①使用mike用户可以登录vsftpd服务器,并可以浏览、下载文件,但无法上传文件
②使用john用户可以登录vsftpd服务器,并可以浏览、下载文件,也可以上传文件
③使用匿名用户或其他系统用户时,将不能登录该vsftpd服务器