运维基础-存储02 FTP

1、FTP协议

1、FTP协议简介

  • FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一。
  • FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。
  • FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
  • 默认情况下FTP协议使用TCP端口中的20和21这两个端口,其中20用于传输数据,21用于传输控制信息。

2、FTP两种工作方式

  • 一个客户端和服务器之间,只会有一个命令连接,但可能会有多个数据连接。
    • 命令连接:传输命令。命令连接会一直在,直到客户端断开连接。
    • 数据连接:传输数据。每个数据连接就是一次数据传输,数据传输完成该连接随即断开。

1、主动模式(PORT)

  1. 主动模式下,客户端随机打开一个大于1024的端口N向服务器的21端口发起连接,同时开放N+1端口,并向服务器发出“port N+1”命令。
  2. 由服务器的20端口主动连接到客户端N+1端口。
  • 注意:FTP的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻止。

2、被动模式(PASV)

  1. 被动模式下,客户端打开两个随机端口N和N+1(N>1024)。
  2. 客户端的N端口连接服务器的21端口,提交PASV命令。
  3. 然后,服务器会开启一个随机端口P(P>1024),返回如“227 entering passive mode(127,0,0,1,4,18)”。它返回了227开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘256再加上最后一个数字,这就是FTP服务器开放的用来进行数据传输的端口。
  4. 客户端收到命令并取得服务器的数据端口P之后,会通过N+1端口连接服务器的P端口,然后在两个端口之间进行数据传输。

3、配置主动、被动模式

  • 在linux上,如果不配置pasv_enable=NO,默认是被动模式。
###编辑/etc/vsftpd/vsftpd.conf

#主动模式(active)
pasv_enable=NO              #passive模式关闭
port_enable=YES             #active模式开启
connect_from_port_20=YES    #即默认情况下,FTP PORT主动模式进行数据传输时使用20端口(ftp-data)

#被动模式(passive)
pasv_enable=YES
pasv_min_port=3000  
pasv_max_port=4000          #设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界

3、FTP的协议实现

  • FTP协议是C/S架构。

1、服务端应用

  • Windows:Serv-U、IIS、FileZilla等。
  • 开源:WU-ftpd、ProFTPD、Pure-FTPd、vsftpd等。

2、客户端应用

  • Windows:ftp、FileZilla、CuteFTP、FlashFXP等。
  • 开源:lftp、ftp、Filezilla、gftp等。

2、安装并启动vsftpd

  • vsftpd(Very Secure FTP daemon)是一个非常安全的FTP守护进程。它完全是从头开始写的。

1、部署环境

  • 软件版本
    • vsftpd-3.0.2-29.el7_9.x86_64
  • 系统环境
    • FTP服务端:192.168.248.130,CentOS Linux release 7.7.1908 (Core)
    • FTP客户端:192.168.248.131,CentOS Linux release 7.7.1908 (Core)
    • FTP客户端:192.168.248.1,windows10

2、FTP服务端

1、安装vsftpd(必须)

]# yum install vsftpd

2、停止防火墙和SELinux(必须)

]# systemctl stop firewalld.service       #停止防火墙
]# systemctl disable firewalld.service    #禁止防火墙开机自启

]# setenforce 0                           #禁用selinux,临时有效
]# vim /etc/selinux/config                #SELINUX=disabled,重启机器后生效。禁止selinux,永久生效

3、创建用户和配置目录

]# useradd ftpuser
]# echo "root"| passwd --stdin ftpuser

]# mkdir /home/ftpuser/{write,read}
]# chown ftpuser.ftpuser -R /home/ftpuser/            #修改目录的属主属组
]# chmod -w /home/ftpuser/
]# chmod -w /home/ftpuser/read/

]# ll -d /home/ftpuser/
dr-x------. 5 ftpuser ftpuser 103 8月  27 12:48 /home/ftpuser/
]# ll /home/ftpuser/
dr-xr-xr-x. 2 ftpuser ftpuser 6 8月  27 12:48 read     #只读
drwxr-xr-x. 2 ftpuser ftpuser 6 8月  27 12:48 write    #可读可写

4、配置vsftpd

  • 此配置只有ftpuser用户可以登录FTP,且将其禁锢在其家目录中。匿名用户也被禁用了。
  • 默认配置是所有普通用户都可以登录FTP,且不将其禁锢在其家目录。匿名用户也可以登录FTP。
]# vim /etc/vsftpd/vsftpd.conf
#全局写权限
write_enable=YES
#禁用匿名用户,默认不禁用
anonymous_enable=NO
#设置可以登录FTP的白名单,/etc/vsftpd/user_list。默认所有的普通用户都可以登录
userlist_enable=YES
userlist_deny=NO 
#禁锢/etc/vsftpd/chroot_list中的用户在其家目录中。默认所有可登录用户都不禁锢在其家目录
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

]# vim /etc/vsftpd/user_list      #可以登录FTP的白名单,只有在这个文件中的用户可以登录FTP
ftpuser

]# vim /etc/vsftpd/chroot_list    #禁锢其中的用户在其加目录中
ftpuser

5、启动vsftpd服务(必须)

  • 有两种启动方式
    • 独立守护进程(standalone):由服务进程自行监听套按字,并接收用户访问请求。
    • 瞬时守护进程(transient):由受托管方代为监听套按字,服务进程没有访问请求时不启动,当托管方收到访问请求时,才启动服务进程。
      • Centos6:xinetd独立守护进程, /etc/xinetd.d/。
      • Centos7:由systemd代为监听。
]# rpm -ql vsftpd
/usr/lib/systemd/system/vsftpd.service     #独立守护进程
/usr/lib/systemd/system/vsftpd.target      #瞬时守护进程
  • 启动服务
]# systemctl start vsftpd.service     #启动vsftpd服务

]# systemctl enable vsftpd.service    #开机自启

6、禁止FTP用户登录系统

]# which nologin
/usr/sbin/nologin

]# vim /etc/shells    #将/usr/sbin/nologin添加到最后

]# usermod -s /usr/sbin/nologin FTP_user

]# su – FTP_user      #测试登录FTP_user

3、FTP客户端

  • Windows:ftp、FileZilla、CuteFTP、FlashFXP等。
  • 开源:lftp、ftp、Filezilla、gftp等。

示例:linux客户端

]# yum install ftp

]# ftp 192.168.248.130
Name (192.168.248.130:root): ftpuser
Password:
230 Login successful.
ftp> ls
dr-xr-xr-x    2 1001     1001            6 Aug 27 04:48 read
drwxr-xr-x    2 1001     1001           29 Aug 27 04:58 write

3、vsftpd配置文件

1、vsftpd配置文件

  • vsftpd配置文件的路径:/etc/vsftpd/
    • /etc/vsftpd/vsftpd.conf:vsftpd的主配置文件
    • /etc/vsftpd/ftpusers:禁止文件中的用户登录FTP。默认使用
    • /etc/vsftpd/user_list:黑/白名单,禁止或只允许文件中的用户登录FTP。默认是黑名单
    • /etc/vsftpd/chroot_list:禁锢文件中的用户在其家目录中。默认不使用,需要显示配置
  • /etc/vsftpd/user_list和/etc/vsftpd/ftpusers共同作用,只有两个文件都允许登录时才能登录。

2、vsftpd主配置文件选项

  • vsftpd主配置文件的路径:/etc/vsftpd/vsftpd.conf
    • 主配置文件的说明:man vsftpd.conf
    • 配置选项:directive value          #注意:directive之前不能有多余字符。
    • 配置项的默认值,是该配置项被注释或没有时生效的值。
write_enable=YES                #是否拥有全局的写权限,默认yes。    #当write_enable=NO时,所有用户有且只有下载权限

###匿名用户
anonymous_enable=YES            #是否启用匿名用户,默认yes。    #禁用匿名用户,必须显示定义anonymous_enable=NO
#anon_world_readable_only=YES   #是否可以下载,默认yes
#anon_upload_enable=YES         #是否可以上传文件,默认no。当SELinux=enforcing检查SE bool allow_ftpd_anon_write, allow_ftpd_full_access
#anon_mkdir_write_enable=YES    #是否可以创建目录,默认no
#anon_other_write_enable=YES    #是否可以删除文件、目录和修改权限,默认no
#anon_umask=077                 #设定匿名用户上传文件的umask,默认为077

###本地用户
local_enable=YES                #是否启用本地用户,默认yes。当SELinux=enforcing检查 SE bool ftp_home_dir
local_umask=022                 #设定本地用户上传文件的umask,默认为077

###禁锢用户在其家目录中
#chroot_local_user=YES          #是否禁锢所有本地用户在其家目录中,默认no。禁锢需要事先去除用户对家目录的写权限。
#chroot_list_enable=YES         #是否禁锢chroot_list_file指定的列表文件中的用户在其家目录中,默认no。禁锢需要事先去除用户对家目录的写权限。
#chroot_list_file=/etc/vsftpd/chroot_list
 
###控制可登录vsftpd服务的用户列表
userlist_enable=YES             #启用/etc/vsftpd/user_list文件来控制可登录用户
#userlist_deny=YES              #默认yes。YES是黑名单,NO是白名单。    #名单是/etc/vsftpd/user_list。和下面文件共同作用
#/etc/vsftpd/ftpusers列在此文件中的用户都被禁止使用ftp服务。(#cat /etc/pam.d/vsftpd)
 
###传输日志
xferlog_enable=YES              #激活上传/下载日志。
xferlog_std_format=YES          #使用标准的ftpd xferlog格式保存日志文件。
#xferlog_file=/var/log/xferlog  #日志文件的位置。默认值/var/log/xferlog
 
###监听套接字
listen=NO                       #vsftpd以独立模式运行并监听IPv4套接字。不能与listen_ipv6指令同时使用。
listen_ipv6=YES                 #允许监听IPv6套接字。默认情况下,监听IPv6的“any”地址(::)将接受来自IPv6和IPv4客户端的连接。
 
###并发连接数限制
#max_clients=2000               #限制并发的客户端个数
#max_per_ip=50                 #限制每个客户机IP的并发连接数
 
###上传下载速率
#anon_max_rate=0                #匿名最大速度(字节/秒)
#local_max_rate=0               #本地用户最大速率(字节/秒)
 
###超时时间
#idle_session_timeout=600       #空闲会话超时的默认值。
#data_connection_timeout=120    #数据连接超时的默认值。
 
#如果您愿意,您可以安排将上传的匿名文件由不同的用户拥有。注意!不推荐使用“root”上传文件!
#chown_uploads=YES
#chown_username=whoever

###安全
pam_service_name=vsftpd          #登录FTP服务器的时候进行认证是根据/etc/pam.d/vsftpd文件定义的内容进行
tcp_wrappers=YES                 #对有状态连接的特定服务进行安全检测并实现访问控制
#nopriv_user=ftpsecure           #建议您在系统上定义一个唯一的用户,ftp服务器可以将其作为完全隔离的非特权用户使用。

#ls_recurse_enable=YES           #激活内置ls的“-R”选项。这在默认情况下是禁用的
dirmessage_enable=YES            #激活目录消息-当远程用户进入某个目录时,发送给他们的消息。
connect_from_port_20=YES         #确保端口传输连接来自端口20 (ftp-data)。
#ftpd_banner=Welcome to blah FTP service.    #自定义登录横幅字符串

4、vsftpd认证和虚拟用户

1、vsftpd认证

  • vsftpd将认证功能托管给PAM模块。
  • PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
~]# ldd /usr/sbin/vsftpd                                      #用于打印程序或者共享库文件所依赖的共享库列表。
    ....
    libpam.so.0 => /lib64/libpam.so.0 (0x00007f8514c23000)    #可以看的出vsftpd调用pam进行认证
    ...

]# cat /etc/pam.d/vsftpd
]# cat /etc/pam.d/password-auth

pam_unix.so模块通过读取/etc/passwd和shadow进行认证,默认情况所有操作系统的普通用户都可以登录FTP。
  • FTP协议是明文的,即使用明文传输数据,因此FTP协议是不安全。可以在FTP数据经过的结点获取其账号和密码,所以不能使用任何系统用户去登陆FTP。

2、vsftpd的虚拟用户

  • ftp有三种用户:匿名用户、系统用户、虚拟用户。
    • 在三种用户模式中,虚拟用户是最安全的。
  • 虚拟用户:非系统用户,用户账号是不能登录操作系统的用户账号(认证不使用/etc/passwd)。
  • 虚拟用户可以将用户账号存储于MySQL、Redis、文件等。
  • vsftpd服务在认证的时候调用PAM模块,由PAM模块去查看存储的账号信息进行账号认证操作。

1、安装mariadb-server

]# yum install mariadb-server

2、安装 pam-mysql模块

  • centos6自带有PAM模块,不需要安装
  • centos7没有PAM模块,需要安装
]# yum install mariadb-devel pam-devel                                   #安装编译软件的开发环境
]# yum groupinstall "Development Tools" "Server Platform Development"    #安装开发环境
]# tar zvfx pam_mysql-0.7RC1.tar.gz
]# cd pam_mysql-0.7RC1/
]# ./configure --with-pam=/usr --with-mysal=/usr --with-pam-mods-dir=/usr/lib64/security
]# make && make instal
]# ls /usr/lib64/security | grep mysql                                    #生成pam_mysql.so模块

3、ftp使用虚拟用户做认证的步骤

  1. 将虚拟用户映射成来宾用户(虚拟用户映射到的本地(系统)用户,即来宾用户就是本地用户)
  2. 在vsftpd配置文件中启用来宾用户,并指明PAM认证文件

4、创建虚拟用户

  • 启动mysql
]# vim /etc/my.cnf
    skip-name-resolve=ON
    innodb_file_per_table=ON
]# systemctl start mariadb.service
  • 创建虚拟用户
grant all on vsftpd.* to 'vsftpd'@'127.0.0.1' identified by 'vsftpd';   #创建数据库账号
create database vsftpd;                                                 #创建数据库
use vsftpd;
create table user(id int primary key auto_increment, name char(25) not null, passwd varchar(100) not null);
insert into user(name,passwd) values('tom',password('tom')),('jerry',password('jerry'));    #创建两个虚拟用户,tom和jerry

5、配置来宾用户,并指明PAM认证文件

  • 编辑/etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.vusers    #修改指令。指定PAM认证文件
guest_enable=YES                  #添加指令。启用来宾用户
guest_username=vuser              #添加指令。来宾用户(虚拟用户映射到的本地用户)
  • 编辑PAM认证文件/etc/pam.d/vsftpd.vusers
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=user usercolumn=name passwdcolumn=passwd crypt=2
account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=user usercolumn=name passwdcolumn=passwd crypt=2
  • 创建来宾用户
]# mkdir -p /ftp/vuser/pub
]# useradd -d  /ftp/vuser vuser

]# chown vuser.vuser -R /ftp/vuser/
]# chmod -w /ftp/vuser/              #虚拟用户也会禁锢在其家目录中,因此他不能对他的家目录有写权限

6、测试虚拟用户

#使用虚拟用户tom登录FTP
D:\ftp>ftp 192.168.248.130
用户(192.168.248.130:(none)): tom
密码:
230 Login successful.
ftp> pwd
257 "/"

#使用虚拟用户jerry登录FTP
D:\ftp>ftp 192.168.248.130
用户(192.168.248.130:(none)): jerry
密码:
230 Login successful.
ftp> pwd
257 "/"

7、设置虚拟用户的权限

  • 虚拟用户默认只有下载权限。
  • 虚拟用户权限设置的指令和匿名用户的一样。
  • 编辑配置文件/etc/vsftpd/vsftpd.conf
    • 在/etc/vsftod/vusers_config/目录下创建与虚拟用户同名的文件,文件内容就是虚拟用户的权限。
user_config_dir=/etc/vsftpd/vuser_config/    #添加指令。

示例:

  • 匿名用户tom拥有上传、创建目录的权限,且umask是022;
  • 匿名用户jerry拥有上传、删除的权限,且umask是默认值077。
]# mkdir /etc/vsftpd/vuser_config/

]# vim /etc/vsftpd/vuser_config/tom
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_umask=022

]# vim /etc/vsftpd/vuser_config/jerry
    anon_upload_enable=YES
    anon_other_write_enable=YES 

]# systemctl restart vsftpd.service

5、FTP的三种用户

1、匿名用户

  • 匿名用户其实也是本地用户:ftp
  • 匿名用户的家目录是/var/ftp,即匿名用户访问的是/var/ftp
  • 匿名用户默认被禁锢在其家目录中,因此其家目录不能有写权限。
  • 匿名登录FTP的时候,用户可以是ftp,也可以是anonymous,没有密码。

2、本地用户

  • 本地用户访问的是其在ftp服务器上的家目录
  • 本地用户默认没有被禁锢在其家目录中,需要显示设置。
  • 禁止本地用户访问FTP服务。因为FTP协议是明文,不安全。

3、虚拟用户

  • 虚拟用户访问的是其在ftp服务器上映射的本地用户的家目录
  • 虚拟用户不使用/etc/shadow存储用户信息,而是使用其他方式,例如mysql。
  • 虚拟用户最终也需要映射到一个本地用户上(即来宾用户)。所有的虚拟用户都映射到了同一个本地用户上,因此拥有同一个家目录。
  • 虚拟用户是FTP服务用户(用来访问FTP服务的),其用户信息没有存储在shadow中;来宾用户是本地用户,其用户信息存储在shadow中。
  • 虚拟用户默认被禁锢在其家目录中,因此其家目录不能有写权限。

6、登录FTP

  • 本地用户和虚拟用户的认证方式不同,因此他们一般不会同时存在。
  • FTP用户的权限受制于FTP服务的共享权限和文件系统的本地权限,因此FTP用户的真正权限是二者的交集

1、使用url登录FTP

  • 基本格式如下
ftp://username:password@HOST:PORT/PATH/

 示例:

#登录匿名用户
ftp://192.168.248.130:21/

#登录虚拟用户
ftp://tom@192.168.248.130:21/
ftp://jerry@192.168.248.130:21/

2、使用FTP客户端登录FTP

 1、windows使用FTP客户端(cmd)

  • 登录FTP时的命令选项
FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-A] [-w:windowsize] [host]

-v:禁止显示远程服务器响应。
-n:禁止在初始连接时自动登录。
-i:关闭多文件传输过程中的交互式提示。
-d:启用调试。显示客户机和服务器之间传递的全部ftp命令
-g:禁用文件名通配(请参阅GLOB命令)。
-s:filename:指定包含FTP命令的文本文件;命令在FTP启动后自动运行。
-a:在绑字数据连接时使用所有本地接口。
-A:匿名登录。
-w:windowsize:覆盖默认的传输缓冲区大小65535。
host:指定主机名称或要连接到的远程主机的IP地址。
  • ftp内置命令
ls    #查看远程文件
dir   #查看远程文件,相当于ls -l
!dir  #查看本地文件

pwd   #查看远程所在的目录

cd    #切换远程目录
lcd   #切换本地目录

put   #上传一个文件
mput  #上传多个文件


get   #下载一个文件
mget  #下载多个文件

示例:

#匿名登录
D:\ftp>ftp -A -v 192.168.248.130
对 root@DESKTOP-JL0L7FT 匿名登录成功
ftp> pwd
257 "/"

#虚拟用户登录
D:\ftp>ftp -v 192.168.248.130
用户(192.168.248.130:(none)): tom
密码:
ftp> pwd
257 "/"

2、linux使用FTP客户端

  • 登录FTP时的命令选项
ftp [-Apinegvtd] [hostname]

示例:

]# ftp 192.168.248.130
Name (192.168.248.130:root): tom          #虚拟用户登录
Password:                                 #输入密码

]# ftp 192.168.248.130
Name (192.168.248.130:root): ftp          #匿名用户登录
Password:                                 #没有密码,直接回车

]# ftp 192.168.248.130
Name (192.168.248.130:root): anonymous    #匿名用户登录
Password:                                 #没有密码,直接回车

2、Linux使用lftp客户端

#虚拟用户登录
lftp -u tom 192.168.248.130

#匿名用户登录
lftp -u ftp 192.168.248.130
lftp -u anonymous 192.168.248.130

vsftpd配置示例:

write_enable=YES

anonymous_enable=NO
anon_other_write_enable=YES
anon_umask=022

local_enable=YES
local_umask=000

chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list     #所有的用户

xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/xferlog

max_per_ip=800
max_clients=1500

listen=YES
connect_from_port_20=YES

idle_session_timeout=300
data_connection_timeout=300

dirmessage_enable=YES
pam_service_name=vsftpd

ftp_username=nobody
use_localtime=YES
allow_writeable_chroot=YES
pasv_promiscuous=YES

 

posted @ 2021-08-21 19:26  麦恒  阅读(322)  评论(0编辑  收藏  举报