Linux学习之十一【使用vsftpd 服务传输文件】

整理自刘遄老师的《Linux就该这么学》,网站链接

11、使用vsftpd 服务传输文件

11.1 文件传输协议

FTP 是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP 命令与参数。FTP 服务器普遍部署于内网中,具有容易搭建、方便管理的特点。而且有些FTP 客户端工具还可以支持文件的多点下载以及断点续传技术,因此得到广大用户青睐。

FTP 服务器是按照FTP 协议在互联网上提供文件存储和访问服务的主机,FTP 客户端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP 协议有下面两种工作模式。
􀂾 主动模式:FTP 服务器主动向客户端发起连接请求。
􀂾 被动模式:FTP 服务器等待客户端发起连接请求(FTP 的默认工作模式)

vsftpd(very secure ftp daemon,非常安全的FTP 守护进程)是一款运行在Linux 操作系统上的FTP 服务程序,不仅完全开源而且免费,此外,还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP 服务程序不具备的特点。

iptables 防火墙管理工具默认禁止了FTP 传输协议的端口号,因此在正式配置vsftpd 服务程序之前,为了避免这些默认的防火墙策略“捣乱”,还需要清空iptables 防火墙的默认策略,并把当前已经被清理的防火墙策略状态保存下来。

基于Yum软件仓库安装vsftpd服务程序

vsftpd 服务程序主配置文件中常用的参数:
在这里插入图片描述

11.2 vsftpd 服务程序

允许用户以三种认证模式登录到FTP 服务器上:

  • 匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP 服务器。
  • 本地用户模式:是通过Linux 系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可以畅通无阻地登录FTP 服务器,从而完全控制整台服务器。
  • 虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为FTP 服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP 服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

1、匿名开放模式

这种模式一般用来访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。当然,如果采用第8 章中介绍的防火墙管理工具(如Tcp_wrappers 服务程序)将vsftpd 服务程序允许访问的主机范围设置为企业内网,也可以提供基本的安全性。

vsftpd 服务程序默认开启了匿名开放模式。可以向匿名用户开放的权限如下所示,但需注意,针对匿名用户开放这些权限会带来潜在危险,不建议在生产环境中如此行事。
在这里插入图片描述
在vsftpd 服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空。而且在连接到FTP 服务器后,默认访问的是/var/ftp 目录。
切换到该目录下的pub目录中并尝试创建一个新的目录文件以检测写入权限时,依次出现“权限拒绝”、“创建目录的操作失败”等提示,通过查看该目录的权限、修改目录的所有者身份、修改SELinux服务等修改配置,并最终在/var/ftp/pub目录下成功新建文件。(过程详见匿名访问模式

2、本地用户模式

在这里插入图片描述
测试:
1、在 vsftpd 服务程序的主配置文件中正确填写参数(见下面的1-4行),然后保存并退出。重启vsftpd服务程序,让新的配置参数生效,并将配置好的服务添加到开机启动项中。

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11 pam_service_name=vsftpd
12 userlist_enable=YES
13 tcp_wrappers=YES
[root@linuxprobe ~]# systemctl restart vsftpd
[root@linuxprobe ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.
target.wants/vsftpd.service

2、用本地用户的身份登录FTP服务器

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): root
530 Permission denied.
Login failed.
ftp>

发现在我们输入root 管理员的密码之前,就已经被系统拒绝访问了。这是因为vsftpd 服务程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers 和user_list)。只要里面写有某位用户的名字,就不再允许这位用户登录到FTP服务器上

[root@linuxprobe ~]# cat /etc/vsftpd/user_list
1 # vsftpd userlist
2 # If userlist_deny=NO, only allow users in this file
3 # If userlist_deny=YES (default), never allow users in this file, and
4 # do not even prompt for a password.
5 # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
6 # for users that are denied.
7 root
8 bin
9 daemon
10 adm
11 lp
12 sync
13 shutdown
14 halt
15 mail
16 news
17 uucp
18 operator
19 games
20 nobody
[root@linuxprobe ~]# cat /etc/vsftpd/ftpusers
# Users that are not allowed to login via ftp
1 root
2 bin
3 daemon
4 adm
5 lp
6 sync
7 shutdown
8 halt
9 mail
10 news
11 uucp
12 operator
13 games
14 nobody

vsftpd 服务程序为了保证服务器的安全性而默认禁止了root 管理员和大多数系统用户的登录行为,这样可以有效地避免黑客通过FTP 服务对root 管理员密码进行暴力破解。如果您确认在生产环境中使用root 管理员不会对系统安全产生影响,只需按照上面的提示删除掉root 用户名即可。
3、选择ftpusers 和user_list 文件中没有的一个普通用户尝试登录FTP 服务器:

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): linuxprobe
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Create directory operation failed.

在采用本地用户模式登录FTP 服务器后,默认访问的是该用户的家目录,也就是说,访问的是/home/linuxprobe 目录。而且该目录的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况。这时应是SELinux 配置的问题了,需要再次开启SELinux 域中对FTP 服务的允许策略:

[root@linuxprobe ~]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@linuxprobe ~]# setsebool -P ftpd_full_access=on

注意:
在实验课程和生产环境中设置SELinux域策略时,一定记得添加-P参数,否则服务器在重启后就会按照原有的策略进行控制,从而导致配置过的服务无法使用。
4、在配置妥当后再使用本地用户尝试登录下FTP 服务器,分别执行文件的创建、重命名及删除等命令。

[root@linuxprobe ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): linuxprobe
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/home/linuxprobe/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.

3、虚拟用户模式

安全性最强,配置流程也更复杂
1、创建用于进行FTP 认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。

[root@linuxprobe ~]# cd /etc/vsftpd/
[root@linuxprobe vsftpd]# vim vuser.list
zhangsan
redhat
lisi
redhat

使用db_load 命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低
数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。

[root@linuxprobe vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@linuxprobe vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@linuxprobe vsftpd]# chmod 600 vuser.db
[root@linuxprobe vsftpd]# rm -f vuser.list

2、创建vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP 服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
由于 Linux 系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux 系统无法处理虚拟用户所创建文件的属性权限
为了方便管理FTP 服务器上的数据,可以把这个系统本地用户的家目录设置为/var 目录(该目录用来存放经常发生改变的数据)。并且为了安全起见,我们将这个系统本地用户设置为不允许登录FTP 服务器,这不会影响虚拟用户登录,而且还可以避免黑客通过这个系统本地用户进行登录。

[root@linuxprobe ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@linuxprobe ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@linuxprobe ~]# chmod -Rf 755 /var/ftproot/

3、建立用于支持虚拟用户的PAM 文件。
通俗来讲,PAM 是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM 采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想。
新建一个用于虚拟用户认证的PAM 文件vsftpd.vu,其中PAM 文件内的“db=”参数为使用db_load 命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀:

[root@linuxprobe ~]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser

4、在vsftpd 服务程序的主配置文件中通过pam_service_name 参数将PAM 认证文件的名称修改为vsftpd.vu。该操作中用到的参数以及作用:
在这里插入图片描述
5、为虚拟用户设置不同的权限。比如,允许张三上传、创建、修改、查看、删除文件,只允许李四查看文件。这可以通过vsftpd 服务程序来实现。只需新建一个目录,在里面分别创建两个以zhangsan 和lisi 命名的文件,其中在名为zhangsan 的文件中写入允许的相关权限(使用匿名用户的参数):

[root@linuxprobe ~]# mkdir /etc/vsftpd/vusers_dir/
[root@linuxprobe ~]# cd /etc/vsftpd/vusers_dir/
[root@linuxprobe vusers_dir]# touch lisi
[root@linuxprobe vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

然后再次修改vsftpd 主配置文件,通过添加user_config_dir=/etc/vsftpd/vusers_dir来定义这两个虚拟用户不同权限的配置文件所存放的路径。为了让修改后的参数立即生效,需要重启vsftpd 服务程序并将该服务添加到开机启动项中。
6、设置SELinux 域允许策略,然后使用虚拟用户模式登录FTP 服务器。
7、分别使用账户zhangsan和lisi 来检验他们的权限。

11.3 简单文件传输协议

简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于UDP 协议在客户端和服务器之间进行简单文件传输的协议。顾名思义,它提供不复杂、开销不大的文件传输服务(可将其当作FTP 协议的简化版本)。

TFTP 的命令功能不如FTP 服务强大,甚至不能遍历目录,在安全性方面也弱于FTP服务。而且,由于TFTP 在传输文件时采用的是UDP 协议,占用的端口号为69,因此文件的传输过程也不像FTP 协议那样可靠。但是,因为TFTP 不需要客户端的权限认证,也就减少了无谓的系统和网络带宽消耗,因此在传输琐碎(trivial)不大的文件时,效率更高。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值