FTP是文件传输协议(File Transfer Protocal)的简写,主要完成与远程计算机的文件传输。
FTP采用客户/服务器模式,客户机与服务器之间利用TCP建立连接,客户可以从服务器上下载文件,也可以把本地文件上传至服务器。
FTP服务器有匿名的和授权的两种。匿名的FTP服务器向公众开放,用户可以用“ftp”或“anonymous”为帐号,用电子邮箱地址为密码登录服务器;授权的FTP服务器必须用授权的账户名和密码才能登录服务器。通常匿名的用户权限较低,只能下载文件,不能上传文件。
FTP是一个CS架构的软件,一边是客户端,一边是服务端。客户端有一个用户界面,可以是LeapFTP这样的图形界面,也可以是命令行形式的文本文件方式来使用。一旦用户有一个操作,就会通过用户协议解释器转换成对应的FTP命令,通过控制连接发送给服务器端,控制连接的端口号是21,首先是客户端去连接服务器端的21端口,建立了控制连接,控制连接主要是用于FTP命令以及FTP命令的响应。一旦服务器端收到一个命令以后就要进行相应的工作,比如收到了用户名和密码,就要进行相应的验证。验证成功之后就给客户端响应,验证失败的话就给一个失败的响应。FTP传送命令的时候,主要是为了文件传输,也就是会涉及到文件传输的命令,这些命令也是通过控制连接来发送的,一旦服务器端解析到一个文件传输的命令之后,就要和客户端建立一个新的连接通道,这个通道称为数据连接通道,用于传输文件。这个连接的建立,可以由客户端主动发起,也可以由服务器端发起。这就对应到了两种不同的工作模式。如果是客户端上传文件的话,就会读取本地文件系统中的文件,传输给服务器端,服务端就将它写到服务器端对应的文件系统。如果是下载的话,服务器端读取文件系统中的数据,写入到数据连接,通过数据连接发送给客户端,客户端就读取数据连接中的数据,写入到本地的文件系统。这就是FTP工作的基本原理。
数据连接并不是永久性存在的,一旦传输完毕就会将这个连接关闭掉,但是控制连接不会关闭,除非将客户端关闭了,控制连接才会随之关闭。控制连接是随客户端一起存在的,而数据连接是短暂存在的,只要文件传输或者列表传输完成,数据连接就关闭了。
主要是针对数据连接而言的,控制连接的建立总是由客户端向服务器端发起。而数据连接通道的建立则不同,既可以是服务器端向客户端发起连接建立数据连接通道,这种模式称为主动模式。也可以是客户端向服务器端发起连接建立数据连接通道,这种模式称为被动模式。
主动模式:FTP服务器主动向客户端发起连接请求。
被动模式:FTP服务器等待客户端发起连接请求(FTP的默认工作模式)。
vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP服务程序不具备的特点。
特点:
vsftp一般以普通用户运行,降低了进程的权限,提高了安全性任何需要执行较高权限的指令都需要上层程序的许可ftp的命令都被整合到了vsftp中,不需要系统额外提供命令用于chroot功能,可以改变用户的根目录,限制用户只能在自己的家目录vsftpd 是一个基于GPL发布的FTP服务器软件。其中的vs是“ Very Secure”的缩写,由此名称缩写可以看出,本服务器的初衷就是服务的安全性。vsftpd是RedHat Linux默认使用的ftp服务端软件。vsftpd不再依赖于xinetd服务vsftpd可同时允许匿名( anonymous )与本地用户(local)访问,还可以支持虚拟用户。第一步:安装vsftp服务
[root@localhost ~]# yum -y install vsftpd [root@localhost ~]# systemctl restart vsftpd [root@localhost ~]# systemctl enable vsftpd [root@localhost ~]# firewall-cmd --permanent --add-service=ftp [root@localhost ~]# firewall-cmd --reload第二步:配置文件
(1)常用的全局配置
listen_address=192.168.245.128 设置监听的IP地址listen=YES 是否以独立运行的方式监听服务listen_port=21 设置监听FTP服务的端口号write_enable=YES 是否启用写入权限download_enable=YES 是否允许下载文件max_clients=0 限制并发客户端连接数max_per_ip=0 限制同一IP地址的并发连接数pasv_enable=yes 设置最小的被动端口号pasv_min_port=9981 设置最小的被动端口号pasv_max_port=9981 设置最大的被动端口号dirmessage_enable=yes 是否显示目录说明文件xferlog_enable=yes 是否记录ftp传输过程xferlog_file=/var/log/vsftpd.log 日志的路径和名字xferlog_std_format=yes 是否使用标准的ftp xferlogchown_username=username 是否改变上传文件的属主,如果是则需要输入一个系统用户名idle_session_timeout=600 设置默认不活跃session时间date_connection_timeout=120 设置数据传输超时时间(2)本地用户访问限制:
userlist_enable=YES 是否启用user_list列表文件userlist_deny=YES 是否禁用user_list中的用户(3)本地用户权限控制:
local_enable=YES 是否启用本地系统用户local_umask=022 本地用户所上传文件的权限掩码local_root=/var/ftp 设置本地用户的FTP根目录chroot_local_user=YES 是否将用户禁锢在主目录local_max_rate=0 限制最大传输速率(字节/秒)chroot_list_enable=YES 配合下面的文件使用chroot_list_file=/etc/vsftpd/chroot_list 配合使用,列表中的用户将被禁锢在目录中(4)匿名权限控制:
anonymous_enable=YES 启用匿名访问anon_umask=022 匿名用户所上传文件的权限掩码anon_root=/var/ftp 匿名用户的FTP根目录anon_word_readable_only=YES 允许匿名下载anon_upload_enable=YES 允许上传文件anon_mkdir_write_enable=YES:允许创建目录anon_other_write_enable=YES 开放其他写入权anon_max_rate=0 限制最大传输速率(字节/秒)第三步:安装要求更改配置后,重启服务即可。
在vsftpd服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都可以无需密码验证而直接登录到FTP服务器。这种模式一般用来访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。
vsftpd服务程序默认开启了匿名开放模式,需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。
图:匿名用户配置注意:在开启匿名用户登录后,必须要修改ftp根目录的所属身份。因为默认是root用户,只用root用户具有写入权限。
chown -Rf ftp /var/ftp/pub 执行该命令后,即可上传文件,创建目录等。
在做本实验时,selinux都是默认关闭的。如果还有问题,关闭selinux或者更改selinux的权限即可。 setsebool -P ftpd_full_access=on
相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单。如果大家之前用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。
参数作用anonymous_enable=NO禁止匿名访问模式local_enable=YES允许本地用户模式write_enable=YES设置可写权限local_umask=022本地用户模式创建文件的umask值userlist_deny=YES启用“禁止用户名单”,名单文件为ftpusers和user_listuserlist_enable=YES开启用户作用名单文件功能 #按如下操作修改配置文件即可,修改后重启服务。 #在客户端测试 [root@localhost ~]# ftp 192.168.245.128 Connected to 192.168.245.128 (192.168.245.128). 220 (vsFTPd 3.0.2) Name (192.168.245.128:root): cao 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,245,128,67,44). 150 Here comes the directory listing. drwxr-xr-x 2 1000 1000 6 Oct 25 12:35 dir drwxr-xr-x 2 1000 1000 6 Oct 01 11:14 下载 drwxr-xr-x 2 1000 1000 6 Oct 01 11:14 公共 drwxr-xr-x 2 1000 1000 6 Oct 01 11:14 图片 drwxr-xr-x 2 1000 1000 6 Oct 01 11:14 文档 drwxr-xr-x 2 1000 1000 6 Oct 01 11:14 桌面 drwxr-xr-x 2 1000 1000 6 Oct 01 11:14 模板 drwxr-xr-x 2 1000 1000 6 Oct 01 11:14 视频 drwxr-xr-x 2 1000 1000 6 Oct 01 11:14 音乐 226 Directory send OK. ftp> pwd 257 "/home/cao" ftp>注意:
在登录时,默认不能使用root用户,因为在vsftp中,默认有两个文件中的用户禁止登录。如果想使用root用户登录,删除两文件中的root即可。
采用本地账户登录后,默认访问的目录是该用户的家目录。而且该目录的默认所有者,所属组都是该用户自己,所以不存在权限问题。当有权限问题时,检查selinux设置即可。
[root@localhost ~]# cat /etc/vsftpd/user_list # vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody [root@localhost ~]# cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody [root@localhost ~]#在window电脑上访问ftp服务器时,都会弹出要求输入账户和密码的输入框。通过认证即可访问ftp的资源。
虚拟模式是三种模式中,最安全的模式。
**第一步:**创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。例如,我们分别创建出zhangsan和lisi两个用户,密码均为redhat。
[root@localhost vsftpd]# vim vuser.list zhangsan redhat123 lisi redhat123 [root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list vuser.db [root@localhost ~]# file /etc/vsftpd/vuser.db vuser.db: Berkeley DB (Hash, version 9, native byte-order) [root@localhost ~]# chmod 600 /etc/vsftpd/vuser.db [root@localhost ~]# rm -f /etc/vsftpd/vuser.list**第二步:**创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
由于Linux系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限。
为了方便管理FTP服务器上的数据,可以把这个系统本地用户的家目录设置为/var目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,我们将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还可以避免黑客通过这个系统本地用户进行登录。
[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin virtual [root@localhost ~]# ls -ld /var/ftproot/ drwx------ 3 virtual virtual 78 10月 25 20:52 /var/ftproot/ [root@localhost ~]# chmod -Rf 755 /var/ftp ftp/ ftproot/ [root@localhost ~]# chmod -Rf 755 /var/ftproot/第三步:建立用于支持虚拟用户的PAM文件。
PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想,其结构如图下图所示:
图:PAM的分层设计结构新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀:
[root@localhost ~]# vim /etc/pam.d/vsftpd.vu auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser**第四步:****在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu,**PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。
例如,在vsftpd服务程序的主配置文件中默认就带有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的。现在我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可。
利用PAM文件进行认证时使用的参数以及作用:
参数作用anonymous_enable=NO禁止匿名开放模式local_enable=YES允许本地用户模式guest_enable=YES开启虚拟用户模式guest_username=virtual指定虚拟用户账户pam_service_name=vsftpd.vu指定PAM文件allow_writeable_chroot=YES允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求第五步:为虚拟用户设置不同的权限。
虽然账户zhangsan和lisi都是用于vsftpd服务程序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、修改、查看、删除文件,只允许李四查看文件。这可以通过vsftpd服务程序来实现。只需新建一个目录,在里面分别创建两个以zhangsan和lisi命名的文件,其中在名为zhangsan的文件中写入允许的相关权限(使用匿名用户的参数):
[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir/ [root@localhost ~]# cd /etc/vsftpd/vusers_dir/ [root@localhost vusers_dir]# touch lisi [root@localhost vusers_dir]# vim zhangsan anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES然后再次修改vsftpd主配置文件,通过添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。
添加:user_config_dir=/etc/vsftpd/vusers_dir
在windows上测试:
输入指定ftp服务器后,会要求输入账号密码,这儿输如的张三,密码redhat123.可成功连接。
zhangsan用户具有读写权限,所以可以新建文件等。但是lisi没有权限。
