微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CentOS 6.x上搭建vSFTPD服务器搭建与配置详解

摘要

手把手教你搭建vsftpd服务器,实现了基于db文件MysqL数据库文件进行虚拟用户认证,当然了也本文章也包含搭建过程中问题的排查啦,哈哈哈。

另外,我在CentOS 7.x上也进行了搭建测试,步骤一致,个别命令会有不同,但不影响测试效果


服务器部署需求分析(实现效果):

1、登录、传输全程进行加密处理。
2、记录用户上传、下载文件日志。
3、针对每个用户有公共文件夹(大家都可以看到和下载其中的文件)和私有文件夹(只有自己可以看到,并且可上传下载文件)。

一、vsftpd服务安装:

1、搜索yum源中是否有vsftpd的安装包:
[root@dba~]#cat/etc/centos-release
CentOSrelease6.5(Final)

[root@dba~]#yumlist|grep-i"vsftpd"
vsftpd.x86_642.2.2-24.el6base
Youhavenewmailin/var/spool/mail/root

2、安装vsftpd服务程序:

[root@dba~]#yumlist|grep-i"vsftpd"&&yum-yinstallvsftpd

[root@dba~]#whereisvsftpd
vsftpd:/usr/sbin/vsftpd/etc/vsftpd/usr/share/man/man8/vsftpd.8.gz

3、启动vsftpd服务程序:

[root@dba~]#/etc/init.d/vsftpdstart
为vsftpd启动vsftpd:[确定]

[root@dba~]#netstat-lntp|grep"21"
tcp000.0.0.0:210.0.0.0:*LISTEN1677/vsftpd

4、访问vsftpd服务:

浏览器访问:ftp://192.168.0.110/认会访问到/var/ftp/pub目录。

客户度端访问(推荐filezilla):https://www.filezilla.cn/download/client


二、vsftpd服务配置详解:

1、备份配置文件用户黑白名单配置:

[root@dba~]#cd/etc/vsftpd/
[root@dbavsftpd]#ll
总用量20
-rw-------1rootroot1253月2220:14ftpusers
-rw-------1rootroot3613月2220:14user_list
-rw-------1rootroot45993月2220:14vsftpd.conf
-rwxr--r--1rootroot3383月2220:14vsftpd_conf_migrate.sh
[root@dbavsftpd]#cpvsftpd.confvsftpd.conf_bak
[root@dbavsftpd]#ll
总用量28
-rw-------1rootroot1253月2220:14ftpusers
-rw-------1rootroot3613月2220:14user_list
-rw-------1rootroot45993月2220:14vsftpd.conf
-rw-------1rootroot45998月1823:21vsftpd.conf_bak
-rwxr--r--1rootroot3383月2220:14vsftpd_conf_migrate.sh

ftpusers:保存ftp登录用户黑名单,该列表中用户登录时需要输入用户名跟密码,但是不能登录成功。
user_list:用户白名单(黑名单)列表,白名单或黑名单由vsftpd.conf中参数进行控制。
白名单:
userlist_enable=YES#启用用户列表功能
userlist_deny=NO#配置不禁用user_list中的用户登录
userlist_file=/etc/vsftpd/user_list#指定用户列表文件的路径和文件名
userlist_log=YES#基于user_list被阻塞的用户记录日志
黑名单:
userlist_enable=YES#启用用户列表功能
userlist_deny=YES#配置禁用user_list中的用户登录,在列表中的用户输入登录名后不需要输入密码就会被阻塞,相比ftpusers更为安全
userlist_file=/etc/vsftpd/user_list#指定用户列表文件的路径和文件名
userlist_log=YES

2、其他重要配置项介绍:

配置项语法格式:directive=value
	匿名用户匿名用户是被映射成ftp用户的,属主有写权限就行;
		是否允许匿名用户登录:
		anonymous_enable=YES
			匿名用户上传操作;生效要依赖于write_enable=YES
			anon_upload_enable=NO
			workdirrite_enable=YES
			属主有写权限就行;
		anon_mkdir_write_enable=NO
			匿名用户创建目录的权限;
		anon_other_write_enable=NO
			匿名用户删除重命名操作权限;
	本地用户:		
	local_enable
			所有的非匿名用户的生效,都依赖此指令;
		local_umask
			本地用户上传文件的权限掩码;
	目录消息:
		dirmessage_enable
			用户第一次进入目录时,vsftpd会查看.message文件,并将其内容显示用户,messag_file指定文件路径,而不使用认的.message;
		messag_file
	数据传输日志:
		xferlog_enable
		xferlog_std_format
		xferlog_file=/var/log/vsftpd.log
		vsftpd_log_file
	数据传输模式:
		connect_from_port_20;是否启用PORT模式,认是NO;
	修改匿名用户上传文件的属主:
		chown_uploads:是否修改;
		chown_username:启用chown_uploads指令时,将文件属主修改为此指令指定的用户认为root;
		chown_upload_mode:设定匿名用户上传文件的权限;认为600;
	设定会话的超时时间:
		idle_session_timeout,空闲会话的超时时长;
		connect_timeout:PORT模式下,服务器连接客户端的超时时长;
		data_connection_timeout:数据传输的超时时长;
	命令连接的监听端口:
		listen_port=20
	设定连接及端口速率:
	local_max_rate:本地用户的传输速率,单位为字节;认为0,表示无限制;
		anon_max_rate:匿名用户的最大传输速率;
		max_clients:最大的并发连接数,对服务器端;
		max_per_ip:每个客户端同时发起的最大连接数;
	登录欢迎信息:
		ftp_banner="Welcome"
	禁锢本地用户:
		chroot_local_user=YES;禁锢所有本地用户;
			注意:要求用户不能对家目录有写权限;

		chroot_list_enable=YES;
		chroot_list_file=/etc/vsftpd/chroot_list;
			禁锢指定用户于家目录中;
虚拟用户配置:
基于db文件:
/etc/vsftpd/vusers.txt
奇数行:用户名
偶数行:密码
基于MysqL数据库用户名、密码可以通过sql语句添加数据库中,vsftpd通过pam接口到与MysqL数据库联动实现用户认证的操作。

注意:虚拟用户匿名用户登录ftp服务器时,是映射到本地用户列表中到某用户到,认为ftp,但也可以手动指定!
[root@dbavsftpd]#cat/etc/passwd|grepftp
ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin

三、vsftpd典型配置案例:

1、基于db_load实现虚拟用户认证:

#1.1修改vsftpd.conf中相关配置项:
anonymous_enable=NO
chroot_local_user=YES
pam_service_name=vsftpd#开启pam认证功能,对应的pam配置文件名为vsftpd

guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/user_conf

#1.2创建用户配置文件目录:
[root@dbavsftpd]#install-d/etc/vsftpd/user_conf
[root@dbavsftpd]#ll
总用量28
-rw-------1rootroot1253月2220:14ftpusers
drwxr-xr-x2rootroot40968月1900:08user_conf
-rw-------1rootroot3613月2220:14user_list
-rw-------1rootroot8948月1900:08vsftpd.conf
-rw-------1rootroot45998月1823:21vsftpd.conf_bak
-rwxr--r--1rootroot3383月2220:14vsftpd_conf

#1.3创建ftp用户名密码源文件和对应的数据库文件:
[root@dbavsftpd]#touchvusers
[root@dbavsftpd]#echo-e"user01\nuser01"vusers
[root@dbavsftpd]#echo-e"user02\nuser02">>vusers
[root@dbavsftpd]#morevusers
user01
user01
user02
user02

[root@dbavsftpd]#db_load-T-thash-f/etc/vsftpd/vusers/etc/vsftpd/login.db
[root@dbavsftpd]#ll
总用量44
-rw-r--r--1rootroot122888月1900:20login.db
-rw-r--r--1rootroot288月1900:17vusers

#1.4创建每个用户配置文件:
[root@dbavsftpd]#cduser_conf/
[root@dbauser_conf]#moreuser02
#使用local_root为虚拟用户指定家目录(ftp登录成功后认在的目录)时,可以在用户单独配置文件中指定,也可以adduser新建用户,用-d选项指定用户家目录。
local_root=/ftp/user02
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

#1.5配置pam认证文件,将db文件用户跟vsftpd服务关联起来:
[root@dbapam.d]#llvsftpd*
-rw-r--r--1rootroot1018月1900:28vsftpd
-rw-r--r--1rootroot3358月1900:27vsftpd.bak
[root@dbapam.d]#morevsftpd
authrequiredpam_userdb.sodb=/etc/vsftpd/login
accountrequiredpam_userdb.sodb=/etc/vsftpd/login

#1.6创建用户对应的ftp主目录:
[root@dbauser_conf]#mkdir-p/ftp/user01/upload
[root@dbauser_conf]#mkdir-p/ftp/user02/upload
[root@dbauser_conf]#ls-ld/ftp/*
drwxr-xr-x3rootroot40968月1900:31/ftp/user01
drwxr-xr-x3rootroot40968月1900:31/ftp/user02

因为上面创建的用户user01、user02登录ftp服务器之后,是映射成本地用户ftp进行创建文件、目录的操作的,所以要机遇用户主目录属主为用户:ftp
[root@dbaftp]#chownftp:rootuser01
[root@dbaftp]#chownftp:rootuser02
[root@dbaftp]#ls-ld*
drwxr-xr-x3ftproot40968月1900:31user01
drwxr-xr-x3ftproot40968月1900:31user02

注意:为用户家目录授权的时候要注意,有时候家目录存在写权限时,登录上传文件时会报错。


#1.7问题解决:
执行以上操作之后,从客户端可以正常登录到ftp服务器,但是上传文件用户upload目录下时报错:
响应:	553Couldnotcreatefile.
错误:	严重文件传输错误

故查看upload目录写权限发现,upload目录属主权限不对,修改上传文件正常。
[root@dbaftp]#ls-lduser01/upload
drwxr-xr-x2rootroot40968月1900:31user01/upload
[root@dbaftp]#ls-lduser02/upload
drwxr-xr-x2rootroot40968月1900:31user02/upload
[root@dbaftp]#chown-rftp:rootuser01/upload
[root@dbaftp]#chown-rftp:rootuser02/upload
[root@dbaftp]#ls-lduser01/upload
drwxr-xr-x2ftproot40968月1900:31user01/upload
[root@dbaftp]#ls-lduser02/upload
drwxr-xr-x2ftproot40968月1900:31user02/upload

#1.8ftp协议因为历史原因,认采用非加密方式进行认证和数据传输,要想使认证和传输过程加密暂时有两种方案可供选择:
方案一:采用openssl内建ftp服务器来进行加密传输,具体配置案例可参考链接:http://blog.csdn.net/xinxin19881112/article/details/46831311
方案二:采用vsftpd服务器端程序,修改配置实现对认证和传输过程加密,具体配置如下:
首先,生成加密使用的pem证书文件:
[root@dbaftp]#opensslreq-x509-nodes-days365-newkeyrsa:1024-keyout/etc/vsftpd/vsftpd.pem-out/etc/vsftpd/vsftpd.pem
Generatinga1024bitRSAprivatekey
.++++++
........++++++
writingnewprivatekeyto'/etc/vsftpd/vsftpd.pem'
-----
Youareabouttobeaskedtoenterinformationthatwillbeincorporated
intoyourcertificaterequest.
WhatyouareabouttoenteriswhatiscalledadistinguishednameoraDN.
Therearequiteafewfieldsbutyoucanleavesomeblank
Forsomefieldstherewillbeadefaultvalue,Ifyouenter'.',thefieldwillbeleftblank.
-----
CountryName(2lettercode)[XX]:CN
StateorProvinceName(fullname)[]:BeiJing
LocalityName(eg,city)[DefaultCity]:BJ
OrganizationName(eg,company)[DefaultCompanyLtd]:360
OrganizationalUnitName(eg,section)[]:Security
CommonName(eg,yournameoryourserver'shostname)[]:anonymous.org

EmailAddress[]:Youhavenewmailin/var/spool/mail/root

生成的pem文件如下:
[root@dba~]#ll/etc/vsftpd/vsftpd.pem
-rw-r--r--1rootroot18768月1900:52/etc/vsftpd/vsftpd.pem

然后,修改vsftpd.conf配置文件,开启加密:
#启用TLS/SSL
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
#为被动模式下的连接定义端口范围
pasv_max_port=65535
pasv_min_port=64000

重启vsftpd服务:
###CentOS6.x
[root@dbavsftpd]#/etc/init.d/vsftpdrestart
关闭vsftpd:[确定]
为vsftpd启动vsftpd:[确定]

###CentOS7.x
[root@dbavsftpd]#systemctlstartvsftpd

[root@dbavsftpd]#netstat-lntp|grep21
tcp000.0.0.0:210.0.0.0:*LISTEN2951/vsftpd

重启之后,使用FileZilla客户端连接vsFTPd服务器,可以正常上传下载文件,么么哒。。。

2、基于pam_MysqL实现匿名用户认证:

[root@dbapam.d]#uname-a
Linuxdba.com2.6.32-431.el6.x86_64#1SMPFriNov2203:15:09UTC2013x86_64x86_64x86_64GNU/Linux

#2.1安装MysqL数据库,并配置vsftpd登录的虚拟用户名和密码:
[root@dbapam.d]#yum-yinstallMysqL-server
[root@dbapam.d]#yumgrouplist|grep-i"develop"
AdditionalDevelopment
DesktopPlatformDevelopment
Developmenttools
ServerPlatformDevelopment

[root@dba~]#MysqL-uroot-p123456
MysqL>createdatabasevsftpd;
MysqL>usevsftpd;
MysqL>createtableusers(
->idintAUTO_INCREMENTNOTNULL,->namechar(16)binaryNOTNULL,->passwdchar(48)binaryNOTNULL,->primarykey(id)
->);
MysqL>createtablelogs(msgvarchar(255),->userchar(16),->pidint,->hostchar(32),->rhostchar(32),->logtimetimestamp
->);

MysqL>descusers;
+--------+----------+------+-----+---------+----------------+
|Field|Type|Null|Key|Default|Extra|
+--------+----------+------+-----+---------+----------------+
|id|int(11)|NO|PRI|NULL|auto_increment|
|name|char(16)|NO||NULL||
|passwd|char(48)|NO||NULL||
+--------+----------+------+-----+---------+----------------+
3rowsinset(0.03sec)

MysqL>insertintousers(name,passwd)values('test',password('test'));
QueryOK,1rowaffected(0.08sec)

MysqL>select*fromusers;
+----+------+-------------------------------------------+
|id|name|passwd|
+----+------+-------------------------------------------+
|1|test|*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29|
+----+------+-------------------------------------------+
1rowinset(0.00sec)

#2.2下载安装pam_MysqL插件:
[root@dba~]#yuminstallopenssl-devel
[root@dba~]#yuminstallMysqL-devel
[root@dba~]#wget
[root@dba~]#tar-zxfpam_MysqL-0.7RC1.tar.gz
[root@dba~]#cdpam_MysqL-0.7RC1
[root@dba~]#./configure--with-MysqL=/usr--with-openssl=/usr--with-pam-mods-dir=/lib64/security
[root@dba~]#make&&makeinstall

[root@dba~]#ll/lib64/security/pam_MysqL.*
-rwxr-xr-x1rootroot873Aug1912:27/lib64/security/pam_MysqL.la
-rwxr-xr-x1rootroot133356Aug1912:27/lib64/security/pam_MysqL.so
#2.3修改配置vsftpd.confand/etc/pam.d/vsftpd.MysqL
#pam_service_name=vsftpd
pam_service_name=vsftpd.MysqL

[root@dbapam.d]#morevsftpd.MysqL
auth	required/lib64/security/pam_MysqL.sodb=vsftpduser=rootpasswd=123456host=localhosttable=usersusercolumn=namepasswdcolumn=passwdcrypt=2
accountrequired/lib64/security/pam_MysqL.sodb=vsftpduser=rootpasswd=123456host=localhosttable=usersusercolumn=namepasswdcolumn=passwdcrypt=2

###crypt参数介绍:
[root@dbapam_MysqL-0.7RC1]#lessREADME
crypt(plain)

Themethodtoencrypttheuser'spassword:

0(or"plain")=Noencryption.Passwordsstoredinplaintext.
HIGHLYdisCOURAGED.

1(or"Y")=Usecrypt(3)function.

2(or"MysqL")=UseMysqLPASSWORD()function.Itispossible
thattheencryptionfunctionusedbyPAM-MysqL
isdifferentfromthatoftheMysqLserver,as
PAM-MysqLusesthefunctiondefinedinMysqL's
C-clientAPIinsteadofusingPASSWORD()sqlfunction
inthequery.

3(or"md5")=UseplainhexMD5.

4(or"sha1")=UseplainhexSHA1.

[root@dbapam.d]#/etc/init.d/vsftpdrestart
Shuttingdownvsftpd:[OK]
Startingvsftpdforvsftpd:[OK]

以上,vsftpd服务器基于MysqL进行虚拟用户认证的环境已搭建完毕,下一步开始测试啦。。。


GG,上传文件再次报错。。。
响应:	550Permissiondenied.
错误:	严重文件传输错误
报错与之前的一致,可能是权限配置的问题吧,呵呵

"test"账号登录成功后,是映射成ftp用户文件和目录进行操作的,所以进入了/var/ftp/目录,可以查看配置文件和ftp用户确定。
guest_enable=YES
guest_username=ftp
user_config_dir=/etc/vsftpd/user_conf
[root@dbavsftpd]#cat/etc/passwd|grepftp
ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin

[root@dbavsftpd]#cd/var/ftp/
[root@dbaftp]#ls-ld../*|grepftp
drwxr-xr-x3rootroot4096Aug1822:53../ftp
Youhavenewmailin/var/spool/mail/root
[root@dbaftp]#ls-ld*
drwxr-xr-x2rootroot4096Mar2220:14pub
可以看到上面的ftp与upload目录,ftp用户都是没有写权限的,可以修改方式就是修改upload目录的权限后重启vsftpd就可以上传,Ok,那就开始干!
[root@dbaftp]#chownftppub
[root@dbaftp]#ll
total4
drwxr-xr-x2ftproot4096Mar2220:14pub
这样修改之后应该就没问题了吧,哈哈哈,结果一测试果然又GG了。。。所以逐步进行排查:
1、目录权限设置肯定没问题了
2、那估计就是vsftpd配置文件读写权限设置的问题了吧,因为我的ftp用户是存在单独目录下与用户同名的配置文件中的,故新建名为test的配置文件,配置贴上来:
[root@dbauser_conf]#pwd
/etc/vsftpd/user_conf
Youhavenewmailin/var/spool/mail/root
[root@dbauser_conf]#moretest
local_root=/var/ftp
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

Ok,重启vsftpd测试,终于可以上传文件了,搞定。。。

四、vsftpd部署问题总结:

等待更新中。。。。。

原文地址:https://www.jb51.cc/centos/376256.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。