ftp服务器

文章目录

  • FTP:
      • FTP协议的特点
      • 工作模式
  • 配置匿名用户ftp
  • ftp本地用户访问
  • 虚拟用户配置如下:

FTP:

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:“下载”(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。

FTP协议的特点

1、提供交互式的访问,使得用户更容易通过 操作命令与远程系统交互;
  2、允许客户指定存储文件的类型与格式;
  3、具备鉴别控制能力,允许文件具有存取权 限;
  4、屏蔽了计算机系统的细节,因而适合于在 异构网络中任意计算机之间传送文件。
优点
1、完全基于网络,具有网络文件的上传与下载特性。如支持断点续传,不受工作组与IP地址限制等。

2、拥有完善的用户权限管理系统,比起网络共享来说,可以详细设置每个用户的权限。如只能上传,不能修改或删除等

3、安全性高,可以进行数据的加密传输。更好保护个人隐私。
缺点
与网络共享比起来:
使用上感觉不如网络共享方便,网络共享的文件可以像本地文件一样使用。而FTP必须是下载下来才能使用。

工作模式

主动模式(PORT)
如下图所示,用户主机直接暴露在互联网中,用户连接FTP SERVER使用主动模式遵循以下一个过程:
ftp服务器_第1张图片

ftp主动连接

用户主机一个随机端口连接FTP SERVER的TCP21端口进行协商;
用户主机告诉FTP SERVER,我的XXXX端口已经打开,你可以放心大胆的连过来;
然后FTP SERVER就用TCP20端口连接用户主机的XXXX端口,数据传输开始。

被动模式(PASV)
当用户主机前端多了一道防火墙(客户机使用地址转换接入互联网),事情就变的复杂了,首先,主动模式是FTP SERVER连接客户机,防火墙肯定不干;即便乐意干客户机与服务器协商的XXXX端口也是随机端口,你让迷茫的防火墙情何以堪,这时就需要客户端软件使用被动模式主动连接防火墙,这么一来正合防火墙的胃口。
ftp服务器_第2张图片

客户端使用被动模式遵循以下过程:
ftp被动连接

首先用户使用随机端口连接FTP SERVER的TCP 21端口进行协商;
FTP SERVER告诉客户机:我的XXXX端口开放了,你连过来吧;
客户机使用一个随机端口连接FTP SERVER的XXXX端口传输数据。

可以看出,当不存在防火墙的情况下,主动模式和被动模式均适用,但就服务器安全方面考虑,使用主动模式为佳,因为多一个被动连接服务器就要打多开一个端口,开放的端口越多,就意味着服务器面临的危险越大。

配置匿名用户ftp

服务基础环境准备,关闭防火墙和selinux

主机名 操作系统 ip地址
ftp-server rhel 7 192.168.118.100
ftp-client rhel 7 192.168.118.128
服务端
[root@localhost ~]# hostnamectl set-hostname ftp-server  #更改主机名
[root@localhost ~]# bash
[root@ftp-server ~]# uname -r
3.10.0-693.el7.x86_64
[root@ftp-server ~]# cat /etc/redhat-release   #查看系统版本
Red Hat Enterprise Linux Server release 7.4 (Maipo)
[root@ftp-server ~]# systemctl stop firewalld.service   #关闭防火墙 
[root@ftp-server ~]# setenforce 0           #关闭selinux

客户端

[root@localhost ~]# hostnamectl set-hostname ftp-client
[root@localhost ~]# bash
[root@ftp-client ~]# systemctl stop firewalld
[root@ftp-client ~]# setenforce 0
setenforce: SELinux is disabled

安装vsftpd

[root@ftp-server ~]# yum -y install vsftpd

启动ftp服务并加入开机自启

[root@ftp-server ~]# systemctl enable vsftpd

[root@ftp-server ~]# systemctl start vsftpd

修改vsftpd主配置文件

[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf
#启动匿名用户、允许上传和创建文件权限
anonymous_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES

修改默认ftp共享⽬目录站点权限,最后重新加载vsftpd服务

[root@ftp-server ~]# chmod -R 777 /var/ftp/
[root@ftp-server ~]# systemctl restart vsftpd

Linux下使⽤用lftp客户端⼯工具访问vsftpd服务验证,安装此⼯工具

[root@ftp-server ~]# yum install lftp -y

使⽤用匿匿名⽤用户登录vsftpd

[root@ftp-client ~]# lftp 192.168.118.100
lftp 192.168.118.100:~> ls
ls: 登录失败: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

问题出现:登录失败!创建文件失败!上传文件失败!删除文件失败!的解决方法
原因及解决方法

#当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误:

500 OOPS: vsftpd: refusing to run with writable root inside chroot ()

这是由于下面的更新造成的:

  • Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite people who carelessly turned on chroot_local_user but such is life.

从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
 要修复这个错误,可以用命令chmod a-w /var/ftp/去除用户主目录的写权限
[root@ftp-server ~]# chmod a-w /var/ftp/
[root@ftp-server ~]# systemctl restart vsftpd
再次检测
[root@ftp-client ~]# lftp 192.168.118.100
lftp 192.168.118.100:~> ls
drwxrwxrwx    2 0        0               6 Aug 03  2017 pub
#可以看到服务端/var/ftp里面的内容了

新建文件夹试试


lftp 192.168.118.100:/> mkdir lala
mkdir: Access failed: 550 Create directory operation failed. (lala)
#可以看到无法新建lala这个目录,是不是由于权限不够,我们试着给文件写的权限
[root@ftp-server ~]# chmod o+w /var/ftp
#再次新建lala
lftp 192.168.118.100:/> mkdir lala
mkdir 成功, 建立 `lala'
#成功

切换目录

lftp 192.168.118.100:/> lcd /etc
lcd 成功, 本地目录=/etc

试试上传文件能不能成功

lftp 192.168.118.100:/> put inittab 
put: Access failed: 553 Could not create file. (inittab)
#不能上传文件,可能是selinux的问题
[root@ftp-server ~]# getsebool -a |grep ftp
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
tftp_anon_write --> off
tftp_home_dir --> off
#可以看到,允许匿名用户上传的给关闭的了。

#现在我们设置布尔值
[root@ftp-server ~]# setsebool -P allow_ftpd_anon_write=1
[root@ftp-server ~]# getsebool -a |grep allow_ftpd_anon
[root@ftp-server ~]# getsebool -a |grep ftp
ftpd_anon_write --> on
# OK,允许匿名用户的上传就给打开了。
#但是还有一点,/var/ftp/pub的context值是不正确的,
#现在我们必须调整这个/var/ftp/pub目录的context值。
[root@ftp-server ~]# ls -ldZ /var/ftp/pub/
drwxrwxrwx. root root system_u:object_r:public_content_t:s0 /var/ftp/pub/
[root@ftp-server ~]# chcon -R -t public_content_rw_t /var/ftp/pub/
[root@ftp-server ~]# ls -ldZ /var/ftp/pub/
drwxrwxrwx. root root system_u:object_r:public_content_rw_t:s0 /var/ftp/pub/

#Selinux的问题就解决了,现在我们再来上传文件
lftp 192.168.118.100:/> ls
drwx------    2 14       50              6 Sep 12 14:28 lala
drwxrwxrwx    2 0        0               6 Aug 03  2017 pub
lftp 192.168.118.100:/> cd pub/
lftp 192.168.118.100:/pub> ls inittab
lftp 192.168.118.100:/pub> put /etc/inittab 
491 bytes transferred
lftp 192.168.118.100:/pub> ls
-rw-------    1 14       50            491 Sep 12 14:44 inittab

# OK,到目前为止,我们的匿名用户就可以上传文件了。

 

总结,开放匿名用户的上传文件的权限的解决方法

1,开启目录自身的权限

2,开启服务控制的权限

3,解决selinux的问题

试试删除文件

lftp 192.168.118.100:/pub> rm inittab 
rm: Access failed: 550 Permission denied. (inittab)
#没有删除文件的权限

ftp本地用户访问

本地用户访问ftp服务,新建用户ftp_test

[root@ftp-server ~]# useradd ftp_test
[root@ftp-server ~]# echo "123"|passwd --stdin ftp_test
更改用户 ftp_test 的密码 。
passwd:所有的身份验证令牌已经成功更新。

客户端验证

[root@ftp-client ~]# lftp 192.168.118.100
lftp 192.168.118.100:~> login ftp_test 123
lftp [email protected]:~> mkdir ftp
mkdir 成功, 建立 `ftp'               
服务端查看
[root@ftp-server ~]# ls /home/ftp_test/
ftp

锁定所有本地⽤用户只能在⾃自⼰己的家⽬目录操作

chroot_local_user=YES   #在配置文件里面加入此条  

虚拟用户配置如下:

创建文本格式的用户名,密码列表,例添加两个用户tom,jerry,密码为123,456

[root@ftp-server ~]# touch /etc/vsftpd/vu.list
[root@ftp-server ~]# echo 'tom' >> /etc/vsftpd/vu.list
[root@ftp-server ~]# echo '123' >> /etc/vsftpd/vu.list
[root@ftp-server ~]# echo 'jerry' >> /etc/vsftpd/vu.list
[root@ftp-server ~]# echo '456' >> /etc/vsftpd/vu.list
[root@ftp-server ~]# cat /etc/vsftpd/vu.list
tom
123
jerry
456
用户名和密码一一对应,前面是账号,后面跟密码

安装db4工具

[root@ftp-server ~]# yum -y install db4*

将刚创建的文本格式的用户名,密码文件使用db4工具转换为数据库文件

[root@ftp-server ~]# db_load -T -t hash -f /etc/vsftpd/vu.list /etc/vsftpd/vu.db

为提高虚拟用户账号文件的安全性,应将文件权限设置为600,以避免数据外泄

[root@ftp-server ~]# chmod 600 /etc/vsftpd/vu.*
[root@ftp-server ~]#  ll /etc/vsftpd/vu.*
-rw-------. 1 root root 12288 9月  13 02:38 /etc/vsftpd/vu.db
-rw-------. 1 root root    18 9月  13 02:37 /etc/vsftpd/vu.list

添加虚拟用户的映射账号,创建ftp目录,例如要将使用的ftp根目录设置为/var/ftproot,映射账号的名称为vftp,可以执行以下操作

[root@ftp-server ~]#  useradd -d /var/ftproot -s /sbin/nologin vftp
[root@ftp-server ~]# chmod 755 /var/ftproot/
[root@ftp-server ~]#  ll -d /var/ftproot/
drwxr-xr-x. 3 vftp vftp 78 9月  13 02:39 /var/ftproot/

为虚拟用户建立PAM认证

[root@ftp-server ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
[root@ftp-server ~]# vim /etc/pam.d/vsftpd
#将配置文件内容全部删除,只留3行内容
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vu
account required pam_userdb.so db=/etc/vsftpd/vu

修改vsftpd配置文件,添加虚拟用户支持

[root@ftp-server ~]# echo 'guest_enable=YES' >> /etc/vsftpd/vsftpd.conf
[root@ftp-server ~]# echo 'guest_username=vftp' >> /etc/vsftpd/vsftpd.conf

为不同的虚拟用户建立独立的配置文件

[root@ftp-server ~]# echo 'user_config_dir=/etc/vsftpd/vusers_dir' >> /etc/vsftpd//vsftpd.conf 
[root@ftp-server ~]# echo 'allow_writeable_chroot=YES' >> /etc/vsftpd/vsftpd.conf 
#有了这些配置之后,就可以在/etc/vsftpd/vusers_dir目录中为没个虚拟用户分别建立配置文件了

设置tom用户能够上传文件,创建目录

[root@ftp-server ~]# mkdir /etc/vsftpd/vusers_dir
[root@ftp-server ~]# ll /etc/vsftpd/
总用量 40
-rw-------. 1 root root   125 8月   3 2017 ftpusers
-rw-------. 1 root root   361 8月   3 2017 user_list
-rw-r--r--. 1 root root    27 9月  13 02:41 vsftpd.
-rw-------. 1 root root  5133 9月  13 02:42 vsftpd.conf
-rwxr--r--. 1 root root   338 8月   3 2017 vsftpd_conf_migrate.sh
-rw-------. 1 root root 12288 9月  13 02:38 vu.db
-rw-------. 1 root root    18 9月  13 02:37 vu.list
drwxr-xr-x. 2 root root     6 9月  13 02:42 vusers_dir
[root@ftp-server ~]# echo 'anon_upload_enable=YES' >> /etc/vsftpd/vusers_dir/tom
[root@ftp-server ~]# echo 'anon_mkdir_write_enable=YES' >> /etc/vsftpd/vusers_dir/tom 

重启服务

[root@ftp-server ~]# systemctl restart vsftpd

客户端验证tom权限

[root@ftp-client ~]# lftp 192.168.118.128
lftp 192.168.118.128:~> login tom 123     #登录到tom用户

lftp [email protected]:/> mkdir aa      #创建文件aa成功
mkdir 成功, 建立 `aa'
lftp [email protected]:/> ls
drwx------    2 1001     1001            6 Sep 13 03:04 aa
lftp [email protected]:/> rm aa        #不能删除文件aa,没有删除权限
rm: Access failed: 550 Permission denied. (aa)
lftp [email protected]:/> put /etc/inittab   #上传文件inittab成功
491 bytes transferred
lftp [email protected]:/> ls
drwx------    2 1001     1001            6 Sep 13 03:04 aa
-rw-------    1 1001     1001          491 Sep 13 03:11 inittab
lftp [email protected]:/> get TeamViewer_Setup-13.1.3629.0.exe
20367104 bytes transferred          #下载文件成功

服务端设置jerry用户的默认下载权限,创建jerry的空文件

[root@ftp-server ~]# touch /etc/vsftpd/vusers_dir/jerry

客户端验证

[root@ftp-client ~]# lftp -u jerry,456 192.168.118.100                                 #登录虚拟用户jerry
lftp [email protected]:~> ls
-rw-r--r--    1 0        0        20367104 Aug 30 13:02 TeamViewer_Setup-13.1.3629.0.exe
drwx------    2 1001     1001            6 Sep 13 03:04 aa
-rw-------    1 1001     1001          491 Sep 13 03:11 inittab
lftp [email protected]:/> mkdir haha    #没有创建文件的权限,创建失败
mkdir: Access failed: 550 Permission denied. (haha)
lftp [email protected]:/> get TeamViewer_Setup-13.1.3629.0.exe
20367104 bytes transferred     #下载文件成功                           

你可能感兴趣的:(运维)