FTP(File Transfer Protocol) 是相当古老的传输协议之一,它最主要的功能是在服务器与客户端之间进行文件的传输。这个古老的协议使用的是明文传输的方式,且过去有相当多的安全危机历史。为了更安全的使用FTP协议,主要介绍较为安全的vsftpd这个软件。
下面的图片来自百度百科
FTP服务器的功能除了单纯地进行文件的传输与管理之外,依据服务器软件的配置架构,它还可以提供以下几个主要的功能:
FTP服务器在默认的情况下,依据用户登录的情况而分为三种不同的身份
FTP服务器可以利用系统的syslogd来进行数据的记录,记录的数据包括了用户曾经使用过的命令和用户传输数据的记录,如传输时间、文件大小、传输速度等。这些数据记录可以保存在系统的/var/log/目录下的各个日志文件中,例如/var/log/messages、/var/log/syslog等。
为了避免用户在你的Linux 系统中随意切换到其他目录中去,所以将用户的工作范围局限在用户主目录下面。FTP可以限制用户仅能在自己的用户主目录中活动。如此一来,由于用户无法离开自己的用户主目录,而且登录FTP后,显示的根目录就是自己用户主目录的内容,这种环境称为 change root,简称chroot,即改变根目录的意思。
这样做的好处?如果当一个恶意用户以FTP登录你的系统当中,如果没有chroot的环境,它可以到/etc/、/usr/local、/home 等其他重要目录下面去查看文件数据。如果你没有做好一些文件权限的管理与保护,那他就有办法取得系统的某些重要信息,用来入侵你的系统。在chroot的环境下,当然会比较安全。
FTP的传输使用的是TCP数据包协议。FTP服务器使用了两个连接,分别是命令通道与数据流通道(ftp-data),因为是TCP数据包,这两个连接都需要经过三次握手。
下面以FTP默认的主动式(Active)连接作为说明
上图讲解
FTP建立命令通道的连接是指客户端与FTP服务器的一个端口(端口21)建立了一个连接,这个连接用于客户端向服务器发送各种命令,如查询文件名、下载、上传等命令。建立连接需要三次握手,客户端使用一个随机的大于1024的端口(如端口AA)来连接FTP服务器的端口21。
接下来,客户端会告诉FTP服务器要使用主动连接方式(Active),并告知FTP服务器客户端随机的一个端口(如端口BB)来接收数据。FTP服务器会通过端口20主动连接客户端的端口BB,建立数据传输通道。这个过程也需要三次握手。
最终,FTP客户端与服务器之间建立了两个连接,分别用于命令的执行和数据的传输。需要注意的是,数据传输通道只有在有数据传输的时候才会建立,而不是一开始连接FTP服务器就立刻建立的。
FTP中,客户端与FTP服务器之间会建立两个端口的连接,分别是端口21和端口20。这两个端口的工作不同,连接的发起端也不同。
端口21是FTP服务器的默认端口,主要用于接受客户端的连接。
端口20则是FTP服务器主动连接至客户端的端口,用于数据传输。
什么是被动式连接呢?如下图
上图讲解
FTP建立命令通道的连接是指客户端与FTP服务器的一个端口(端口21)建立了一个连接,这个连接用于客户端向服务器发送各种命令,如查询文件名、下载、上传等命令。建立连接需要三次握手,客户端使用一个随机的大于1024的端口(如端口AA)来连接FTP服务器的端口21。
接下来,当客户端需要使用数据通道来传输文件时,它会通过命令通道向服务器发出PASV的被动式连接请求。如果服务器支持被动式连接,它会先启动一个监听端口,并将这个端口号告知客户端。客户端会随机选择一个大于1024的端口号来连接服务器的监听端口,从而建立数据通道。
发现不同了吗?被动式FTP数据通道的连接方向是由客户端服务器端连接的
VSFTP是一款FTP服务器软件,全名是"Very Secure FTP Daemon",翻译过来就是非常安全的FTP守护程序。它的初衷是建立一个安全性高的FTP服务器,因为在过去,FTP传输过程中的数据是明文传输的,存在安全隐患。
vsftpd服务启动时使用一般用户的身份,权限较低,这样可以降低对Linux系统的危害。
所有需要高执行权限的vsftpd命令都由一个特殊的上层程序控制,这个程序虽然有高执行权限,但功能被限制得很低,不会影响Linux系统的正常运行,也可以避免恶意用户利用FTP服务攻击Linux系统。
vsftpd主程序中已经整合了绝大部分FTP需要使用的额外命令功能,因此在chroot的情况下,vsftpd不仅可以正常工作,而且不需要额外的系统提供的命令,这样对于系统来说也比较安全。
所有来自客户端且需要使用上层程序提供的高执行权限的vsftpd请求都被视为不可信任,必须经过身份确认才能使用,这样可以避免攻击者利用FTP服务获取系统权限。
上层程序中仍然使用chroot()的功能来限制用户的执行权限,这样可以保护服务器免受攻击和破坏。
vsftpd所需要的软件只有一个,那就是vsftpd。
可以通过以下命令来安装
[root@localhost ~]# yum install -y vsftpd
vsftpd设置数据比较重要的有如下几个:
/etc/vsftpd/vsftpd.conf
整个vsftpd的配置文件只有这一个文件。配置文件里的设置方式类似于bash变量的设置方式,就是用"参数=设置值"的格式来设置的。需要注意的是,等号两边不能有空格。
/etc/pam.d/vsftpd
这个是vsftpd使用PAM模块时的相关配置文件。主要用来作为身份验证之用,还有阻挡一些用户身份的功能
/etc/vsftpd/ftpusers
FTP用户黑名单,用于限制某些用户无法访问FTP服务器。
/etc/vsftpd/user_list
FTP用户白名单,用于控制允许或禁止登录FTP服务器的用户列表。
==/usr/sbin/vsftpd
vsftpd的主程序文件,用于处理FTP客户端的请求,实现FTP服务。
/var/ftp
这是vsftpd默认匿名用户登录的根目录
指定FTP服务器与FTP客户端之间数据传输的端口,设置为YES
表示FTP服务器会使用20号端口向FTP客户端发起数据连接。
指定FTP服务器监听的端口
当用户进入某个目录时,会显示该目录需要注意的内容,显示的文件默认是 .message
,你可以使用下面的设置项目来定义。
当 dirmessage_enable=YES
时,可以设置这个项目让vsftpd寻找该文件来显示信息。
用于控制FTP服务器是否启用监听模式。
如果将listen
设置为YES
,则FTP服务器会监听指定的IP地址和端口,等待FTP客户端的连接请求;如果将listen
设置为NO
,则FTP服务器不会启用监听模式,也就无法接受FTP客户端的连接请求。
用于控制FTP服务器是否启用被动模式。一定要设置为YES
用于控制FTP服务器是否使用本地时间。
如果你允许用户上传数据时,就要启动这个设置值了
单位是秒,在数据连接的主动式连接模式下,我们发出的连接信号在60秒内得不到客户端的响应,则不等待并强制断线。
当用户以被动式PASV来进行数据传输时,如果服务器启用被动端口并等待Client超过60秒而无回应,那么就强制断线。这个设置与connect_timeout 类似,不过一个是管理主动连接,一个是管理被动连接
用于控制FTP数据连接的超时时间。如果FTP客户端在指定的时间内没有发送任何数据,或者FTP服务器在指定的时间内没有收到任何数据,FTP服务器会强制关闭数据连接。
如果用户在300秒内没有命令操作,强制脱机!避免无用占用空间
用于设置同一时间最多有多少Client可以同时连上vsftpd,限制使用FTP的用量
与上面max_clients 类似,这里是同一个IP同一时间可允许多少连接
用于指定FTP服务器被动模式下使用的端口范围。默认情况下,pasv_min_port
和pasv_max_port
的值都为0,这表示FTP服务器在被动模式下使用任意可用的端口。
当用户连接进入vsftpd时,在FTP客户端软件上会显示的说明文字。不过这个设置值数据比较少,建议可以使用下面的banner_file 设置值来取代这个项目。
这个项目可以指定某个纯文本文件作为用户登录vsftpd服务器所显示的欢迎文字。
若这个值设置为 YES 时,那么任何实体账号,均会被假设为访客(默认是不开放的)。至于访客在vsftpd当中,默认会取得ftp这个用户的相关权限。但是可以通过guest_username
来修改。
在guest_enable=YES时才会生效,指定访客的身份
这个设置值必须要为YES时,在/etc/passwd内的账号才能以实体用户的方式登录我们的vsftpd服务器
注册用户的传输速度限制,单位为 bytes/second,0为不限制。
在默认情况下,是否要将用户限制在自己的用户主目录之内(chroot)?如果是YES代表用木默认就会被限制在自己的用户主目录,如果是NO,则默认是没有被限制在自己的用户主目录。
用于启用或禁用FTP用户的chroot限制列表功能。 当chroot_list_enable
设置为YES
时,FTP服务器将会根据chroot_list_file
文件中的列表,对FTP用户进行chroot限制,即将用户限制在其主目录下,不能访问系统的其他目录。
用于指定FTP用户的chroot限制列表文件的路径。以上示例中,将chroot_list_file
设置为/etc/vsftpd/chroot_list
,表示FTP服务器的FTP用户的chroot限制列表文件路径为/etc/vsftpd/chroot_list
。
用于启用或禁用FTP用户列表功能。 当userlist_enable
设置为YES
时,FTP服务器将会根据userlist_file
文件中的列表,对FTP用户进行访问限制,即只允许列出的用户进行FTP访问。
用于指定是否拒绝FTP用户列表中的用户进行FTP访问。 当userlist_deny
设置为YES
时,FTP服务器将会拒绝列出在userlist_file
文件中的所有用户进行FTP访问。
用于指定FTP用户列表文件的路径,该文件用于控制FTP用户的访问权限。
用于指定是否允许匿名FTP用户进行FTP访问。
用于指定匿名FTP用户是否只能下载FTP根目录下的文件。
用于指定匿名FTP用户是否允许上传和删除FTP根目录以外的文件。
用于指定匿名FTP用户是否允许在FTP根目录下创建子目录。如果要设置为YES,那么anon_other_write_enable 必须设置为 YES。
用于指定匿名FTP用户是否允许上传文件。如果要设置为YES,那么anon_other_write_enable 必须设置为 YES。
用于指定是否禁止使用某些特定的邮箱地址进行FTP访问。
用于指定储存被禁止访问的邮箱地址列表文件的路径。在设置的文件内,一行输入一个E-mail adress 即可
当设置为YES 时,表示匿名用户将会略过密码检验的步骤,直接进入vsftpd服务,一般设置都是NO。
用于限制匿名FTP用户的最大传输速率。如果将其设置为0
,则表示不进行速率限制。
限制匿名用户上传文件的权限,如果是077则匿名用户传送过来的文件权限会是,-rw-------。
用于指定匿名用户的根目录。
用于指定是否允许ASCII模式下载文件。
ASCII模式和二进制模式都是FTP传输文件的方式,其中ASCII模式会将文件中的\n
字符转换为服务器上的特定行尾符(例如Linux上的\n
转换为Windows上的\r\n
),而二进制模式则直接传输文件内容。
用于指定是否允许ASCII模式上传文件。
用于指定是否启用单进程模式。
默认情况下,vsftpd
使用多进程模式运行,每个客户端连接都会被分配到一个独立的进程中处理。而使用单进程模式可以将所有的客户端连接都处理在一个进程中,从而减少系统资源的占用。
用于指定是否启用TCP包过滤器,也称为TCP Wrapper。
用于指定是否启用xferlog日志记录功能,该功能可以记录FTP服务器上的文件传输操作,包括上传、下载、删除等操作。
用于指定xferlog日志文件的路径和文件名。
用于指定xferlog日志文件的格式。默认为NO,因为日志文件会比较容易读
用于指定是否启用双重日志记录功能。启用双重日志记录功能后,vsftpd
会将FTP服务器上的文件传输操作记录在xferlog
日志文件和vsftpd
日志文件中。
我们的vsftpd默认以nobody作为此一服务执行者的权限。因为nobody的权限相当低,即使被入侵,入侵者仅能取得nobody的权限。
这个是PAM模块的名称,放置在/etc/pam.d/vsftpd中的就是这个。
启动vsftpd很简单
[root@localhost ~]# systemctl start vsftpd
在vsftpd.conf默认值当中,是同时开放实体用户与匿名用户的,CentOS默认值如下:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
# 1. 与匿名用户有关的信息:
anonymous_enable=YES # 启用匿名用户访问FTP服务器的功能
# 2. 与实体用户有关的设置
local_enable=YES # 启用本地用户访问FTP服务器的功能
write_enable=YES # 启用FTP用户上传文件或创建目录的功能
local_umask=022 # 设置本地用户上传文件或创建目录的默认权限为022
# 3. 与服务器环境有关的设置
dirmessage_enable=YES # 若目录下有 .message 则会显示该文件的内容
xferlog_enable=YES # 启动日志文件记录,记录与 /var/log/xferlog
connect_from_port_20=YES # 支持主动式连接功能
xferlog_std_format=YES # 支持 WuFTP的日志文件格式
listen=NO # 禁用FTP服务器的独立监听模式,使用xinetd或systemd进行监听。
listen_ipv6=YES # 启用FTP服务器的IPv6监听功能。
pam_service_name=vsftpd # 指定使用名为vsftpd的PAM服务进行身份验证。
userlist_enable=YES # 启用用户列表功能,限制只有在用户列表中的用户才能访问FTP服务器。
tcp_wrappers=YES # 启用TCP包过滤功能,可以通过配置/etc/hosts.allow和/etc/hosts.deny文件来限制FTP服务器的访问。
通过这样的默认设置值,我们的vsftpd可以实现如下功能
可以使用匿名账号或实体账号(/etc/passwd)登录
匿名用户主目录在/var/ftp,且无法上传权限
实体用户的用户主目录参考/etc/passwd,可以切换目录,也可以上传文件和创建目录
任何于 /etc/vsftpd/ftpusers 内存在的账号均无法使用 vsftpd
客户端有任何上传下载信息时,该信息会被记录到 /var/log/xferlog中
主动连接的端口为20
当你启动vsftpd,放行防火墙21端口时,你的实体用户就能够直接利用vsftpd这个服务来传输数据了
[root@localhost csq]# systemctl restart vsftpd
[root@localhost ~]# setenforce 0
[root@localhost csq]# firewall-cmd --add-service=ftp --permanent
success
[root@localhost csq]# firewall-cmd --reload
success
Linux默认没有安装 ftp 安装一下ftp,因为要使用ftp进行连接传输
[root@ftp-client ~]# yum install -y ftp
为了测试上传功能能不能使用可以在 客户端root目录下创建个文件
[root@ftp-client ~]# echo "I am csq, who are you" >> hello.txt
[root@ftp-client ~]# ls
hello.txt
匿名用户登录
实体用户登录(需要创建用户)
退出FTP 可以使用 quit 或者 bey 命令进行退出ftp
下面是我们希望达到的功能:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
1. 与匿名用相关的信息
anonymous_enable=NO # 由于是针对的实体账号的设置匿名用户先关了他
2. 与实体用户相关的信息,可写入,且umask 为002
chroot_local_user=YES # 设置为YES,将FTP用户限制在其主目录下
chroot_list_enable=YES # 启用FTP用户的访问限制列表,只有列在访问限制列表中的FTP用户才会被限制在其主目录下。
chroot_list_file=/etc/vsftpd/chroot_list # 指定FTP用户的访问限制列表文件的路径,该文件列出了允许被限制在其主目录下的FTP用户
allow_writeable_chroot=YES # 如果该字段未添加,则未写在chroot_list文件的用户无法登录
local_enable=YES
write_enable=YES
local_umask=002 # 修改为002 u=rwx,g=rwx,o=rx
userlist_enable=YES
userlist_deny=YES # 没有需要手动添加,作用是userlist_file里面的用户不能登录
userlist_file=/etc/vsftpd/user_list # 没有需要手动添加,作用是指定目录
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
banner_file=/etc/vsftpd/welcome.txt # 这个是添加的文件,其作用是写入欢迎信息
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
tcp_wrappers=YES
[root@localhost ~]# systemctl restart vsftpd # 改完后重启
[root@localhost ~]# setenforce 0
[root@localhost ~]# firewall-cmd --add-service=ftp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
建立欢迎信息
[root@localhost ~]# vim /etc/vsftpd/welcome.txt
# 文件内容
欢迎光临FTP服务器
主要的服务是针对本机实体用户提供的
若有问题请与我联系.
建立限制系统账号登录的文件
针对对系统账号来给予阻挡的机制,有两个文件,一个PAM模块管的,一个是vsftpd主动提供的
这两个文件内容是一样的,并且这两个文件必须要存在才行。将UID小于500的账号名称写入这两个文件内。一行一个账号
# 可以先给账号排序一下,找出小于500的系统账号
[root@localhost ~]# cat /etc/passwd | sort -t ':' -k 3 -n
# 然后在进行截取
[root@localhost ~]# cat /etc/passwd | sort -t ':' -k 3 -n | cut -d ":" -f 1
[root@localhost ~]# vim /etc/vsftpd/user_list
root
bin
daemon
....
....
...
设置/etc/vsftpd/chroot_list
指定可以切换目录的用户的列表,一行一个
[root@localhost ~]# cat /etc/vsftpd/chroot_list
zhw
zzh
实体账号登录
使用zhw看看能不能切换目录
提供欢迎信息
仅开放 匿名用户登录,且不需要密码
匿名用户可上传/下载自己的资料
文件传输限速为 1 MB 每秒
数据连接的过程只要超过30秒没响应,就强制Client 断线
只要匿名用户超过10分钟没有操作,就予以断线
最大同时在线人数限制为 50人
匿名用户的根目录在 /tmp/anon/下
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
# 1. 与匿名用户相关的信息:
write_enable=YES # 启用FTP用户上传文件或创建目录的功能。
anon_other_write_enable=YES # 启用匿名用户在指定目录中上传文件或创建目录的功能
anon_mkdir_write_enable=YES # 启用匿名用户在指定目录中创建目录的功能。
anon_upload_enable=YES # 启用匿名用户上传文件的功能。
anonymous_enable=YES # 允许匿名用户登录
no_anon_password=YES # 匿名用户登录,系统不会校验密码
anon_max_rate=1000000 # 最大带宽使用为 1MB
data_connection_timeout=30 # 数据流连接的限制为30秒,超过就断线
idle_session_timeout=600 # 若匿名用户发呆超过10分钟就断线
max_clients=50 # 最大同时在线人数为50人
anon_root=/tmp/anon # 匿名用户的根目录在 /tmp/anon 下
# 2.与实体用户相关的本案例就关闭了
local_enable=NO
# 3. 与服务器环境有关的设置
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
banner_file=/etc/vsftpd/anon_welcome.txt # 文件名有变
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
tcp_wrappers=YES
[root@localhost ~]# systemctl restart vsftpd # 改完后重启
[root@localhost ~]# setenforce 0
[root@localhost ~]# firewall-cmd --add-service=ftp --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
建立欢迎信息
[root@localhost ~]# vim /etc/vsftpd/anon_welcom.txt
# 内容
欢迎使用FTP服务
uploads 提供匿名用户的上传数据
创建一个50MB的文件
[root@localhost ~]# dd if=/dev/zero of=/tmp/anon/aaa bs=1M count=50
创建并修改文件权限
设置了允许匿名用户拥有完整的建立、删除、修改文件与目录的权限。不过,要实际生效还需要Linux文件系统权限正确才行。匿名用户取得身份是ftp,所以你想要让匿名用户上传数据到/tmp/anon/uploads中则需要这样做:
[root@localhost ~]# mkdir /tmp/anon/uploads
[root@localhost ~]# chown ftp /tmp/anon/uploads/