码迷,mamicode.com
首页 > 其他好文 > 详细

VSFTP服务

时间:2020-09-14 18:50:47      阅读:36      评论:0      收藏:0      [点我收藏+]

标签:etc   res   本地   指定   修改   asc   验证过   rtu   oca   

VSFTP概述

FTP和VSFTP

FTP(File Transfer Protocol,文件传输协议)是应用层协议,基于传输层为用户服务,它们负责文件的明文传输。FTP具有极高的延时,并且不时地必需执行一些冗长的登陆进程。FTP一般运行在20和21两个端口:

  • 端口20:传输数据流,按需连接,用于上传下载数据
  • 端口21:传输控制流,持续连接,用于收发FTP命令

VSFTP(Very Secure FTP)是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,其安全特性为:

  • vsftp程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性
  • 任何需要执行较高权限的指令都需要上层程序的许可
  • ftp所需要使用的绝大多数命令都被整合到了vsftp中,基本不需要系统额外提供命令
  • 拥有chroot功能, 可以改变用户的根目录(FTP的默认登陆目录),限制用户只能在自己的家目录(修改用户的默认登陆目录)

 

VSFTP工作模式

FTP有两种联机模式:主动联机模式和被动联机模式,在命令通道建立成功后,由server主动连接client称为主动联机模式,由client主动连接server称为被动联机模式(站在server角度看是主动模式还是被动模式)。

主动联机模式

FTP客户端首先和服务器的TCP 21端口建立信号控制通道用来发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令,PORT命令包含了客户端使用哪个端口接收数据。在传输数据时,服务器端使用自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接来传输数据。

主动模式连接次数较少,验证过程较为简单,适合处理连接频繁但文件不大的场景。

技术图片

信号控制通道的建立过程

通过三次握手Client和Server成功建立信号控制通道,Client使用一个大于1024的随机端口去连接Server的21号端口。

  1. Client主动向Server的TCP 21端口发送联机请求,带有SYN标志
  2. Server响应Client的请求,建立等待联机的资源,并将一个带有SYN与确认ACK的封包回送给Client
  3. Client回应一个ACK封包给Server,至此三次握手完成,Client与Server联机建立成功

数据传输通道的建立过程

  1. Client启用另一个大于1024的端口并通过信号控制通道向Server发送该启用端口和要传输的数据或文件
  2. Server使用TCP 20端口连接到Client开放的大于1024的端口,该连接封包带有SYN标志
  3. Client响应Server,回应SYN/ACK封包
  4. Server回复ACK包,三次握手完成,数据传输通道建立,Server开始向Client传输数据

被动联机模式

FTP客户端首先和服务器的TCP 21端口建立信号控制通道用来发送命令,但是建立连接后客户端发送Pasv命令,服务器收到Pasv命令后打开一个临时端口(端口大于1023且小于65535)并通知客户端在这个端口上传输数据的请求,客户端连接FTP服务器的临时端口,FTP服务器将通过这个端口传输数据。

注意开放防火墙中FTP开放的数据连接端口。

技术图片

 为什么会出现被动联机模式?

Client与Server建立信号控制通道时不会出现问题。当Client需要进行数据传输时,Client开启一个大于1024的端口,并通过信号控制通道告知Server ,Server会主动使用20端口来连接Client。此时的Client的IP经过NAT转换,已经不再是自己的IP,Server连接会失败。

解决方案:

  • 启用Linux NAT主机的Iptables的相关模块:ip_conntrack_ftp和ip_nat_ftp两个模块可以通过检查NAT主机内的记录信息来解决NAT转换导致连接失败的问题
  • 被动连接模式:被动联机模式使得在建立数据传输信道时,不再是Server连接Client,而是Client主动连接Server

数据传输通道的建立过程

  1. Client通过信号控制通道给Server发送数据传输命令,并且启用另一个大于1024的端口,告知Server使用被动联机模式
  2. Server回包告知Client已经准备好的大于1024的端口
  3. Client使用大于1024的端口连接到Server大于1024的端口,该连接封包带有SYN标志
  4. Server响应Client,回复一个SYN/ACK封包
  5. Client回复ACK包,三次握手完成,数据传输通道建立

 

VSFTP传输模式

Linux的红帽发行版中VSFTP默认采用的是Binary模式,这样才能保证绝大多数文件传输后能正常使用。切换方式:在ftp>提示符下输入ascii即切换到ASCII模式,输入bin即切换到Binary模式。

Binary模式

不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等

ASCII模式

进行文本传输时,自动适应目标操作系统的结束符,如回车符等

 

VSFTP用户管理

依据不同的身份、角色和权限,FTP用户分为以下三类:

real user(本地用户验证)  

  • 账号名称:本地用户(/etc/passwd)
  • 账号密码:用户密码(/etc/shadow)
  • 工作目录:登录用户的宿主目录
  • 权限:最大权限(drwx------)

以实体用户作为FTP登入者身份时,系统默认没有针对实体用户进行限制,所以其可以针对整个文件系统进行任何他所具有权限的工作。因此如果FTP使用者未能保护密码而导致被入侵,那么整个Linux系统数据有可能被窃取,使用实体用户登录时建议:

  • 使用替代的FTP方案:可以使用其他方式代替开放的FTP服务,如SFTP也能达到传输文件的效果
  • 限制用户的能力,如chroot与/sbin/nologin等:使用实体用户登录系统需要让某些系统账号无法登入FTP,如bin、apache等,最简单的方法是通过PAM模块来处理,vsftpd软件默认可以通过/etc/vsftpd/ftpusers配置文件设置不允许具有登入FTP的账号

guest(虚拟用户验证)

  • 创建虚拟用户来代替本地用户,减少本地用户曝光率
  • 使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
  • 能够设置严格的权限(为每一个用户生成单独的配置文件)

虚拟用户验证需要人为创建、生成数据库文件,找一个系统用户作为虚拟用户的映射用户 ,借助系统用户的家目录为默认登陆点,默认登陆目录为/home/*,每一个虚拟用户的权限都可以单独设置。

anonymous(匿名用户验证)

  • 账号名称:ftp或anonymous
  • 账号密码:无密码
  • 工作目录:/var/ftp
  • 默认权限:默认可现在不可上传,上传权限由两部分组成(主配置文件和文件系统)

由于互联网上的每个人都可以下载数据,可能导致贷款被占用,提供匿名登录给互联网的使用者不是很安全,但是分享资源的时候FTP服务器是一个很好的解决方案。开放匿名用户时注意:

  • 不要将重要的资料放置在匿名者可以读取的公共目录中
  • 进行限制:减少允许的工作指令;限制文件传输的数量;限制匿名者同时登录的数量

 

VSFTP配置实验

VSFTP软件信息

  • 服务端软件名:vsftpd
  • 客户端软件吗:ftp
  • 服务名:vsftpd
  • 端口号:20、21、指定范围内随机端口
  • 配置文件:/etc/vsftpd/vsftpd.conf

匿名用户登录实验

匿名用户权限控制

  • anonymous_enable=YES    # 启用匿名访问
  • anon_umask=022    # 匿名用户上传文件的权限掩码
  • anon_root=/var/ftp    # 匿名用户的FTP根目录
  • anon_upload_enable=YES    # 允许上传文件
  • anon_mkdir_write_enable=YES    # 允许创建目录
  • anon_other_write_enable=YES    # 开放其他写入权限(删除、覆盖、重命名)
  • anon_max_rate=0    # 限制最大传输速率(0为不限速)

实现匿名用户登录

服务器端

[root@server ~]# yum install -y vsftpd 
[root@server ~]# systemctl enable vsftpd 
[root@server ~]# systemctl start  vsftpd 
[root@server ~]# cd /var/ftp/
[root@server ftp]# ls
pub
[root@server ftp]# touch hello.txt 

客户端

[root@client Desktop]# yum install -y ftp 
[root@client Desktop]# ftp 192.168.75.128
Connected to 192.168.75.128 (192.168.75.128).
220 (vsFTPd 3.0.2)
Name (192.168.75.128:root): ftp
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,75,128,56,11).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Sep 01 01:10 hello.txt
drwxr-xr-x    2 0        0               6 Jun 21  2018 pub
226 Directory send OK.

实现匿名用户可以上传

服务器端

anon_upload_enable=YES

[root@server ftp]# vim /etc/vsftpd/vsftpd.conf 
anon_upload_enable=YES

/var/ftp/目录下创建上传目录,修改上传目录权限或所有者,使得匿名用户有写入权限

[root@server ftp]# pwd 
/var/ftp
[root@server ftp]# mkdir upload 
[root@server ftp]# ll
total 0
-rw-r--r-- 1 root root 0 Sep  1 09:10 hello.txt
drwxr-xr-x 2 root root 6 Jun 21  2018 pub
drwxr-xr-x 2 root root 6 Sep  1 09:15 upload
[root@server ftp]# chmod o+w upload/
[root@server ftp]# ll
total 0
-rw-r--r-- 1 root root 0 Sep  1 09:10 hello.txt
drwxr-xr-x 2 root root 6 Jun 21  2018 pub
drwxr-xrwx 2 root root 6 Sep  1 09:15 upload

客户端

[root@client Desktop]# ftp 192.168.75.128
Connected to 192.168.75.128 (192.168.75.128).
220 (vsFTPd 3.0.2)
Name (192.168.75.128:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> pwd 
257 "/upload"
ftp> put test.txt 
local: test.txt remote: test.txt
227 Entering Passive Mode (192,168,75,128,150,109).
150 Ok to send data.
226 Transfer complete.

  ftp> ls
  227 Entering Passive Mode (192,168,75,128,121,206).
  150 Here comes the directory listing.
  -rw------- 1 14 50 0 Sep 01 01:20 test.txt
  226 Directory send OK.

实现上传的文件可下载

默认情况下开放上传权限后,上传的文件是无法被下载的,因为文件的其他人权限没有r权限,设置anon_umask=022,可以让上传的文件其他人位置拥有r权限,之后才能被他人下载。

服务器端

[root@server ftp]# vim /etc/vsftpd/vsftpd.conf 
anon_upload_enable=YES
anon_umask=022

[root@server ftp]# systemctl restart vsftpd 

客户端

[root@client Desktop]# ftp 192.168.75.128
Connected to 192.168.75.128 (192.168.75.128).
220 (vsFTPd 3.0.2)
Name (192.168.75.128:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> pwd
257 "/upload"
ftp> put test_download 
local: test_download remote: test_download
227 Entering Passive Mode (192,168,75,128,149,159).
150 Ok to send data.
226 Transfer complete.
ftp> ls 
227 Entering Passive Mode (192,168,75,128,86,73).
150 Here comes the directory listing.
-rw-------    1 14       50              0 Sep 01 01:20 test.txt
-rw-r--r--    1 14       50              0 Sep 01 01:27 test_download
226 Directory send OK.

本地用户登录实验

本地用户权限控制

  • local_enable=YES    # 是否启用本地系统用户
  • local_umask=022    # 本地用户所上传文件的权限掩码
  • local_root=/var/ftp    # 设置本地用户的FTP根目录
  • chroot_local_user=YES    # 是否将用户禁锢在主目录(如果不限制用户可以随意切换目录)
  • local_max_rate=0    # 限制最大传输速率
  • ftpd_banner=Welcome to blah FTP service    # 用户登录时显示的欢迎信息
  • userlist_enable=YES & userlist_deny=YES    # 禁止/etc/vsftpd/user_list文件中出现的用户名登录FTP
  • userlist_enable=YES & userlist_deny=NO    # 仅允许/etc/vsftpd/user_list文件中出现的用户名登录FTP
  • 配置文件:/etc/vsftpd/ftpusers    # 禁止/etc/vsftpd/ftpusers文件中出现的用户名登陆FTP,权限比user_list更高,即时生效

配置实验

  1. 服务端创建用户并设置密码(所创建的用户无需登录操作系统,仅用来登录VSFTP)
    [root@server ~]# useradd -r -s /sbin/nologin iamftp
    [root@server ~]# passwd iamftp 
  2. 将所有FTP用户禁锢在自己的家目录下,保护Linux操作系统不受FTP用户的破坏
    [root@server ~]# vim /etc/vsftpd/vsftpd.conf 
    chroot_local_user=YES

      [root@server ~]# systemctl restart vsftpd

  3. 将部分FTP用户禁锢在自己的家目录下(开启白名单功能,允许白名单中的用户随意切换目录)
    [root@server ~]# useradd -r -s /sbin/nologin iamftp
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
  4. 配置文件:/etc/vsftpd/ftpusers,所有写入该配置文件的用户都不允许登录FTP,即时生效,无需重启vsftpd服务
    [root@server ~]# vim /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
    ~                  
  5. 修改被动模式数据传输使用端口
    [root@server ~]# vim /etc/vsftpd/vsftpd.conf 
    pasv_enable=YES
    pasv_min_port=30000
    pasv_max_port=35000

虚拟用户登录实验

  1. 建立FTP的虚拟用户的用户数据库文件(/etc/vsftpd)

    [root@server ~]# cd /etc/vsftpd/
    [root@server vsftpd]# vim vsftpd.user    # 该文件名可以随便定义,文件内容格式:奇数行用户、偶数行密码
    test1
    123456
    test2
    123456
    test3
    123456
    ~     

    [root@server vsftpd]# db_load -T -t hash -f vsftpd.user vsftpd.db
    [root@server vsftpd]# ll
    total 36
    -rw------- 1 root root 125 Jun 21 2018 ftpusers
    -rw------- 1 root root 361 Jun 21 2018 user_list
    -rw------- 1 root root 5129 Sep 1 09:43 vsftpd.conf
    -rwxr--r-- 1 root root 338 Jun 21 2018 vsftpd_conf_migrate.sh
    -rw-r--r-- 1 root root 12288 Sep 1 10:01 vsftpd.db
    -rw-r--r-- 1 root root 39 Sep 1 09:58 vsftpd.user

    -T:将普通文件转换成数据库文件
    -t:指定加密类型
    -f:指定要转换的原文件

    [root@server vsftpd]# chmod 600 vsftpd.db  # 修改文件权限为600保障其安全性

  2. 创建FTP虚拟用户的映射用户,并指定其用户家目录

    [root@server vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual(virtual提供目录给虚拟用户,而不是用来登录) 
  3. 建立支持虚拟用户的PAM认证文件,添加虚拟用户支持

    [root@server vsftpd]# cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam
    [root@server vsftpd]# vim /etc/pam.d/vsftpd.pam 
    
    auth    required        pam_userdb.so   db=/etc/vsftpd/vsftpd
    account required        pam_userdb.so   db=/etc/vsftpd/vsftpd
    
    
    [root@server vsftpd]# vim /etc/vsftpd/vsftpd.conf 
    
    pam_service_name=vsftpd.pam
    guest_enable=YES
    guest_username=virtual
    user_config_dir=/etc/vsftpd/dir
    
    [root@server vsftpd]# mkdir dir 
    [root@server vsftpd]# ls 
    dir  ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh  vsftpd.db  vsftpd.user
  4. 为虚拟用户建立独立的配置文件,启动服务并测试

    允许用户上传
    anon_upload_enable=YES
    允许用户创建文件或目录
    anon_mkdir_write_enable=YES
    允许用户修改文件名
    anon_upload_enable=YES
    anon_other_write_enable=YES

    [root@server vsftpd]# cd dir
    [root@server dir]# ls
    [root@server dir]# vim test1

     anon_upload_enable=YES

    注意:做虚拟用户配置文件设置时,将主配置文件的自定义的匿名用户相关设置注释掉,因为虚拟用户的选项参数默认使用匿名用户的选项参数,若主配置文件中的匿名用户相关参数被设置,则子配置文件中的参数则失效。

 

 

VSFTP服务

标签:etc   res   本地   指定   修改   asc   验证过   rtu   oca   

原文地址:https://www.cnblogs.com/wanao/p/13594053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!