一、FTP简介
FTP(File Transfer Protocol,文件传输协议)是用于在网络上进行文件传输的一套标准协议,它属于网络传输协议的应用层。它最主要的功能是在服务器与客户端之间进行文件的传输。这个协议使用的是明文传输。为了更安全的使用FTP协议,只介绍较为安全但功能较少的vsftpd这个软件。
FTP服务器的功能除了单纯的进行文件的传输与管理外,依据服务器软件的配置架构,它还可以提供以下几个主要功能:
1、不同的用户:
FTP服务器在默认的情况下,依据用户登录的情况而分为三种不同的身份,分别是:实体用户,real user;访客,guest;匿名用户,anonymous。
2、命令记录与日志文件记录
FTP可以利用系统的syslogd来进行数据的记录,而记录的数据包括了用户曾经使用过的命令与用户传输数据(传输时间、文件大小等)的记录,所以你可以在/var/log/里面找到各项日志信息。
3、限制用户活动的目录(change root,简称chroot)
为了避免用户在你的linux系统中随意切换目录,所以将用户的工作范围局限在用户主目录下面。FTP可以限制用户仅能在自己的用户主目录当中活动。当用户登录FTP后,由于用户无法离开自己的用户主目录,显示的根目录就是自己用户主目录的内容。这种环境称为change root,即chroot,即改变根目录的意思。
二、FTP的工作流程
FTP的传输使用的是TCP数据包协议。FTP服务器使用了两个连接,分别是命令通道与数据流通道。由于是TCP数据包,这两个连接都需要经过三次握手。
建立命令通道的过程
客户端会随机获取一个大于1024以上的端口来与FTP服务器端的port 21来实现连接,这个过程需要三次握手。实现连接后客户端便可以通过这个连接来对FTP服务器执行命令,查询文件名、下载、上传等命令都是利用这个通道来执行的。
建立数据通道的过程
(1)通知FTP服务器端使用主动连接且告知连接的端口号
FTP服务器的端口21号主要用在命令的执行,但是牵涉到数据流时,就不是使用这个连接了。客户端在需要数据的情况下,会告知服务器端要用什么方式来连接,如果是主动连接,客户端会先随机启用一个端口,且通过命令通道告知FTP服务器这两个信息,并等待FTP服务器的连接。
FTP服务器主动向客户端连接(PORT方式)
FTP服务器由命令通道了解客户端的需求后,会主动地由port 20向客户端的数据端口连接,这个连接也会经过三次握手。此时FTP的客户端与服务器端会建立两条连接,分别用在命令的执行与数据的传递。而默认FTP服务器端使用的主动连接端口就是port 20。
数据传输通道是在有数据传输的行为时才会建立的通道,并不是一开始连接到FTP服务器就立刻建立的通道。
注意:port 21主要接收来自客户端的主动连接,port 20则为FTP服务器主动连接至客户端。
(2)客户端选择被动式连接模式(PASV方式)
客户端通过命令通道发出被动式连接要求,并等待服务器的回应。
FTP服务器启动数据端口,并通知客户端连接
如果你所使用的FTP服务器是能够处理被动式连接的,此时FTP服务器会先启动一个监听端口。这个端口号码可以是随机的,也可以自定义某一范围的端口,这要看FTP服务器软件而定。然后FTP服务器会通过命令通道告知客户端这个已经启动的端口port pasv,并等待客户端的连接。
客户端随机取用大于1024的端口进行连接
然后客户端会随机取用一个大于1024的端口号来进行对主机的port pasv连接。如果一切都没有问题的话,那么FTP数据就可以通过客户端的随机端口和服务端的port pasv来传送了。
请注意:选择用PASV方式还是PORT方式登录FTP服务器,选择权在FTP客户端
三、ftp的使用以及软件的安装
为了更安全的使用FTP协议,只介绍较为安全但功能较少的vsftpd这个软件。vsftpd(very secure FTP daemon)。vsftpd是一个设计的较为安全的FTP服务器软件,它的特点如下:
(1)vsftpd服务的启动者身份为一般用户,所以对linux系统的权限较低,对于linux系统的危害就相对降低了。此外,vsftpd也利用chroot这个函数来进行改换根目录的操作,使得系统工具不会被vsftpd这个服务所利用。
(2)任何需要具有较高执行权限的vsftpd命令均以一个特殊的上层程序所控制,该上层程序享有的较高执行权限功能已经被限制的比较低,并以不影响linux系统本身的系统为准。
(3)绝大部分FTP会使用到的额外命令功能(例如ls,cd等)都已经被整合到vsftpd主程序当中了,因此理论上vsftpd不需要使用到额外的系统提供的命令。
(4)所有来自客户端且想要使用这个上层程序所提供的较高执行权限的vsftpd命令的需求,均被视为不可信任的要求来处理,必须要经过相当程度的身份确认后,才可以利用上层程序的功能。
(5)关于上层程序,会使用chroot的功能来限制用户的执行权限。
[root@localhost ~]# yum install vsftpd -y //装包
说明:
/etc/vsftpd/vsftpd.conf 配置文件,设置参数方式为“参数=设置值”,等号两边不能有空格
/etc/pam.d/vsftpd 这个是vsftpd使用PAM模块时的相关配置文件。主要用来作为身份认证,还有阻挡一些用户身份的功能,(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers文件中的用户)
/etc/vsftpd/ftpusers 与上面一个文件有关系,也就是PAM模块所指定的那个无法登录的用户配置文件,只要将不想让他登录的FTP账号写入这个文件即可。
/etc/vsftpd/user_list 这个文件能否生效与vsftpd.conf内的两个参数有关,分别是userlist_enable和userlist_deny。
/etc/vsftpd/chroot_list 这个文件默认是不存在的,所以需要手动创建。这个文件的功能是可以将某些账号的用户chroot建立在他们的默认主目录。这个文件是否生效与vsftpd.conf内的chroot_list_enable和chroot_list_file两个参数有关。
/var/ftp/ 这是vsftpd默认匿名用户登录的根目录。
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=YES 是否允许匿名用户登录vsftpd主机
16 local_enable=YES 是否允许/etc/passwd内的账号登录vsftpd服务器
19 write_enable=YES 是否允许用户上传数据
23 local_umask=022 默认本地用户上传普通文件权限掩码
29 #anon_upload_enable=YES 是否允许匿名用户上传文件
33 #anon_mkdir_write_enable=YES 是否让匿名用户具有建立目录的权限。
37 dirmessage_enable=YES 当用户进入某个目录时,会显示该目录需要注意的内容
40 xferlog_enable=YES 设置为YES时,用户上传与下载文件都会被记录下来
43 connect_from_port_20=YES 主动请求的数据端口
53 #xferlog_file=/var/log/xferlog 如果xferlog_enable=YES,这里就可以设置日志文件的文件名
57 xferlog_std_format=YES
60 #idle_session_timeout=600 如果用户在600秒内都没有命令操作,强制脱机。
63 #data_connection_timeout=120 如果服务器与客户端的数据连接已经成功建立,但是由于线路问题导致120秒 内还是无法顺利的完成数据的传送,那客户端的连接就会被强制断开
67 #nopriv_user=ftpsecure 设置一个执行vsftpd服务的用户
82 #ascii_upload_enable=YES 为YES表示客户端默认使用ascii格式上传文件
83 #ascii_download_enable=YES 如果设置为YES,那么client就默认使用ASCII格式下载文件
90 #deny_email_enable=YES 将某些特殊的email address阻挡住
92 #banned_email_file=/etc/vsftpd/banned_emails 如果deny_email_enable=YES,可以利用这个设置项目来规定哪 个email address不可登录我们的vsftpd。在上面设置的文件内,一 行输入一个email address即可
100 #chroot_local_user=YES 是否将用户限制在自己的主目录之内,如果是YES代表用户会被限制在自己 的主目录之内
101 #chroot_list_enable=YES 是否启用chroot写入列表的功能
103 #chroot_list_file=/etc/vsftpd/chroot_list 如果chroot_list_enable=YES就可以设置这个项目,这个项目与 chroot_local_user有关
114 listen=NO
123 listen_ipv6=YES
125 pam_service_name=vsftpd 设置PAM认证模块名称为vsftpd
126 userlist_enable=YES 是否借助vsftpd的阻挡机制来处理某些不受欢迎的账号
127 tcp_wrappers=YES 服务端和客户端访问控制策略
[root@localhost pub]# systemct restart vsftpd
在重启vsftpd服务后,就可以使用浏览器访问ftp服务:
还可以在Windows的文件管理器输入:
如果打不开记得关闭防火墙和selinux
实验一:匿名用户的访问
1、匿名用户可以下载文件
[root@localhost pub]# systemct restart vsftpd
[root@localhost pub]# systemctl stop firewalld
[root@localhost pub]# setenforce 0
2、匿名用户可以上传文件
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@localhost pub]# systemctl restart vsftpd
匿名用户默认访问的服务器的目录是/var/ftp/,如果要实现匿名用户可以上传文件,要进行相关权限设置。例如:
[root@localhost ftp]# chmod o+w /var/ftp/pub/
注意:如果给/var/ftp/目录的其他人给了rwx的权限,那么服务器会强制要求你进行用户认证。
思考:匿名用户上传普通文件和目录文件之后的默认权限是多少? 644和755
如果想设置匿名用户上传文件的权限,需添加如下设置:
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
anon_umask=022 添加该内容
注意:以上操作匿名用户可以上传文件,但是无法删除文件
3、匿名用户可以删除文件
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
anon_other_write_enable=YES 添加该内容
实验二:本地用户(/etc/passwd)的访问
1、下载文件
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO 修改为NO,注释无效
默认登录后显示的信息是该用户的家目录的信息,但是该用户可以查看到根目录(需要使用ie浏览器)
2、上传、删除文件
[root@localhost pub]# vim /etc/vsftpd/vsftpd.conf
write_enable=YES 默认该选项已开启
>>测试:通过IE浏览器(其他浏览器可能看不到效果)访问ftp://ip,需要通过用户名密码进行登录(root用户无法成功),默认访问的界面是根目录下面的文件,可以通过本地用户上传文件和下载文件也可以删除文件。弊端是:通过本地用户的身份能看到/下的所有东西。
3、能否chroot
首先开启chroot选项
[root@localhost ftp]# vim /etc/vsftpd/vsftpd.conf
allow_writeable_chroot=YES (如果该字段未添加,则未写在chroot_list文件的用户无法登录)
chroot的三个重要控制文件
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
| chroot_list_enable=YES | chroot_list_enable=NO |
chroot_local_user=YES
| 在/etc/vsftpd/chroot_list文件中列出的用户可以切换到其他目录;未列出的用户被限制在自己的主目录内 |
所有的用户都无法切换到其他目录 |
chroot_local_user=NO | 在/etc/vsftpd/chroot_list文件中列出的用户被限制在自己的主目录内;未列出的用户可以切换到其他目录。 |
所有的用户都可以切换到其他目录
|
实验三:虚拟用户的访问
创建一个用户,禁止该用户登录系统
[root@localhost ~]# useradd -s /sbin/nologin vhaha
修改主目录下的权限:
[root@localhost ~]# chmod 705 /home/vhaha/
添加以下三个选项
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vhaha
virtual_use_local_privs=YES 本地虚拟用户特权开启表示和本地用户访问时的权限一样,如果为NO表示虚拟用户和 匿名用户是相同的权限。
创建虚拟用户文件:
[root@localhost ~]# vim /etc/vsftpd/vhaha
xixi 用户名
redhat 密码
haha 用户名
redhat 密码
将虚拟用户文件转换成数据库文件:
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vhaha /etc/vsftpd/vhaha.db
-T表示允许应用程序能够将文本文件转译载入进数据库
-t hash表示使用hash码加密
-f指定包含用户名和密码文本文件。此文件格式为:奇数行为用户名、偶数行为密码
修改PAM认证方式
编辑认证配置文件
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd
注释所有内容 ,添加以下两行
auth required pam_userdb.so db=/etc/vsftpd/vhaha
account required pam_userdb.so db=/etc/vsftpd/vhaha
注:(.so动态链接数据库)数据库文件名的扩展名“.db”不用写