linux环境:FTP服务器搭建

转载及参考至:https://www.linuxprobe.com/chapter-11.html

       https://www.cnblogs.com/lxwphp/p/8916664.html

感谢原作者的分享。

1 文件传输协议

一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式。今天的互联网是由几千万台个人计算机、工作站、服务器、小型机、大型机、巨型机等具有不同型号、不同架构的物理设备共同组成的,而且即便是个人计算机,也可能会装有Windows、Linux、UNIX、Mac等不同的操作系统。为了能够在如此复杂多样的设备之间解决问题解决文件传输问题,文件传输协议(FTP)应运而生。

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

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

主动模式:FTP服务器主动向客户端发起连接请求。

被动模式:FTP服务器等待客户端发起连接请求(FTP的默认工作模式)。

(防火墙一般是用于过滤从外网进入内网的流量,因此有些时候需要将FTP的工作模式设置为主动模式,才可以传输数据。本文中使用的是被动模式)

2 Vsftpd服务程序

vsftpd作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到FTP服务器上。

匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。

本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。

虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

ftp是Linux系统中以命令行界面的方式来管理FTP传输服务的客户端工具。我们首先手动安装这个ftp客户端工具,以便在后续实验中查看结果。

FTP安装 及服务开启、重启、关闭

首先检查一下你的远程服务器是否已经安装了FTP服务。

#rpm -qa | grep vsftpd
 

如果啥都没显示,恭喜你,没有安装ftp服务,你可以安心安装。

运行下面的命令就可以完成vsftpd的安装

#yum -y install vsftpd

安装提示:

[root@linuxprobe ~]# yum install vsftpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
================================================================================
 Package Arch Version Repository Size
================================================================================
Installing:
 vsftpd x86_64 3.0.2-9.el7 rhel 166 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 166 k
Installed size: 343 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
 Installing : vsftpd-3.0.2-9.el7.x86_64 1/1 
 Verifying : vsftpd-3.0.2-9.el7.x86_64 1/1 
Installed:
 vsftpd.x86_64 0:3.0.2-9.el7 
Complete!
View Code

安装完成再次利用上面的rpm命令检查一下是否完成安装,如果完成安装,那就可以继续。

vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)内容总长度达到123行,但其中大多数参数在开头都添加了井号(#),从而成为注释信息。

 vsftpd服务程序常用的参数以及作用如下

参数                                作用
listen=[YES|NO]              是否以独立运行的方式监听服务
listen_address=IP地址        设置要监听的IP地址
listen_port=21               设置FTP服务的监听端口
download_enable=[YES|NO]    是否允许下载文件
userlist_enable=[YES|NO]     设置用户列表为“允许”还是“禁止”操作
userlist_deny=[YES|NO]      设置用户列表为“允许”还是“禁止”操作
max_clients=0                最大客户端连接数,0为不限制
max_per_ip=0                 同一IP地址的最大连接数,0为不限制
anonymous_enable=[YES|NO]    是否允许匿名用户访问
anon_upload_enable=[YES|NO]  是否允许匿名用户上传文件
anon_umask=022               匿名用户上传文件的umask值
anon_root=/var/ftp           匿名用户的FTP根目录
anon_mkdir_write_enable=[YES|NO]    是否允许匿名用户创建目录
anon_other_write_enable=[YES|NO]    是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限)
anon_max_rate=0                     匿名用户的最大传输速率(字节/秒),0为不限制
local_enable=[YES|NO]               是否允许本地用户登录FTP
local_umask=022                     本地用户上传文件的umask值
local_root=/var/ftp                 本地用户的FTP根目录
chroot_local_user=[YES|NO]          是否将用户权限禁锢在FTP目录,以确保安全
local_max_rate=0                    本地用户最大传输速率(字节/秒),0为不限制

开启vsftpd服务

#service vsftpd start

#在centos 中使用 systemctl start vsftpd(我觉得上面的也可以)

检查vsftpd服务

#service vsftpd status

注意:关于防火墙的问题

CentOS7.0版本的linux系统的防火墙是firewalld,其他版本的可能是iptables(没有去确认)。

我这里装的时候把防火墙给永久关闭了。

firewalld防火墙关闭代码

关闭防火墙

 systemctl stop firewalld.service

永久禁止防火墙

systemctl disable firewalld.service

检查防火墙状态

systemctl status firewalld.service

提示:Active: inactive (dead)就表示关闭了。

iptables防火墙关闭代码

查询防火墙状态    :    [root@localhost ~]# service   iptables status
停止防火墙   :            [root@localhost ~]# service   iptables stop
启动防火墙   :            [root@localhost ~]# service   iptables start
重启防火墙   :            [root@localhost ~]# service   iptables restart
永久关闭防火墙    :    [root@localhost ~]# chkconfig   iptables off
永久关闭后启用    :    [root@localhost ~]# chkconfig   iptables on

特别注意:不要卸载iptables防火墙,否则你会有大麻烦

如果因工作需求,无法关闭iptables防火墙,需要在iptables防火墙规则里添加FTP端口号:

(iptables防火墙)添加下面的代码到/etc/sysconfig/iptables里去。

(firewalld)添加下面的代码到/etc/sysconfig/firewalld里去。

-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT

重启防火墙服务

#systemctl restart iptables.service

3.1 匿名访问模式

前文提到,在vsftpd服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都可以无需密码验证而直接登录到FTP服务器。这种模式一般用来访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。当然,如果采用第8章中介绍的防火墙管理工具(如Tcp_wrappers服务程序)将vsftpd服务程序允许访问的主机范围设置为企业内网,也可以提供基本的安全性。

vsftpd服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。需要注意的是,针对匿名用户放开这些权限会带来潜在危险,我们只是为了在Linux系统中练习配置vsftpd服务程序而放开了这些权限,不建议在生产环境中如此行事。表11-2罗列了可以向匿名用户开放的权限参数以及作用。

可以向匿名用户开放的权限参数以及作用

参数    作用
anonymous_enable=YES    允许匿名访问模式
anon_umask=022    匿名用户上传文件的umask值
anon_upload_enable=YES    允许匿名用户上传文件
anon_mkdir_write_enable=YES    允许匿名用户创建目录
anon_other_write_enable=YES    允许匿名用户修改目录名称或删除目录

快捷方法:直接向vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)中添加下面的配置参数,原本的参数都删了。

[root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
1 anonymous_enable=YES
2 anon_umask=022
3 anon_upload_enable=YES
4 anon_mkdir_write_enable=YES
5 anon_other_write_enable=YES
6 local_enable=YES
7 write_enable=YES
8 local_umask=022
9 dirmessage_enable=YES
10 xferlog_enable=YES
11 connect_from_port_20=YES
12 xferlog_std_format=YES
13 listen=NO
14 listen_ipv6=YES
15 pam_service_name=vsftpd
16 userlist_enable=YES
17 tcp_wrappers=YES

然后重启FTP服务。

[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

测试:现在就可以在客户端执行ftp命令连接到远程的FTP服务器了。在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空。而且在连接到FTP服务器后,默认访问的是/var/ftp/pub目录。我们可以切换到该目录下的pub目录中,然后尝试创建一个新的目录文件,以检验是否拥有写入权限:

[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): anonymous
331 Please specify the password.
Password:此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Permission denied.

系统显示拒绝创建目录,查看该目录的权限得知,只有root管理员才有写入权限。怪不得系统会拒绝操作呢!进入到/var/ftp/pub目录下,右键--属性--权限,将其他类的访问权限改为“创建和删除”,即可通过FTP在该目录下创建文件夹、上传、下载,更改文件名等操作。

如果还不行,系统提示“创建目录的操作失败”(Create directory operation failed),那就是SELinux服务在“捣乱”了吧。

下面使用getsebool命令查看与FTP相关的SELinux域策略都有哪些:

[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

我们可以根据经验(需要长期培养,别无它法)和策略的名称判断出是ftpd_full_access--> off策略规则导致了操作失败。接下来修改该策略规则,并且在设置时使用-P参数让修改过的策略永久生效,确保在服务器重启后依然能够顺利写入文件。

[root@linuxprobe ~]# setsebool -P ftpd_full_access=on
 
或:关闭SELinux
# vi /etc/selinux/config
将 SELINUX=XXX -->XXX 代表级别
改为
SELINUX=disabled

然后重启系统,或者执行命令:setenforce 0。

现在便可以顺利执行文件创建、修改及删除等操作了。

[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): anonymous
331 Please specify the password.
Password:此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> bye
221 Goodbye.

3..2 本地用户模式

相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单。如果大家之前用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。针对本地用户模式的权限参数以及作用如表11-3所示。

表11-3                                   本地用户模式使用的权限参数以及作用

参数                        作用
anonymous_enable=NO    禁止匿名访问模式
local_enable=YES    允许本地用户模式
write_enable=YES    设置可写权限
local_umask=022    本地用户模式创建文件的umask值
userlist_deny=YES    启用“禁止用户名单”,名单文件为ftpusers和user_list
userlist_enable=YES    开启用户作用名单文件功能

快捷方法:直接向vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)中添加下面的配置参数,原本的参数都删了。

[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

在vsftpd服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启vsftpd服务程序,让新的配置参数生效。在执行完上一个实验后还原了虚拟机的读者,还需要将配置好的服务添加到开机启动项中,以便在系统重启自后依然可以正常使用vsftpd服务。

[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

按理来讲,现在已经完全可以本地用户的身份登录FTP服务器了。但是在使用root管理员登录后,系统提示如下的错误信息:

[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)。不知道大家是否已看过一部日本电影“死亡笔记”(刘遄老师在上学期间的最爱),里面就提到有一个黑色封皮的小本子,只要将别人的名字写进去,这人就会挂掉。vsftpd服务程序目录中的这两个文件也有类似的功能—只要里面写有某位用户的名字,就不再允许这位用户登录到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用户名即可。我们也可以选择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目录(系统创建的用户,在home文件夹下都有对应用户名的文件夹)。而且该目录的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况。如果读写权限没给,手动设定,给读写权限。但是当前的操作仍然被拒绝,是因为我们刚才将虚拟机系统还原到最初的状态了。为此,需要再次开启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参数,否则服务器在重启后就会按照原有的策略进行控制,从而导致配置过的服务无法使用。

在配置妥当后再使用本地用户尝试登录下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> bye
221 Goodbye.

3.3 虚拟用户模式

 待定

猜你喜欢

转载自www.cnblogs.com/guohongwei/p/10848698.html