天天看点

vsftp配置(1)

作者:贺浦力特

文件传输协议

FTP

文件传输协议(FTP)是一种基于TCP协议在客C/S架构的协议, 占用20和21端口。

TFTP

简单文件传输协议(TFTP)是一种基于UDP, C/S架构的协议, 占用69端口

TFTP的命令功能不如FTP服务强大, 甚至不能遍历目录, 在安全性方面也弱于FTP服务

因为TFTP不需要客户端的权限认证, 也就减少了无谓的系统和网络带宽消耗, 效率更高

#1. 概述

命令连接

传输TCP的文件管理类命令给服务端 直到用户退出才关闭连接, 否则一直连接

数据连接

数据传输, 按需创建及关闭的连接 数据传输可以为文本或二进制格式传输

#2. FTP 工作模式

(1)PORT(主动)模式

所谓主动模式, 指的是FTP服务器"主动"去连接客户端的数据端口来传输数据, 其过程具体来说就是:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口(即tcp 21端口), 紧接着客户端开始监听端口N+1, 并发送FTP命令"port N+1"到FTP服务器。然后服务器会从它自己的数据端口(20)"主动"连接到客户端指定的数据端口(N+1), 这样客户端就可以和ftp服务器建立数据传输通道了。

(2)PASV(被动)模式

所谓被动模式, 指的是FTP服务器"被动"等待客户端来连接自己的数据端口, 其过程具体是:当开启一个FTP连接时, 客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口, 但与主动方式的FTP不同, 客户端不会提交PORT命令并允许服务器来回连它的数据端口, 而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024), 并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。(注意此模式下的FTP服务器不需要开启tcp 20端口了)

两种模式的比较:

(1)PORT(主动)模式模式只要开启服务器的21和20端口, 而PASV(被动)模式需要开启服务器大于1024所有tcp端口和21端口。

(2)从网络安全的角度来看的话似乎ftp PORT模式更安全, 而ftp PASV更不安全, 那么为什么RFC要在ftp PORT基础再制定一个ftp PASV模式呢?其实RFC制定ftp PASV模式的主要目的是为了数据传输安全角度出发的, 因为ftp port使用固定20端口进行传输数据, 那么作为黑客很容使用sniffer等探嗅器抓取ftp数据, 这样一来通过ftp PORT模式传输数据很容易被黑客窃取, 因此使用PASV方式来架设ftp server是最安全绝佳方案。

因此:如果只是简单的为了文件共享, 完全可以禁用PASV模式, 解除开放大量端口的威胁, 同时也为防火墙的设置带来便利。

不幸的是, FTP工具或者浏览器默认使用的都是PASV模式连接FTP服务器, 因此, 必须要使vsftpd在开启了防火墙的情况下, 也能够支持PASV模式进行数据访问。

#3. FTP服务的响应码

1xx: 信息

2xx: 成功类的状态码

3xx: 提示需进一步提供补充类信息的状态码

4xx: 客户端错误

5xx: 服务端错误

#4. 配置文件 CentOS6中的配置文件位置, 在CentOS7中有可能不同。

主配置文件:/etc/vsftpd/vsftpd.conf

配置文件目录:/etc/vsftpd/*.conf

服务启动脚本:/etc/rc.d/init.d/vsftpd

用户认证配置文件:/etc/pam.d/vsftpd

共享目录

匿名用户(映射为ftp用户)共享资源位置:/var/ftp

系统用户通过ftp访问的资源的位置:用户自己的家目录

虚拟用户通过ftp访问的资源的位置:给虚拟用户指定的映射成为的系统用户的家目录

#5. vsftpd 认证模式

vsftpd 作为更加安全的文件传输的服务程序, 允许用户以三种认证模式登录到 FTP 服务器上。

匿名开放模式

匿名开放模式是一种最不安全的认证模式, 任何人都可以无需密码验证而直接登录到FTP服务器。这种模式一般用来访问不重要的公开文件, 在生产环境中尽量不要存放重要文件, 不建议在生产环境中如此行事。

本地用户模式

本地用户模式是通过Linux系统本地的账户密码信息进行认证的模式, 相较于匿名开放模式更安全, 而且配置起来相对简单。但是如果被黑客破解了账户的信息, 就可以畅通无阻地登录FTP服务器, 从而完全控制整台服务器。

虚拟用户模式

虚拟用户模式是这三种模式中最安全的一种认证模式, 它需要为FTP服务单独建立用户数据库文件, 虚拟出用来进行口令验证的账户信息, 而这些账户信息在服务器系统中实际上是不存在的, 仅供FTP服务程序进行认证使用。这样, 即使黑客破解了账户信息也无法登录服务器, 从而有效降低了破坏范围和影响。

配置参数

#1. 通用基础配置

listen=[YES|NO] 是否以独立运行的方式监听服务

listen_address=IP地址 设置要监听的IP地址

listen_port=21 设置FTP服务监听端口

download_enable=[YES|NO] 是否运行下载文件

max_clients=0 最大客户端连接数, 0 为不限制

max_per_id=0 同一个IP地址的最大连接数, 0 为不限制

chown_uploads=[YES|NO] 是否运行改变上传文件的属主

chown_username=whoever 改变上传文件的属主为 whoever

pam_service_name=vsftpd 让 vsftpd 使用 pam 完成用户认证,使用的文件为 /etc/pam.d/vsftpd

#2. 匿名用户的配置

anonymous_enable=[YES|NO] 是否允许匿名用户访问

anon_upload_enable=[YES|NO] 是否允许匿名用户上传文件

anon_mkdir_write_enable=[YES|NO] 是否允许匿名用户创建目录

anon_other_write_enable=[YES|NO] 是否开放匿名用户的其他写入权限(包括重命名,删除等操作权限)

anon_umask=022 匿名用户上传文件的 umask 值

anon_root=/var/ftp 你们以后的 FTP 根目录

anon_max_rate=0 匿名用户的最大传输速率(字节/秒), 0 为不限制

#3. 系统用户的配置

anonymous_enable=NO 禁止匿名访问模式

local_enable=[YES|NO] 是否允许本地用户登录 FTP

write_enable=[YES|NO] 是否开放本地用户的其他写入权限

local_umask=022 本地用户上传文件的 umask 值

local_root=/var/ftp 本地用户的 FTP 根目录

local_max_rate=0 本地用户最大传输速率(字节/秒), 0 为不限制

userlist_enable=[YES|NO] 开启用户作用名单文件功能

userlist_deny=[YES|NO] 启用禁止用户名单,名单文件为 ftpusers 和 /etc/vsftpd/user_list

chroot_local_user=[YES|NO] 是否将用户权限禁锢在 FTP 家目录中,以确保安全

chroot_list_enable=[YES|NO] 禁锢文件中指定的 FTP 本地用户于其家目录中

chroot_list_file=/etc/vsftpd/chroot_list 指定禁锢文件位置,需要和 chroot_list_enable 一同开启

#4. 日志功能

xferlog_enable=[YES|NO] 是否开启 FTP 日志功能

xferlog_std_format=[YES|NO] 是否以标准格式保存日志

xferlog_file=/var/log/xferlog 指定保存日志的文件名称,需要一同开启

配置文件说明

#1. vsftpd.conf文件说明

anonymous_enable=YES #是否允许 匿名登录FTP服务器,默认设置为YES允许,即用户可使用用户名ftp或anonymous进行ftp登录,口令为用户的E-mail地址。如不允许匿名访问去掉注释并设置为NO

local_enable=YES #是否允许本地用户 ( 即 linux 系统中的用户帐号) 登录FTP服务器,默认设置为YES允许, 本地用户登录后会进入用户主目录,而匿名用户登录后进入匿名用户的下载目录/var/ftp/pub

write_enable=YES #是否允许本地用户对 FTP 服务器文件具有写权限, 默认设置为 YES 允许

local_umask=022 #设置本地用户的文件掩码 为缺省022,也可根据个人喜好将其设置为其他值,默认值为077, 这个要在后面再加上才生效

#anon_upload_enable=YES #是否允许匿名用户上传文件, 须将 write_enable=YES, 默认设置为YES 允许

#anon_mkdir_write_enable=YES #是否允许匿名用户创建新文件夹, 默认设置为 YES 允许

dirmessage_enable=YES #是否激活目录欢迎信息功能,当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息,默认情况下,欢迎信息是通过该目录下的.message文件获得,此文件保存自定义的欢迎信息,由用户自己建立

xferlog_enable=YES #默认值为 NO 如果启用此选项,系统将会维护记录服务器上传和下载情况的日志文件,默认情况该日志文件为/var/log/vsftpd.log,也可以通过下面的 xferlog_file选项对其进行设定

connect_from_port_20=YES #设定 FTP 服务器将启用 FTP 数据端口的连接请求,ftp-data 数据传输,21 为连接控制端口

#chown_uploads=YES #设定是否允许 改变 上传文件的属主, 与下面一个设定项配合使用

#chown_username=whoever #设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名,例如可以把上传的文件都改成 root 属主。whoever:任何人

#xferlog_file=/var/log/vsftpd.log #设定系统维护记录FTP服务器上传和下载情况的日志文件,/var/log/vsftpd.log是默认的,也可以另设其它

xferlog_std_format=YES #如果启用此选项, 传输日志文件将以标准 xferlog 的格式书写,该格式的日志文件默认为/var/log/xferlog,也可以通过xferlog_file选项对其进行设定,默认值为NO

#idle_session_timeout=600 #设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒,即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒,可以根据实际情况对该值进行修改

#data_connection_timeout=120 #设置数据连接超时时间, 该语句表示数据连接超时时间为 120 秒, 可根据实际情况对其个修改

#nopriv_user=ftpsecure #运行 vsftpd 需要的非特权系统用户,缺省是nobody

#async_abor_enable=YES #如果 FTP client 会下达"async ABOR"这个指令时,这个设定才需要启用,而一般此设定并不安全,所以通常将其取消

#ascii_upload_enable=YES #大多数 FTP 服务器都选择用 ASCII 方式传输数据, 将 # 去掉就能实现用 ASCII 方式上传和下载文件

#ascii_download_enable=YES #将 # 去掉就能实现用 ASCII 方式下载文件

#ftpd_banner=Welcome to blah FTP service. #去掉注释可设置登录FTP服务器时显示的欢迎信息,可以修改信息内容。另外如在目录下创建名为 .message 的文件,并写入欢迎信息保存后,在进入到此目录会显示自定义欢迎信息

#deny_email_enable=YES #可将某些特殊的 email address 抵挡住。如果以anonymous登录服务器时,会要求输入密码,也就是您的email address,如果很讨厌某些email address,就可以使用此设定来取消他的登录权限,但必须与下面的设置项配合

#banned_email_file=/etc/vsftpd/banned_emails #当上面的 deny_email_enable=YES 时,可以利用这个设定项来规定那个email address不可登录vsftpd服务器,此文件需用户自己创建,一行一个email address即可

#chroot_local_user=YES #是否将所有用户限制在主目录,YES为启用 NO禁用.(该项默认值是NO,即在安装vsftpd后不做配置的话,ftp用户是可以向上切换到要目录之外的

#chroot_list_enable=YES #设置为NO时,用户登录FTP服务器后具有访问自己目录以外的其他文件的权限, 设置为YES时, 用户被锁定在自己的 home 目录中,vsftpd将在下面 chroot_list_file选项值的位置寻找 chroot_list文件,此文件需用户建立,再将需锁定在自己home目录的用户列入其中,每行一个用户

#chroot_list_file=/etc/vsftpd/chroot_list #此文件需自己建立, 被列入此文件的用户, 在登录后将不能切换到自己目录以外的其他目录, 由FTP服务器自动地 chrooted 到用户自己的home目录下,使得 chroot_list文件中的用户不能随意转到其他用户的FTP home目录下,从而有利于FTP服务器的安全管理和隐私保护

#ls_recurse_enable=YES #是否允许递归查询, 大型站点的 FTP 服务器启用此项可以方便远程用户查询

listen=NO #如果设置为 YES, 则 vsftpd 将以独立模式运行,由vsftpd自己监听和处理连接请求

listen_ipv6=YES #设定是否支持IPV6

pam_service_name=vsftpd #设置 PAM 外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件,此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中

userlist_enable=YES #此选项默认值为NO,此时ftpusers文件中的用户禁止登录FTP服务器; 若此项设为YES,则 user_list文件中的用户允许登录FTP服务器,而如果同时设置了 userlist_deny=YES,则user_list文件中的用户将不允许登录FTP服务器,甚至连输入密码提示信息都没有,直接被FTP服务器拒绝

#userlist_deny=YES/NO #此项默认为YES,设置是否阻扯user_list文件中的用户登录FTP服务器

tcp_wrappers=YES #表明服务器使用 tcp_wrappers 作为主机访问控制方式,tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制,在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制,前者设置允许访问记录,后者设置拒绝访问记录。例如想限制某些主机对FTP服务器192.168.55.99的匿名访问,编缉/etc/hosts.allow 文件,如在下面增加两行命令:vsftpd:192.168..55.98 DENY 和vsftpd:192.168..55.97 DENY 表明限制IP为192.168..55.98/192.168..55.97主机访问IP为192.168.55.99的FTP服务器,此时FTP服务器虽可以PING通,但无法连接

allow_writeable_chroot #此命令是让家目录可写. 从2.3.5之后, vsftpd增强了安全检查, 如果用户被限定在了其主目录下, 则该用户的主目录不能再具有写权限了!如果检查发现还有写权限, 会报500 OOPS: vsftpd: refusing to run with writable root inside chroot()

#2. vsftpd.ftpusers文件说明

这个文件是用来记录"不允许"登录到FTP服务器的用户,通常是一些系统默认的用户.

3.vsftpd.user_list文件说明

其实它的内容跟上面那个文件内容一样,只是在系统对文件vsftpd.conf 进行检测时,会检测到"userlist_deny=YES",因此这个文件必须存在.

ftpusers不受任何配制项的影响, 它总是有效, 它是一个黑名单!

该文件存放的是一个禁止访问FTP的用户列表, 通常为了安全考虑, 管理员不希望一些拥有过大权限的帐号(比如root)登入FTP, 以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。

而user_list则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的, 它可以有效, 也可以无效, 有效时它可以是一个黑名单, 也可以是一个白名单!那么是什么的设置决定了它的作用呢?这就是问题二要解释的。

所以简单总结就是:ftpusers和user_list没有任何关系, ftpusers文件总是生效, user_list则取决于userlist_enable和userlist_deny两项配置。

userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。

当且仅当userlist_enable=YES时:userlist_deny项的配置才有效, user_list文件才会被使用

当userlist_enable=YES时, userlist_deny=YES时:user_list是一个黑名单, 即:所有出现在名单中的用户都会被拒绝登入

当userlist_enable=YES时, userlist_deny=NO时:user_list是一个白名单, 即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入); 特别提醒:使用白名单后, 匿名用户将无法登入!除非显式在user_list中加入一行:anonymous

当userlist_enable为NO时, 无论userlist_deny项为何值都是无效的, 本地全体用户(除去ftpusers中的用户)都可以登入FTP, user_list当然也可以登录

默认 userlist_enable=YES userlist_deny=YES

#chroot_local_user,chroot_list_enable,chroot_list_file这三个选项

chroot_local_user #是否将所有用户限制在主目录,YES为启用 NO禁用.(该项默认值是NO,即在安装vsftpd后不做配置的话, ftp用户是可以向上切换到主目录之外的

chroot_list_enable #是否启动限制用户的名单 YES为启用 NO禁用(包括注释掉也为禁用)

chroot_list_file=/etc/vsftpd/chroot_list #是否限制在主目录下的用户名单, 至于是限制名单还是排除名单, 这取决于chroot_local_user的值, 我们可以这样记忆: chroot_local_user总是一个全局性的设定, 其为YES时, 全部用户被锁定于主目录, 其为NO时, 全部用户不被锁定于主目录。那么我们势必需要在全局设定下能做出一些"微调", 即, 我们总是需要一种"例外机制", 所以当chroot_list_enable=YES时, 表示我们"需要例外"。而"例外"的含义总是有一个上下文的, 即, 当"全部用户被锁定于主目录"时(即chroot_local_user=YES), "例外"就是:不被锁定的用户是哪些; 当"全部用户不被锁定于主目录"时(即chroot_local_user=NO), "例外"就是:要被锁定的用户是哪些。这样解释和记忆两者之间的关系就很清晰了!

对于chroot_local_user与chroot_list_enable的组合效果, 可以参考下表:

chroot_local_user=YES chroot_list_enable=YES 1.所有用户都被限制在其主目录下 2.使用chroot_list_file指定的用户列表, 这些用户作为"例外", 不受限制

chroot_local_user=YES chroot_list_enable=NO 1.所有用户都被限制在其主目录下 2.不使用chroot_list_file指定的用户列表, 没有任何"例外"用户

chroot_local_user=NO chroot_list_enable=YES 1.所有用户都不被限制其主目录下 2.使用chroot_list_file指定的用户列表, 这些用户作为"例外", 受到限制

chroot_local_user=NO chroot_list_enable=NO 1.所有用户都不被限制其主目录下 2.不使用chroot_list_file指定的用户列表, 没有任何"例外"用户

例子: 假设有ftp1, ftp2两个ftp用户, 计划让ftp1用户锁定在主目录下, 不允许切换到其他目录, 但是允许ftp2用户自由切换目录, 则可以分如下两种方式实现:

方式一:

chroot_local_user=YES chroot_list_enable=YES

/etc/vsftpd/chroot_list名单列表为:ftp2

解释:chroot_local_user=YES将所有用户限定在主目录内, chroot_list_enable=YES表示要启用chroot_list_file, 因为chroot_local_user=YES, 即全体用户都被"限定在主目录内",所以总是作为"例外列表"的chroot_list_file这时列出的是那些"不会被限制在主目录下"的用户。

方式二:

chroot_local_user=NO chroot_list_enable=YES

/etc/vsftpd/chroot_list名单列表为: ftp1

解释:chroot_local_user=NO则所有用户不被限定在主目录内, chroot_list_enable=YES表示要启用chroot_list_file, 因为chroot_local_user=NO, 即全体用户都"不被限定在主目录内",所以总是作为"例外列表"的chroot_list_file这时列出的是那些"会被限制在主目录下"的用户。

其他情况:

对于chroot_local_user和chroot_list_enable的组合还有这样两种情况:

chroot_local_user=YES chroot_list_enable=NO 和 chroot_local_user=NO chroot_list_enable=NO

当chroot_list_enable=NO时, 就不再启用chroot_list_file, 此时就是单纯的把全部用户限定或不限定在主目录下了!

补充:

关于chroot_local_user的设置, 通常我们倾向于:全局禁止跳出主目录, 使用chroot_list添加例外!即:使用Case 1的设置!

匿名用户默认的root是/var/ftp

继续阅读