前言
FTP的部署。
1. FTP服务器是什么?
FTP是一种文件传输协议,主要用来进行文件的传输,尤其是大型文件传输使用FTP非常的方便。但FTP协议存在一个非常大的缺陷,就是使用明文传输,数据传输过程中存在一些安全风险。
2. FTP的工作流程与使用到的端口
2.1 主动连接
FTP的传输使用的是TCP数据包协议,FTP的特殊之处在于使用了两个连接,分别是命令通道与数据流通道,这两个通道的关系如何呢?下面我们已FTP默认的主动式(Active)连接来作个简略的说明:
-
建立命令通道的连接 如上图,客户端随机取一个大于1024以上的端口(AA)来与FTP服务器端的port 21实现连接,实现连 接后客户端便可以通过这个连接来对FTP服务器执行命令,查询文件名、下载、上传等命令都是利用这个通道来执行的。 -
通知FTP服务器端使用Active且告知连接的端口号 FTP服务器的端口21主要用在命令的执行,但是当牵涉到数据流时,就不使用这个连接了。客户端在需要数据的情况下,会告知服务器端要用什么方式来连接,如果是主动式(Active)连接时,客户端会先随机启用一个端口(BB),且通过命令通道告知FTP服务器这两个消息,并等待FTP服务器的连接。 -
FTP服务器主动向客户端连接 FTP服务器由命令通道了解客户端的需求后,会主动由Port20向客户端的port BB连接。此时FTP的客户端与服务器端会建立两条连接,分别用在命令的执行与数据的传递。而默认的FTP服务器端使用的主动连接端口就是port 20。 这样就成功建立起“命令”与”数据传输“两个通道,不过,需要注意的是,数据传输通道是在有数据传输的行为时才会建立的通道,并不是一开始连接到FTP服务器就立刻建立的通道。
-
主动式连接使用到的端口号
2.1 被动式连接
- 用户与服务器建立命令通道
- 客户端发出PASV的连接要求
当使用数据通道的命令时,客户端可通过命令通道发出PASV的被动式连接要求,并等待服务器回应。 - FTP服务器启动数据端口,并通知客户端连接
如果你使用的FTP服务器是能够被动式连接的,此时FTP服务器会先启动一个监听端口。这个端口号码可以是随机的,也可以自定义某一端口范围,这要看FTP服务器软件设定。然后FTP服务器会通过命令通道告知客户端已经启动的端口(port PASV),并等待客户端连接。 - 客户端随机取用大于1024的端口进行连接
然后你的客户端会随机取用一个大于1024的端口号来进行对主机的port PASV连接。如果一切都顺利的话,那么FTP数据就可以通过port Y及port PASV来传送了。
2.3 FTP的安全性问题
因为FTP是明文传输,所以在FTP上面传送的数据很可能被窃取。因此,一般来说,除非是局域网内要开放一些没有机密或授权问题的资料,否则不建议使用FTP。如果真的要架设FTP网站,那么还是得需要注意以下几个事项:
- 随时更新到最新版本的FTP软件,并随时注意漏洞信息。
- 善用iptables来规定可以使用的FTP网络
- 善用TCP_Wrappers来规范可以登陆的网络
- 善用FTP软件的设置来限制使用你的FTP服务器的用户的不同权限
- 使用Super daemon来管理你的FTP服务器
- 随时注意用户的主目录以及匿名用户登陆的目录的文件权限
- 若不对外公开的话,或许也可以修改FTP的port
- 也可以使用FTPs这种加密的FTP的功能
替代方案 考虑使用sftp-server这种方式替换ftp-server,sftp-server最大的优点就是,在上面传输的数据是经过加密的,所以更安全一些。
2.4 开放什么身份的用户登陆
- 开放实体用户登陆(Real user)
FTP服务器默认并没有针对实体用户来进行限制,所以实体用户可以针对整个文件系统进行任何他所具有权限的工作,因此存在很大的安全隐患。建议如下: 1)建议考虑使用实名制方式 2)限制用户能力,如chroot与/sbin/nologin - 访客身份(Guest)
在建立Guest的案例中,多半是由于服务器提供了类似个人Web首页的功能给一般身份用户,这些用户需要管理自己的网页空间。建议如下: 1)仅提供需要登陆的账号即可,不需要提供系统上面的所有人均可登陆的环境。 2)在服务器当中,针对不同的访客给他们不一样的用户主目录,并设置好用户的权限。 3)针对这样的用户身份,设置较多的限制,包括:上传(下载)文件数目与硬盘容量的限制、连接登陆的时间限制、许可使用的命令限制,比如,不允许使用chmod等。 - 匿名登陆用户(anonymous)
如果要放置一些公开的,没有版权纠纷的数据在网络上供人下载的话,那么提供一个匿名登陆的FTP服务器,也是可以的。要注意如下: 1)允许的工作命令要减少很多,几乎就不许匿名用户使用命令; 2)限制文件传输的数量,尽量不要允许上传数据 3)限制匿名用户同时登陆的最大连接数量。
3.vsftp服务器基础设置
vsftpd的全名是“Very Secure FTP Daemon”,vsftpd最初的发展理念是构建一个以安全为重心的FTP服务器,那么vsftpd的安全是怎么做的呢?
3.1 vsftpd软件及相关文件
vsftpd所需要的软件只有一个,那就是vsftpd。如果没有安装,请利用yum install vsftpd安装下。vsftpd相关的配置文件比较重要的有如下几个:
- /etc/vsftp/vsftpd.conf(主配置文件)
vsftpd的主配置文件,以bash的变量设置相同的方式来处理的,以“参数=设置值”来设置的,注意,等号两边不能有空白,详细的vsftpd.conf可以使用man 5 vsftpd.conf来详细了解。 - /etc/pam.d/vsftpd
vsftpd使用PAM模块时的配置文件,主要用来作为身份认证之用,还有阻挡一些用户身份的功能,也是通过这个文件来实现的。 - /etc/vsftpd/ftpusers
与上一个文件有关系,也就是PAM模块(/etc/pam.d/vsftpd)所指定的那个无法登陆的用户配置文件。将不想让它登陆的FTP账号写入这个文件即可。 - /etc/vsftpd/user_list
这个文件能否生效与vsftpd.conf内的两个参数有关,分别是userlist_enable和userlist_deny。上面说的ftpusers文件是PAM模块的配置,那么user_list则是vsftpd自定义的访问项目。在默认情况下,你可以将不允许登陆的vsftpd的账号写入这里。不过这个文件是否生效由vsftpd.conf配置文件内的userlist_deny={YES/NO}决定,这需要特别留意。 - /etc/vsftpd/chroot_list
这个文件默认是不存在的,需要手动自行建立。文件的主要功能是可以将某些账号的用户chroot建立在他们默认的用户主目录下。这个文件生效与vsftpd.conf内的chroot_list_enable、chroot_list_file两个参数有关。如果想要将某些实体用户限制在他们的用户主目录内而不许动其他目录去,可以启用这个设置。 - /usr/sbin/vsftpd
vsftpd的主要执行文件,vsftpd也只有这一个执行文件而已。 - /var/ftp
匿名用户的根目录,其实与ftp这个账号的用户主目录有关。
3.2 vsftpd.conf常用配置项说明
配置项目 | 含义 |
---|
connect_from_port_20=YES(NO) | 主动模式连接时,ftp数据通道的传输端口 | listen_port=21 | vsftpd使用的命令通道端口,如果你想使用非正规的端口号,可以修改这个设置。 | listen=YES(NO) | 若设置为YES,表示vsftpd是以stand alone的方式启动 | pasv_enable=YES(NO) | 支持数据流的被动式连接模式 | use_localtime=YES(NO) | vsftpd默认使用GMT时间(格林尼治时间),默认ftp内的文件日期会比中国晚8小时,建议修改设置为YES | write_enable=YES(NO) | 允许用户上传数据时,就要启动这个设置 | guest_enable=YES(NO) | 若设置为YES时,那么任何实体账号,均会被架设为guest(所以默认是不开放的) | guest_username=ftp | 在guest_enable=YES时才会生效,指定访客的身份 | local_enable=YES(NO) | 这个设置值为YES时,在/etc/passwd内的账号才能以实体用户的方式登陆我们的vsftpd服务器 | local_max_rate=0 | 实体用户的传输速度限制,单位为bytes/second,0为不限制。 | chroot_local_user=YES(NO) | YES,代表用户默认会被限制到用户的主目录内,NO,则没有限制。实际还是需要下面的两个参数配合使用。 | chroot_list_enable=YES(NO) | 是否启用chroot写入列表的功能,与下面的chroot_list_file有关,YES,则开启。NO,则不开启 | chroot_list_file=/etc/vsftpd.chroot_list | 接上一设置项目,文件内的用户限制到用户的主目录内。 | userlist_enable=YES(NO) | 借助vsftpd的阻挡机制来处理某些不受欢迎的账号,与下面的参数设置有关。 | userlist_deny=YES(NO) | 当userlist_enable=YES时才会生效的设置,若此设置值为YES时,则当用户账号被列入某个文件时,该文件内的用户将无法登陆vsftpd服务器,文件的文件名与下列设置项目有关。 | userlist_file=/etc/vsftpd/user_list | 若上面userlist_deny=YES时,则文件内的账号都无法使用vsftpd | vsftpd_log_file=/var/log/vsftpd.log | vsftpd的日志文件 | pam_service_name=vsftpd | PAM模块的名称,在/etc/pam.d/vsftpd中的即是这个 |
3.3 vsftpd.conf配置示例
[root@ansible ~]# vim /etc/vsftpd/vsftpd.conf
#1.not allow anonymous to use this ftp server
anonymous_enable=NO
#2. real user options
local_enable=YES
write_enable=YES
local_umask=002
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
#3. host environment options
use_localtime=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/welcome.txt
#4. forbid users to chroot,Special circumstances are not included
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
#allow_writeable_chroot=YES
#5. limit upload download rate,bytes/second
local_max_rate=10000000
#6. allow muti log
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
#7. ftps configuration(vsftp配置SSL加密功能,除特殊要求不需要配置)
#ssl_enable=YES
#allow_anon_ssl=NO
#force_local_data_ssl=YES
#force_local_logins_ssl=YES
#ssl_tlsv1=YES
#rsa_cert_file=/etc/vsftpd/vsftpd.pem
#8. turn off ftp resolve(ftp登陆异常缓慢时,需要加入如下选项,禁止DNS解析)
reverse_lookup_enable=NO
3.4 vsftpd的启停
1.启动
[root@ansible ~]# service vsftpd start
Redirecting to /bin/systemctl start vsftpd.service
[root@ansible ~]# netstat -nutlp | grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 89702/vsftpd
2.停止
[root@ansible ~]#service vsftpd stop
2.查看状态
[root@ansible ~]# service vsftpd status
Redirecting to /bin/systemctl status vsftpd.service
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Apr 06 17:38:32 ansible systemd[1]: Starting Vsftpd ftp daemon...
Apr 06 17:38:32 ansible systemd[1]: Started Vsftpd ftp daemon.
Apr 06 17:39:17 ansible systemd[1]: Stopping Vsftpd ftp daemon...
Apr 06 17:39:17 ansible systemd[1]: Stopped Vsftpd ftp daemon.
报错
-
windows客户端连接FTP服务器 200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
原因 你正在连接的FTP服务器配置为主动模式,由于防火墙和nat的存在,主动模式下设置FTP比较麻烦。
-
这可能是因为客户端本地防火墙或NAT,服务器不能连接回客户端建立数据传输连接。 -
或者客户机不知道它的外部IP地址(NAT之后),而是向服务器提供一个内部地址(在PORT命令中),而服务器显然无法连接这个地址。 但作为FTP服务端,vsftpd默认拒绝与FTP控制连接的源地址不相同的数据传输地址(port_promiscuous指令)。
如果可能的话,应该使用被动模式,因为它通常不需要在客户端进行额外设置。 这也是服务器建议你“考虑使用PASV”。 PASV是FTP命令,用于进入被动模式。 不幸的是,Windows 命令行(ftp命令)根本不支持被动模式。考虑使用任何其他第三方FTP客户端代替,比如FileZilla, 其他大多数支持被动模式。
|