目录
#本文章为学习笔记
一、说明
文件传输协议(file transfer protocol),基于该协议的FTP客户端和服务端可以实现共享文件、上传文件、下载文件。FTP基于TCP协议生成一个虚拟的连接,主要用于控制FTP连接信息,同时再生成一个单独的TCP连接用于FTP数据传输。
二、ftp的工作模式介绍
1.主动模式和被动模式区别:
主被动模式均是以FTP服务器为参照的。
主动模式(active):
- 第一步,客户端随机开启大于1024的X端口与服务器21端口建立命令连接通道,通道建立后客户端随时可以通过该通道发送上传或下载的命令。
- 第二步,当客户端与服务器进行数据传输时,客户端会开启一个大于1024的随机端口Y,并将Y端口号通过之前的命令通道传送给服务器的21端口。
- 第三步,服务器获取到客户端的第二个端口号后会主动连接客户端的该端口,通过三次握手后,完成服务器与客户端数据通道的建立,所有的数据均通过该数据通道进行传输。
被动模式(passive):
- 第一步,客户端随机开启大于1024的X端口与服务器21端口建立命令连接通道。
- 当客户端与服务器进行数据传输时,客户端从命令通道发送数据请求要求上传或下载数据。
- 第三步,服务器收到数据请求后会随机开启一个端口Y,并通过命令通道将该端口信息传送给客户端。
- 第四步,客户端在收到服务器发送过来的数据端口Y的信息后,将在客户端本地开启一个随机端口Z,此时客户端再主动通过本机的Z端口与服务器Y端口进行连接,通过三次握手连接完成后,即可进行数据传输。
2.主动模式和被动模式的应用:
- 在Linux上,默认是主动模式。设置为被动模式的方法:pasv_enable=YES。
- FTP协议需要使用多个网络端口才可以正常工作,其中一个用于命令的传输,另一个用于数据的传输。主动模式在传输数据时,服务器会主动连接客户端端口;被动模式在传输数据时,由客户端主动连接服务器随机端口。简单地说,主动模式是服务器主动连接客户端,服务端使用知名端口(20);被动模式是由客户端主动连接服务器端口,服务端使用的是随机端口(大于1024)。
- FTP协议最初工作使用主动模式,但现在客户端主机大多数都位于防火墙后面,而且防火墙策略一般不允许入站数据,也就是说,客户端可以连接外网,但外网不可以直接接入客户端主机。所以有了后来的被动模式。
- 建议用被动模式,因为被动模式下服务器使用的是随机端口。
3.vsftp相关文件:
- 默认共享目录:/var/ftp
- /etc/vsftpd/vsftpd.conf ---ftp的主配置文件;
- /etc/vsftpd/ftpusers ---设置禁止登录的用户。可以看下这个文件内容,默认root等系统用户是禁止ftp登录使用的:
- /etc/vsftpd/user_list
这个文件列表于ftpusers类似,但是这个user_list列表更灵活,可以根据配置变化为黑名单或白名单。这个文件列表是否能够生效与 vsftpd.conf 内的两个参数有关,分别是『 userlist_enable, userlist_deny 』。
userlist_enable=YES
#启用user_list列表 |
userlist_deny=YES | 此时user_list列表是作为黑名单,不允许user_list文件内的用户登录ftp |
userlist_deny=NO | 此时user_list列表是作为白名单,允许user_list文件内的用户登录ftp |
- /etc/vsftpd/chroot_list ---配合chroot_local_user和chroot_list_enable使用(chroot_list_file文件是自己创建的)
chroot_local_user=yes | chroot_list_enable=yes chroot_list_file=/etc/vsftpd/chroot_list | 对所有用户限制在家目录(或ftp根目录)下活动。/etc/vsftpd/chroot_list文件中的用户不受限制 |
chroot_list_enable=no | 对所有用户限制在家目录(或ftp根目录)下活动。无例外 | |
chroot_local_user=no | chroot_list_enable=yes chroot_list_file=/etc/vsftpd/chroot_list | 不对所有用户进行家目录限制。chroot_list列表中的受到限制。 |
chroot_list_enable=no | 无限制,也无例外 |
- 基于PAM的vsftpd验证配置文件:/etc/pam.d/vsftpd
这个是 vsftpd 使用 PAM 模块时的相关配置文件。主要用来作为身份认证之用,还有一些用户身份的抵挡功能, 也是透过这个文件来达成的
三、配置文件部分参数说明:
匿名用户配置
- anonymous_enable=YES #是否启用匿名用户登录;
- anon_root=/var/www/html #设置匿名用户的ftp根目录,默认是/var/ftp;
- no_anon_password=YES #使用匿名用户登录不会询问密码,即直接登录;
- anon_umask=077 #设置上传文件的默认权限;
- ascii_download_enable=YES #设置客户端优先使用ASCII格式下载;
- ascii_upload_enable=YES #设置客户端优先使用ASCII格式上传;
- anon_max_rate=0 #设置匿名用户的数据传输速率,单位是bytes/秒;
- anon_world_readable_only=YES #设置匿名用户仅具有只读权限,即下载权限;
- anon_other_write_enable=YES #设置匿名用户是否具有除了写入之外的权限,即删除与修改服务器上的文件。默认禁用;
- anon_mkdir_write_enable=YES #设置匿名用户是否具有建立目录权限;
普通用户/常规配置
local_root=/var/www/html #设置本地系统用户的ftp根目录;
local_enable=YES #是否启用本地系统用户访问;
write_enable=yes #是否允许本地系统用户写入权限;
listen_port=21 #修改监听端口,默认是21,这是命令通道;
connect_from_port_20=YES #指定主动模式的数据通道,ftp工作在主动模式时候才有用;
download_enable=yes #是否允许下载请求;
xferlog_enable=YES #将客户端上传下载记录下来;
xferlog_std_format=YES #日志文件将根据xferlog格式写入;
xferlog_file=/var/log/xferlog #设置记录日志路径;
local_umask=022 #设置用户上传时文件或目录的权限,通常文件是没有执行权限的,所以上传文件时是用666减去022,得到644即rw--r--r--。通常目录必须带执行权限,否则无法进入目录中,所以是用777减去local_umask值得到的就是目录权限。
超时时间设置
- connect_timeout=60 #主动模式下的数据连接等待超时时间;
- accept_timeout=60 #被动模式下的数据连接等待超时时间;
- idle_session_timeout=300 #如果使用者在 300 秒内都没有命令动作,强制脱机,避免占用连接;
被动模式的相关配置
pasv_enable=yes #是否启用被动模式;
pasv_min_port=3000 #设置被动模式下,数据连接端口范围;
pasv_max_port=4000 #设置被动模式下,数据连接端口范围;
访客用户配置
- guest_enable=YES #启用访客或虚拟用户访问;
- guest_username=ftp #访客用户映射为ftp(本地用户);
FTP时间调整
use_localtime=YES #配置是否使用本地时间;
访问速率设置
local_max_rate=0 #本地用户的传输速率限制,单位bytes/second;
连接设置
max_per_ip=0 #设置同一个IP同一时间可允许多少个连接;
安全权限配置(家目录限制)
chroot_local_user=YES #对所有用户限制访问,仅能在自己家目录下活动;
chroot_list_enable=YES #是否启用用户访问限制列表功能;
chroot_list_file=/etc/vsftpd.chroot_list #指定访问限制列表的路径;
用户访问配置
userlist_enable=YES #是否启用user_list(/etc/vsftpd/user_list)列表;
userlist_deny=YES #对user_list列表中的用户限制ftp登录;
userlist_file=/etc/vsftpd/user_list #指定列表路径。默认是/etc/vsftpd/user_list;
standalone模式和super daemon模式切换
listen=YES #设置vsftpd以standalone模式启动,默认是NO(即super daemon模式启动);
四、虚拟用户设置
1.虚拟用户配置
系统用户越多越不利于管理,而且不利于安全。虚拟用户的原理是通过映射到其中一个真实用户以及设置相应权限来实现访问验证,虚拟用户不能登录Linux系统。
(1)yum install pam* libdb-utils libdb* #安装虚拟用户需要用到的软件及认证模块;
(2)创建虚拟用户临时文件/etc/vsftpd/ftpusers.txt,新建用户和密码,依次格式:
test1
123456
test2
123456
(3)生成vsftpd虚拟用户数据库认证文件,设置权限为700
db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/vsftpd_login.db
chmod 700 /etc/vsftpd/vsftpd_login.db
(4)配置pam认证文件,/etc/pam.d/vsftpd行首加入如下两行代码:
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login.db
(5)虚拟用户需要映射到一个系统用户,该系统用户不需要密码,也不需要登录。
useradd -s /sbin/nologin ftpuser
(6)配置文件部分代码如下:
pam_service_name=vsftpd
guest_enable=YES #启用虚拟用户;
guest_username=ftpuser #虚拟用户映射;
user_config_dir=/etc/vsftpd/vsftpd_user_conf #设置虚拟用户配置文件所在目录。;
virtual_use_local_privs=YES #设置虚拟用户与本地用户相同权限;
五、配置实例
1.安装
yum install vsftpd
2.新建用户并指定用户家目录
useradd -d /ftp -s /sbin/nologin ftp_test %创建一个系统账号,仅仅让该账号登陆ftp,不能登录shell
#如果在后续有需要添加多个FTP用户的话,可以先创建个组,并调整FTP共享目录的组权限,后续添加FTP用户时,只要将用户加入该组及ftp的白名单配置文件中即可共享目录内容。
passwd ftp_test %配置用户密码
#vim /etc/shells #编辑该文件,将/sbin/nologin添加进去。不然上面配置的/sbin/nologin用户不能登录ftp。
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/sbin/nologin
3.修改配置文件
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=no #不允许匿名登录;
pasv_enable=yes #配置ftp工作为被动模式;
pasv_min_port=3000 #配置被动模式的开放端口范围;
pasv_max_port=4000
reverse_lookup_enable=NO #这个参数比较重要,是关闭名称逆向解析,可解决登陆验证缓慢问题;
chroot_local_user=YES #限制ftp用户仅能在自己家目录(或ftp目录)下活动,不能访问上级目录。这是比较重要的安全配置,防止恶意登录的用户访问到系统的其他目录(例如/etc/);
allow_writeable_chroot=YES #允许限制的用户在家目录下具有写入权限;
userlist_enable=YES #启用限制列表;
userlist_deny=no #只允许/etc/vsftpd/user_list列表中的用户能连接ftp;
4.编辑白名单
上面的配置项userlist_enable=yes和userlist_deny=no,使我们将/etc/vsftpd/user_list文件配置成ftp的白名单。在user_list中写入用户名,即为仅允许该列表中的用户访问ftp。
vim /etc/vsftpd/user_list #先清空该列表中的已配置的其他用户,设置仅允许ftp_test访问ftp;
ftp_test
5.启动服务并开放端口
#注意如果有运行防火墙,要开放防火墙端口,如下是centos7的防火墙端口配置命令
firewall-cmd --zone=public --add-port=21/tcp --permanent
firewall-cmd --zone=public --add-port=3000-4000/tcp --permanent
firewall-cmd --reload
#启动服务
systemctl start vsftpd.service #启动ftp服务;
systemctl enable vsftpd.service #加入开机自启动项;
6.测试登录
用ftp客户端软件登录,成功即可。并验证用户是否仅能在该目录下活动,验证其他用户是否能登录该ftp。
六、知识点补充
1.stand_alone和super daemon模式的区别
(1)stand_alone:此 daemon 可以自行单独启动服务。
stand alone 就是『独立的启动』的意思。这种类型的 daemon 可以自行启动而不必透过其他机制的管理; daemon 启动并加载到内存后就一直占用内存与系统资源。最大的优点就是:因为是一直存在内存内持续的提供服务, 因此对于发生客户端的要求时,stand alone 的 daemon 响应速度较快。
(2)super daemon: 一支特殊的 daemon 来统一管理。
这一种服务的启动方式则是藉由一个统一的 daemon 来负责唤起服务!这个特殊的 daemon 就被称为 super daemon 。 早期的 super daemon 是 inetd 这一个,后来则被 xinetd 所取代了。这种机制比较有趣的地方在于, 当没有客户端的要求时,各项服务都是未启动的情况,等到有来自客户端的要求时, super daemon 才唤醒相对应的服务。当客户端的要求结束后,被唤醒的这个服务也会关闭并释放系统资源。
这种机制的好处是: (1)由于 super daemon 负责唤醒各项服务,因此 super daemon 可以具有安全控管的机制,就是类似网络防火墙的功能啦! (2)由于服务在客户端的联机结束后就关闭,因此不会一直占用系统资源。但是缺点是什么呢? 因为有客户端的联机才会唤醒该服务,而该服务加载到内存的时间需要考虑进去,因此服务的反应时间会比较慢一些啦! 常见的 super daemon 所管理的服务例如 telnet 这个玩意儿就是啦!