FTP服务器工作原理及如何通过PAM认证实现虚拟用户登录


<一>.理论篇

注:笔者还是在这里唠叨一句:理论很枯燥、很无趣,对以后要从事运维管理工作的人员来说,理论知识是必须掌握的,所以笔者希望博友能够认真阅读FTP的相关理论,这样在后续的服务构建篇当中,才会更容易理解并掌握每步操作的真实意义!

1. FTP服务器的相关概念:

FTP简称文件传输协议,全称(File Transfer Protocol),FTP服务在互联网上任意两台计算机之间提供文件传输服务。无论是客户端(Client)、服务器(Server)还是Linux、Windows等操作系统,只要支持FTP协议,就可以使用FTP服务来提供文件传输等功能。如今FTP已被Ineternet 3/1 广大用户所使用的重要互联网服务之一。
FTP(文件传输协议)是TCP/IP协议的一种具体应用,它工作在OSI(Open System Interconnection)七层模型的第七层(应用层),TCP/IP模型的第四层。
FTP服务使用TCP传输,所以在使用FTP服务时,FTP客户端和服务器之间要建立连接,这个连接也就是我们熟悉的“三次握手”,之所以建立三次连接,是为了证明客户端和服务端之间的连接是可靠的、安全的、面向连接的,为数据的传输提供了可靠、安全的保障。

2. FTP服务器的功能:

FTP服务主要提供下载数据、上传数据,并且可以将远程的文件复制到本地计算机,以达到资源共享和传递信息的目的,FTP在传输文件时还支持断点续传功能。

FTP服务归根基地提供两个功能:
①可以在两台完全不同的计算机之间进行文件数据传输。(支持传送二进制文件,如:文件、程序、数据、视频、图片等各种类型的文件传输)
②可以提供许多文件数据同时共享。

3. FTP服务器的工作原理:

FTP标准在RFC959文档中说明,此协议定义了一个在远程计算机系统和本地计算机之间传输文件的标准。一般的讲,要进行文件的传输,我们必须使用有效的用户名和密码来访问FTP服务器上的资源(默认匿名用户不要提供密码),在Internet互联网上FTP服务器提供了“guest user”来访问FTP服务。

  1. 控制连接
    当客户端希望和FTP服务器通讯时,建立上传/下载文件数据传输时,服务器的TCP 21端口发送一个建立连接的请求:FTP服务器接受来自客户端的请求,
    并通过TCP/IP完成连接请求,这样的连接称之为FTP控制连接
  1. 数据连接
    当FTP控制连接建立完成后,客户端便可使用FTP服务进行传输文件(get、put...);

4. FTP服务器的登陆方式:

FTP服务登录模式:

  1. 匿名用户登录模式:
    只需要输入用户anonymous/ftp,并将自己的E-mail作为口令即可登录FTP服务器,又称为(anonymousFTP服务器)
  2. 本地账户登录模式:当进入FTP登录窗口是,需要输入正确的用户名(user)和密码(passwd)即可登录FTP服务器。
  3. 虚拟用户登录模式:将登录用户映射到指定的系统账号(/sbin/nologin)来访问FTP资源,这样就起到安全的效果。

FTP服务传输数据分为三种传输模式:

主动模式(PORT)、被动模式(PASSIVE)、单端口模式

  1. 主动模式:
    主动传输模式,有FTP服务器向客户端发送一个用于数据传输的连接,客户端的连接端口由服务器和客户端通过协商确定,
    即FTP服务器用端口20与客户端的临时端口进行连接并传输数据,客户端用于接收状态。
  2. 被动模式:
    被动传输模式,由客户端发送PASV命令使服务器处于被动模式,FTP的数据连接和控制连接方向一致,由客户端向服务器端发送一个用于数据传输的连接,
    客户端的连接端口是发起该数据请求时使用的端口。
    单端口模式:
  3. 单端口模式,由服务器端发起,使用该模式时,客户端的控制连接端口和数据连接端口一致,这种模式无法在短时间内连续输入数据并传送命令,
    因此笔者不建议大家使用此模式。

5. FTP服务配置文件的结构:

1 . Vsftpd服务器的文件结构如下:

# rpm -ql vsftpd   ##查看在安装vftpd软件包时,所产生的配置文件。(这里只做常用的文件)  
/usr/sbin/vsftpd    ##Vsftpd主程序  
/etc/rc.d/init.d/vsftpd    ##用于启动终止脚本  
/etc/vsftpd/vsftpd.conf     ##Vsftpd主配置文件  
/etc/pam.d/vsftpd           ##PAM认证文件  
/etc/vsftpd.ftpusers        ##禁止使用Vsftpd的用户列表  
/etc/vsftpd.user_list       ##禁止或允许使用Vsftpd的用户列表  
/var/ftp        ##匿名用户的下载目录  
/var/ftp/pub    ##匿名用户默认访问目录  
/etc/logrotate.d/vsftpd.log     ##vsftpd的日志文件 

2 . 介绍vsftpd配置文件参数的设置信息

注:在构建FTP服务器,我们会经常更改vsftpd.conf中各个参数来完成需求,所以我们要完全了解每个参数后面的真实意义,这样在配置器服务时,才会运用自如。
当vsftpd软件包安装完成后,默认的主配置文件/etc/vsftpd/vsftpd.conf

# vim /etc/vsftpd/vsftpd.conf  
#anonymous_enable=YES           ##允许匿名访问,即anonymous账号访问FTP服务  
#local_enable=YES               ##允许本地用户登录FTP服务器  
#write_enable=YES               ##本地用户可以读写  
#local_umask=022                ##默认掩码为022,默认创建的文件权限为755  
#anon_upload_enable=YES         ##允许匿名用户上传文件,基于安全因素考虑,默认vsftpd是注释此项  
#anon_mkdir_write_enable=YES    ##是否允许匿名用户创建目录,基于安全因素考虑,默认vsftpd是注释此项  
dirmessage_enable=YES           ##如果目录存在.message隐藏文件时,当进入此目录时,会显示.message里面的内容  
xferlog_enable=YES              ##默认记录上传、下载的日志文件,是否开启此功能  
#xferlog_file=/var/log/xferlog  ##Vsftpd的日志存放位置  
connect_from_port_20=YES        ##从端口20连接,默认状态下,20端口为数据传输端口  
#chown_uploads=YES  
#chown_username=whoever         ##此两选项必须同时出现,含义为,允许新上传文件的拥有者为whoever,默认这两行被注释到得。  
xferlog_std_format=YES          ##使用标准格式上传/下载  
#data_connection_timeout=120    ##传输延时时间,当时间超过120秒后,会自动断开,默认是注释掉的。  
#nopriv_user=ftpsecure          ##使用特殊用户ftpsecure,这里可以把ftpsecure账户作为一般访问用户,所有连接FTP服务器的用户都具有ftpsecure用户名。  
基于安全因素考虑,可以在/etc/passwd中将ftpsecure的用户shell设置为/sbin/nologin(禁止登陆操作系统)  
#async_abor_enable=YES          ##取消下载后客户端不挂起,一般不需要设置。  
#ascii_upload_enable=YES  
#ascii_download_enable=YES      ##是否启用ASCII方式传送文件,一般我们不需要这个格式。  
#ftpd_banner=Welcome to blah FTP service.       ##登陆FTP服务器,所提示的信息,默认注释掉的。  
#deny_email_enable=YES  
#banned_email_file=/etc/vsftpd/banned_emails    ##若是启用以上两个选项,则可以在/etc/vsftpd/banned_emails中建立黑名单啦。  
#chroot_list_enable=YES  
#chroot_list_file=/etc/vsftpd/chroot_list       ##当登陆FTP服务器时,被列在chroot_list文件中的用户,不可以访问FTP根目录以外的目录。  
#ls_recurse_enable=YES          ##是否可以使用ls -R 命令,默认是注释掉的。  
listen=YES      ##当此项为YES时,vsftpd运行于stand-alone模式下,默认是开启的。  
#listen_ipv6=YES            ##是用IPv6,默认是注释掉的。  
pam_service_name=vsftpd     ##列出与vsftpd相关的pam文件。  
userlist_enable=YES         ##当此项设置为YES时,启用配置文件/etc/vsftpd.user_list.此时有两种情况:
①若没有userlist_deny=NO,则/etc/vsftpd.user_list中的用户不可以访问FTP服务器  
②若有userlist_deny=NO,则仅接受/etc/vsftpd.user_list中的用户登陆请求,同时此用户也不可以存在/etc/vsftpd.ftpusers文件中。  
tcp_wrappers=YES        ##支持TCP Wrappers 

3 . 补充:(未出现在vsftpd.conf配置文件中的常用参数)

guest_enable=YES  
guest_username=ftp  
    guest用户名,即登陆不是匿名用户的用户,具有guest用户身份  
local_root=/var/ftp  
anon_root=/var/ftp  
    以上两个选项为本地用户和匿名用户默认访问的目录  
#pasv_enable=YES  
#port_enable=YES  
    以上两个选项是FTP服务器的工作模式,两者只能出现一个,而且另一个必须注释掉。  
use_localtime=YES  
    是否使用本机时间,若设置NO时,仅使用格林尼治时间。由于北京时间和格林尼治时间有8小时时差,所以建议设置为YES  
Idle_session_timeout=300  
    客户端若在300秒之内没有任何操作,则服务器自动断开。  
max_clinet=0  
    最大连接数量(stand-alone模式下)  
max_per_ip=0  
    每个客户端最大连接ftp服务器的连接数  
local_max_rate=0  
    本地用户登陆FTP服务器最大传输速率,单位为字节/秒  
anon_max_rate=0  
    匿名用户登陆FTP服务器最大传输速率,单位为字节/秒 


<二>:FTP服务器架构篇

经过前面的介绍我们应该基本了解FTP的相关知识,比如FTP的功能及作用、工作原理、工作模式及登录方式,那下面就来如何实现构建FTP服务器,为内部网络提供文件共享服务呢。

配置思路:

实现匿名用户上传下载(SELinux、iptables)、定义上传文件的属主、禁锢本地用户、实现虚拟账户登录(基于PAM认证模式)
环境:VMware Workstation
版本:Redhat Enterprise 5.8
FTP服务器的IP地址为172.16.88.1/16
Linux测试机:172.16.88.2/16
XP测试机IP地址:192.168.0.203/24
说明环境:172.16.0.0/16和192.168.0.203/24之间可以互相访问:


本地用户访问

  • Seq1:检查当前系统是否安装vsftpd二进制软件包,如果没有安装,使用yum来进行安装vsftpd即可
# rpm -q vsftpd      
# yum install vsftpd -y       #对yum生疏的朋友们,可以查看笔者关于YUM和RPM的相关文章进行了解。
  • Seq2:启动vsftpd进程并开启开机自动启动vsftpd服务
# service vsftpd restart  
# chkconfig vsftpd on 
# chkconfig --list vsftpd   ##查看在那个级别上启动(默认为235级别)  
# cd /var/ftp/pub  
# echo "text file" > text.txt 

下面用windows客户端来测试下,是否可以正常访问FTP服务器资源呢?

此处输入图片的描述
此处输入图片的描述

哎,奇怪了,为啥不能正常访问服务器呢?
说明:如果在这测试的话,只能在本机访问FTP服务,在其它客户端就不能正常访问FTP服务了,因为我们的防火墙默认拒绝所有端口访问滴。那来修改下iptables看看是否可以正常访问。

  • Seq3:设置防火墙(iptables)开启20:21端口
#iptables -I INPUT 1 -p tcp --dport 20:21 -j ACCEPT  
#service iptables save            ##保存iptables设置  
iptables: Saving firewall rules to /etc/sysconfig/iptables: [  OK  ] 

再测试看看结果:

此处输入图片的描述
此处输入图片的描述
  • Seq4:如何实现匿名用户具有上传的权限呢?
    我们创建一个由匿名用户上传的目录,并将属主、属组更改为FTP
# mkdir -p /var/ftp/upload  
# chown ftp:ftp /var/ftp/upload  

我们修改配置文件/etc/vsftpd/vsftpd.conf,确保有下列几行。

write_enable=YES  
anon_upload_enable=YES         ##开启匿名用户上传功能  
anon_mkdir_write_enable=YES    ##允许匿名用户创建目录  

然后重新启动vsftpd服务

#service vsftpd restart

然后再进行测试,查看是否可以上传文件?(效果图)

此处输入图片的描述
此处输入图片的描述

貌似还不能上传,那我们查看下SELINUX关于ftp的定义并修改相应选项(如图)

此处输入图片的描述
此处输入图片的描述

OK,修改好了,在测试下吧

此处输入图片的描述
此处输入图片的描述
  • Seq5:定义上传文件的属主
    我们到服务器器上看看刚才上传windows.txt的属性信息:
此处输入图片的描述
此处输入图片的描述

编辑配置文件

# vim /etc/vsftpd/vsftpd.conf  

修改如下内容

#chown_upload=YES  
#chown_username=hadoop  

改为如下内容(如图)

此处输入图片的描述
此处输入图片的描述

注:当配置文件发生变化,一定不要忘记重启检测配置文件

# service vsftpd  condrestart

在到windows客户机上(文件均是windows客户机文件)进行测试(测试结果图)

此处输入图片的描述
此处输入图片的描述

然后到服务器端,查看上传文件的属性信息:

此处输入图片的描述
此处输入图片的描述
  • Seq6:使用本地用户登录FTP服务器及禁锢本地用户访问目录
此处输入图片的描述
此处输入图片的描述

编辑主配置文件

# vim /etc/vsftpd/vsftpd.conf  ##可以再末行模式下输入:set nu可以显示行号。  

将96行和98行的#去掉,并在/etc/vsftpd/目录下创建chroot_list(凡是在此文件的用户,都禁锢在自己的家目录中)

chroot_list_enable=YES  
97# (default follows)  
chroot_list_file=/etc/vsftpd/chroot_list  
# touch /etc/vsftpd/chroot_list  
# echo "hadoop" > /etc/vsftpd/chroot_list    ##将hadoop用户添加到chroot_list文件中。

然后再进行测试,看hadoop用户是否可以更换目录

此处输入图片的描述
此处输入图片的描述

总结:本地用户可以登录FTP服务器,并且登录后的默认目录为用户的家目录,而且还可以更改其默认目录,我们又知道ftp是明文传输的,如果出现中间人攻击的话,这将对于我们的服务器造成很大威胁,所以我们要禁止本地用户更改其默认目录。
如果禁锢所有本地用户,只需要在主配置文件中添加一行即可:

chroot_local_user = YES

基于PAM认证实现虚拟账号登陆FTP服务器

虚拟用户和系统本地用户的区别是:本地用户在系统的/etc/passwd文件中有相应的记录,而虚拟用户时针对vsftpd本身产生的,所以与/etc/passwd没有关系。
FTP服务器除了支持本地用户和匿名用户登录服务器,如果我们有许多用户来访问服务器的话,也支持虚拟用户的访问。那么我们为什么要使用虚拟账号呢,
因为匿名用户不能针对每个用户设置不同的权限,而且本地用户又存在安全问题,在这种情形下,虚拟用户就产生啦。
在配置之前我们需要安装db4和db4-utils组件,如果系统没有安装db4相关软件包的话,可以使用yum来安装

# yum install db4*  -y    
  • 创建虚拟用户账号和密码(奇数行为用户名,偶数行为用户密码)
# touch /etc/vsftpd/virtual.users  
# vim /etc/vsftpd/virtual.users  
user1        ##奇数为用户名  
redhat       ##偶数为用户的密码  
user2  
123456
  • 使用db_load命令生成用户账户的数据库文件并设置相应的数据库文件权限。
# db_load -T -t hash -f /etc/vsftpd/virtual.users /etc/vsftpd/vsftpd.login.db  
# chmod 600 /etc/vsftpd/vsftpd.login.db
  • 配置PAM信息,在/etc/pam.d/创建一个文件,命名为vsftpd.pam(可自定义)
# vim /etc/pam.d/vsftpd.pam  
auth    required        pam_userdb.so   db=/etc/vsftpd/vsftpd.login  
account required        pam_userdb.so   db=/etc/vsftpd/vsftpd.login 
  • 配置vsftpd.conf,我们也可以自己专为虚拟用户所使用的配置文件,这里我们使用系统默认的配置文档:
# vim /etc/vsftpd/vsftpd.conf 添加如下内容
  • 创建相应的虚拟用户目录,用于虚拟用户访问FTP服务所用到的默认目录
# mkdir -p /var/ftp/virtual/{user1,user2}  
# chown ftp.ftp /var/ftp/virtual/{user1,user2} 
# touch /var/ftp/virtual/user2/user2.txt (测试)
  • 我们使用user2虚拟账号登陆FTP服务器,看是否可以正常登陆,并且访问相应资源


    此处输入图片的描述
    此处输入图片的描述

总结:我们通过使用PAM认证来实现虚拟账户的登陆,而且每个虚拟账户对应的是一个普通系统用户,而且不能正常登陆FTP服务器,所以即被中间人攻击截取用户和密码,也没有任何意义的,因为获取的是一个虚拟账户,这样我们的服务器就相对安全了许多。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • ftp 文件传输协议 跨平台 上传下载文件 vsftpd 工具:非常安全的文件传输协议;默认的命令端口21号,数据...
    柒夏锦阅读 3,862评论 1 9
  • 1 概述 工作中,需要搭建ftp服务器来实现资源的共享。本文将通过脚本实现自动化安装ftp服务器,并进行相关配置,...
    ghbsunny阅读 2,959评论 0 2
  • 图片更清晰,文字在最下面 FTP是TCP/IP的一种应用,使用TCP而不是UDP,所以是可靠的,面向连接的。 FT...
    停下浮躁的心阅读 1,615评论 0 4
  • 1.FTP简介 File Transfer Protocol 早期的三个应用级协议之一 基于C/S结构 双通道...
    尛尛大尹阅读 2,255评论 0 0
  • FTP服务概述 简单FTP构建及访问 VSFTP服务基础 用户禁锢、黑白名单 FTP并发及带宽限制 一、FTP服务...
    紫_轩阅读 7,453评论 3 25