由于工作需要配置一台FTP服务器,参考网上的一些文章,结合自己的实际配置情况,详细过程记录如下,都是真实操作的过程
环境 :
CentOS6.4_X64
Vsftpd-2.2.2-11.el6_3.1
一、安装vsftp pam db4
一般pam和db4默认系统已经安装,如果没有安装如下一并安装吧
yum install vsftpd pam* db4* -y
将vsftp配置为系统服务
chkconfig --level 35 vsftpd on
安装完成后生成如下配置文件:
[root@localhost vsftpd]# ll /etc/vsftpd/
-rw-------. 1 root root 125 Feb 19 2013 ftpusers
-rw-------. 1 root root 361 Feb 19 2013 user_list
-rw-r--r--. 1 root root 4691 Sep 17 16:54 vsftpd.conf
-rwxr--r--. 1 root root 338 Feb 19 2013 vsftpd_conf_migrate.sh
二、 建立ftp虚拟宿主帐户
#useradd vsftpd -s /sbin/nologin
vsftpd供虚拟帐户映射的系统真实用户,不需要登录shell权限
三、配置vsftpd.conf
备份现有配置文件:
[root@localhost vsftpd]# cd /etc/vsftpd/
[root@localhost vsftpd]# cp vsftpd.conf vsftpd.conf.bak
下面更改配置文件:
[root@localhost vsftpd]# vi vsftpd.conf
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
#anonymous_enable=YES
anonymous_enable=NO //不允许匿名用户访问。
#
# Uncomment this to allow local users to log in.
local_enable=YES //设定本地用户可以访问。主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问。
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES //设定可以进行写操作。
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022 //设定上传后文件的权限掩码。
#
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
#anon_upload_enable=YES
anon_upload_enable=NO //禁止匿名用户上传。
#
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
#anon_mkdir_write_enable=YES
anon_mkdir_write_enable=NO //禁止匿名用户建立目录。
#
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES ///设定开启目录标语功能。
#
# Activate logging of uploads/downloads.
xferlog_enable=YES
设定开启日志记录功能。
#
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES ///设定端口20进行数据连接。
#
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES
chown_uploads=NO ///设定禁止上传文件更改宿主。
#chown_username=whoever
#
# You may override where the log file goes if you like. The default is shown
# below.
xferlog_file=/var/log/vsftpd.log ///设定Vsftpd的服务日志保存路径。该文件要手动建立,并且必须给与该vsftpd用户对日志文件vsftpd.log的读写权限,否则服务将启动失败。
#
# If you want, you can have your log file in standard ftpd xferlog format
xferlog_std_format=YES ///设定日志使用标准的记录格式。
#
# You may change the default value for timing out an idle session.
#idle_session_timeout=600 ///设定空闲连接超时时间,单位秒。
#
# You may change the default value for timing out a data connection.
#data_connection_timeout=120 ///设定单次最大连续传输时间,单位秒。
#
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpsecure
nopriv_user=vsftpd ///设定支撑Vsftpd服务的宿主用户为手动建立的Vsftpd用户。注意,一旦做出更改宿主用户后,必须注意一起与该服务相关的读写文件的读写赋权问题。比如日志文件就必须给与该用户写入权限等。
#
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
async_abor_enable=YES ///设定支持异步传输功能。
#
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that on some FTP servers, ASCII support allows a denial of service
# attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd
# predicted this attack and has always been safe, reporting the size of the
# raw file.
# ASCII mangling is a horrible feature of the protocol.
ascii_upload_enable=YES
ascii_download_enable=YES ///设定支持ASCII模式的上传和下载功能。
#
# You may fully customise the login banner string:
ftpd_banner=Welcome to blah FTP service. //设定Vsftpd的登陆标语
#
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
# (default follows)
#banned_email_file=/etc/vsftpd/banned_emails
#
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
#chroot_list_enable=YES
chroot_local_user=YES
chroot_list_enable=YES ///禁止用户登出自己的FTP主目录。
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list ///如果开启了chroot_list_enable=YES,那么一定要开启这个,这条是锁定登录用户只能家目录的位置。
注:建立chroot_list文件
touch/etc/vsftp/chroot_list,然后将帐户输入一行一个,保存就可以了,如果不需要限制用户,也可以只建立一个空文件,或者将chroot_list_enable=NO
#
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
#ls_recurse_enable=YES
ls_recurse_enable=NO ///禁止用户登陆FTP后使用"ls -R"的命令。该命令会对服务器性能造成巨大开销。如果该项被允许,那么挡多用户同时使用该命令时将会对该服务器造成威胁。
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=YES ///设定该Vsftpd服务工作在StandAlone模式下。顺便展开说明一下,所谓StandAlone模式就是该服务拥有自己的守护进程支持,在ps -A命令下我们将可用看到vsftpd的守护进程名。如果不想工作在StandAlone模式下,则可以选择SuperDaemon模式,在该模式下 vsftpd将没有自己的守护进程,而是由超级守护进程Xinetd全权代理,与此同时,Vsftp服务的许多功能将得不到实现。
#
# This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6
# sockets, you must run two copies of vsftpd whith two configuration files.
# Make sure, that one of the listen options is commented !!
#listen_ipv6=YES
pam_service_name=vsftpd ///设定PAM服务下Vsftpd的验证配置文件名。因此,PAM验证将参考/etc/pam.d/下的vsftpd文件配置。
userlist_enable=YES ///设定userlist_file中的用户将不得使用FTP。
tcp_wrappers=YES ///设定支持TCP Wrappers。
使用虚拟用户需要增加以下部分默认中不包含这些设定项目,需要自己手动添加:
guest_enable=YES ///设定启用虚拟用户功能。
guest_username=vsftpd ///指定虚拟用户的宿主用户。
virtual_use_local_privs=YES ///设定虚拟用户的权限符合他们的宿主用户。
user_config_dir=/etc/vsftpd/vconf ///设定虚拟用户个人Vsftp的配置文件存放路径。这个被指定的目录里,将存放每个Vsftp虚拟用户个性的配置文件,注:就是这些配置文件名必须和虚拟用户名相同。
四、创建日志文件
[root@localhost vsftpd]# touch /var/log/vsftpd.log //日志文件 [root@localhost vsftpd]# chown vsftpd.vsftpd /var/log/vsftpd.log
五、创建虚拟用户名单文件
建立了一个虚拟用户名单文件,用来记录vsftpd虚拟用户的用户名和口令的数据文件,这里命名为v_user。为了目录清晰,这个名单文件就放置在/etc/vsftpd/vconf/下
[root@localhost vsftpd]# mkdir /etc/vsftpd/vconf/
[root@localhost vsftpd]# touch /etc/vsftpd/vconf/v_user
六、创建虚拟用户
编辑上面创建的虚拟用户名单文件v_user,在其中加入用户的用户名和口令信息。
格式:奇数行为用户名,偶数行是密码,其他的以此类推
[root@localhost vsftpd]# vi /etc/vsftpd/vconf/v_user
test //用户名
123123 //密码
七、生成虚拟用户数据库文件
[root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/vconf/v_user /etc/vsftpd/vconf/v_user.db
注: 上面的为一整行,不要分开。
需要特别注意的是,以后再要添加虚拟用户的时候,只需要按照上面的格式:“奇数行为用户名,偶数行是密码”的格式将新用户名和口令添加进虚拟用户名单文件。如此不会生效的,还要再执行一遍“ db_load -T -t hash -f 虚拟用户名单文件 虚拟用户数据库文件.db ”的命令使其生效才可以!
这个命令简单说明一下,察看db4的db_load命令使用方法:
[root@localhost 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命令几个相关选项很参数-T
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允许应用程序能够将文本文件转译载入进数据库。由于我们之后是将虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个应用程序能够通过文本来载入用户数据,必须要使用这个选项。If the -T option is specified, the underlying access method type must be specified using the -t option.
如果指定了选项-T,那么一定要追跟子选项-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型。
----------------------------------------------------------------------------
八、设置数据库文件的权限
[root@localhost vsftpd]# chmod 600 /etc/vsftpd/vconf/v_user.db
[root@localhost vsftpd]# chmod 600 /etc/vsftpd/vconf/v_user
九、修改/etc/pam.d/vsftpd文件,增加以下红色部分内容
#%PAM-1.0
auth sufficient pam_userdb.so db=/etc/vsftpd/vconf/v_user
account sufficient pam_userdb.so db=/etc/vsftpd/vconf/v_user
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
以上红色部分两条是手动添加的,内容是对虚拟用户的安全和帐户权限进行验证。
这里的auth是指对用户的用户名口令进行验证。
这里的accout是指对用户的帐户有哪些权限哪些限制进行验证。
其后的sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了。相反,如果没有通过的话,也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核。
再后面的pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。
最后的db=/etc/vsftpd/v_user则指定了验证库函数将到这个指定的数据库中调用数据进行验证。
特别注意: 一定要使用“sufficient” ,按照老版本的做法,这里使用required ,则会发生用户认证不通过,报如下错误:
[root@localhost vsftpd]# tail /var/log/secure
Sep 17 17:28:20 localhost vsftpd[1387]: pam_unix(vsftpd:auth): check pass; user unknown
Sep 17 17:28:20 localhost vsftpd[1387]: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=test r
host=localhost
Sep 17 17:28:20 localhost vsftpd[1387]: pam_succeed_if(vsftpd:auth): error retrieving information about user test
十、创建用户的配置文件
用户配置文件的名字要和创建的“虚拟用户”名字对应
#touch /etc/vsftpd/vconf/test
#vim /etc/vsftpd/vconf/test
local_root=/data/ftp/ //虚拟用户的个人目录路径
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_max_rate=1048576 //本地用户的最大传输速度,单位是Byts/s,
十一、建立虚拟用户目录
如果不建立虚拟用户的个人目录,那么所有的虚拟用户登录后所在的目录都是同一个目录下
# mkdir /data/ftp/
# chown vsftpd.vsftpd /data/ftp/
# chmod 700 /data/ftp/ ///如果不设置为700的权限,则会发生如下错误
“500 OOPS: cannot change directory:/data/ftp”
配置就此完成,如果想增加新的用户,只要按照上面的第七步、第十步进行就可以了。
十二、所有配置完后的目录文件及结构
[root@localhost vsftpd]# ll /etc/vsftpd/
-rw-r--r--. 1 root root 0 Sep 17 16:47 chroot_list
-rw-------. 1 root root 125 Feb 19 2013 ftpusers
-rw-------. 1 root root 361 Feb 19 2013 user_list
drwxr-xr-x. 2 root root 4096 Sep 17 18:22 vconf
-rw-r--r-- 1 root root 4689 Sep 18 10:32 vsftpd.conf
-rwxr--r--. 1 root root 338 Feb 19 2013 vsftpd_conf_migrate.sh
[root@localhost vsftpd]# ll /etc/vsftpd/vconf
-rw-r--r-- 1 root root 125 Sep 17 18:22 test
-rw-------. 1 root root 12 Sep 17 16:55 vir_user
-rw-------. 1 root root 12288 Sep 17 16:55 vir_user.db