• 使用Proftpd支持FTP/SFTP权限管控


    简介

    FTP

    文件传输协议,FTP由FTP服务器(存储文件)和FTP客户端(通过FTP协议访问FTP服务器上的资源)组成

    传输方式

    1. 主动模式(Port)
      1. 客户端与服务器端的TCP 21端口建立连接 -> 登录
      2. 发送PORT命令告知服务器需要做什么操作,客户端使用哪个端口传输数据
      3. 服务器端通过TCP 20端口连接至客户端指定端口
      4. 进行数据传输
    2. 被动模式(Passive)
      1. 客户端与服务器端的TCP 21端口建立连接 -> 登录
      2. 客户端发送Pasv命令到服务器端
      3. 服务器端收到Pasv命令后随机打开一个端口,并通知客户端在此端口传输数据
      4. 进行数据传输
    • 主动模式:将服务器21、20端口打开后仍然有问题,可能是客户端防火墙拦截
    • 被动模式:服务器端的数据传输端口是随机打开的,可能会被防火墙拦截
    1. proftpd配置
    # 禁止主动模式访问
    <Limit PORT>
      DenyAll
    </Limit>
    
    # 禁止被动模式访问
    <Limit PASV>
      DenyAll
    </Limit>
    

    SFTP

    安全文件传输协议,基于 SSH2 协议建立安全连接来传输文件。与FTP不同,SFTP不区分数据通道与命令通道,而是数据和命令都会通过单个连接以特殊格式的数据包进行传输,配置时可以指定端口。可以通过用户名密码认证、RSA认证、DSA认证等方式管理用户登录

    配置工具

    1. 大多数Linux系统自带的openssh除了提供ssh连接外还提供sftp功能,使用方便、配置简单,但是无法做到像samba那样细粒度的权限管控,只能对不同的用户配置不同的家目录以及文件夹权限
    2. proftpd可高度配置权限管控,设置用户和组,同时支持FTP与SFTP的使用,但是配置相对繁琐很多

    下面介绍proftpd的配置使用

    proftpd使用

    FTP基本配置

    使用ftpasswd工具创建用户和组

    1. 添加用户和组
    # 创建galen用户,并设置家目录为/vol/galen
    ftpasswd --passwd --file=/etc/ftpd/ftpd.passwd --name=galen --uid=1001 \
    --home=/vol/galen --shell=/bin/bash
    # 创建user1
    ftpasswd --passwd --file=/etc/ftpd/ftpd.passwd --name=user1 --uid=1002 \
    --home=/vol/user1 --shell=/bin/bash
    
    # 添加用户组group1,添加galen和user1作为组成员
    ftpasswd --group --file=/etc/ftpd/ftpd.group --name=group1 --gid=2001 \
    --member=galen,user1
    
    1. 写入相关配置到/etc/proftpd/proftpd.conf
    # 设置FTP用户登录根目录为/vol
    DefaultRoot /vol
    # 设置用户和组文件路径
    AuthUserFile /etc/ftpd/ftpd.passwd
    AuthGroupFile /etc/proftpd/ftpd.group
    # 资源控制,对处理FTP session的子进程限制内存
    <IfModule mod_rlimit.c>
      RLimitMemory session 4G
    </IfModule>
    

    启用SFTP

    使用VirtualHost配置一个独立的SFTP服务器,该配置快的作用是在同一个物理机上虚拟出多个FTP服务器。具体示例如下:

    <IfModule mod_sftp.c>
        <VirtualHost 0.0.0.0>
            ServerName "SFTP Server"
            DefaultRoot /vol
            SFTPEngine on
            # SFTP使用的端口配置为2222
            Port 2222
            SFTPLog /var/log/proftpd/sftp.log
            AllowOverwrite yes
            # SFTPHostKey需要提供rsa、dsa以及可选的ECDSA key
            # 注意:这些文件需要与SSH2使用的key文件完全相同,所以直接加入ssh的key文件路径
            SFTPHostKey /etc/ssh/ssh_host_rsa_key
            SFTPHostKey /etc/ssh/ssh_host_dsa_key
            # 使用用户名密码的认证方式
            SFTPAuthMethods password
            # 同以上FTP设置的用户一样
            AuthUserFile /etc/proftpd/ftpd.passwd
            AuthGroupFile /etc/proftpd/ftpd.group
            MaxLoginAttempts 6
            SFTPCompression delayed
        </VirtualHost>
    </IfModule>
    

    以上可以做到用户和组同时通过SFTP与FTP访问服务器,下面简单配置登录限制与权限管控

    权限管控

    proftpd的 提供了强大权限控制功能,通过向该块添加不同的FTP原生指令(指令列表),配合AllowUser、AllowGroup、AllowAll、DenyAll可以实现非常细粒度的权限控制

    Limit

    Proftpd将以上FTP原生指令组合成为指令组:

    • ALL
      Covering: all FTP commands (but not LOGIN)
    • DIRS
      Covering: CDUP, CWD, LIST, MDTM, MLSD, MLST, NLST, PWD, RNFR, STAT, XCUP, XCWD, XPWD
    • LOGIN
      Covering: client logins
    • READ
      Covering: RETR, SIZE
    • WRITE
      Covering: APPE, DELE, MKD, RMD, RNTO, STOR, STOU, XMKD, XRMD

    如果指令组和原生指令同时添加到配置,那么原生指令的优先级最高 -> 次优先的是命令组 -> 其他命令组优先级大于带ALL关键字

    Umask

    linux权限参考如下

    Mode Label Description
    0777 rwxrwxrwx read/write/execute permissions for user owner, group owner, and other
    0666 rw-rw-rw- read/write permissions for user owner, group owner, and other
    0755 rwxr-xr-x read/write/execute permissions for user owner, read/execute permissions for group owner and other
    0750 rwxr-x--- read/write/execute permissions for user owner, read permission for group owner, no permissions for other
    0644 rw-r--r-- read/write permissions for user owner, read permission for group owner and other
    0511 r-x--x--x read/execute permissions for user owner, execute permission for group owner and other
    1. 对于新建文件或目录的权限控制使用umask,即:新文件或目录的权限 = 基本权限与umask按位异或,举例:

    基本权限为777,如果我们想将创建的文件设置为创建用户可读写执行,同组用户与其他用户只读,那么设置umask为022,最终得到新建文件或目录的权限为755

    7 ^ 0 = 7
    7 ^ 2 = 5
    7 ^ 2 = 5
    
    1. proftpd的基本权限没有执行位,及base-mode = 666
    2. 我们想设置ftp目录 /vol/share1 为创建者可读写、同组只读、其他用户只读,第一个022为新建文件的umask,第二个022为新建目录的umask
    <Directory "/vol/share1">
      Umask 022 022
      <Limit DIRS WRITE>
      AllowAll
      </Limit>
    </Directory>
    

    详细示例

    该配置实现了:

    • 用户、组的配置
    • 某个目录允许某个组或用户读写
    • 用户、组、其他用户对文件的使用权限
    • 通过配置目录禁止访问变相实现FTP、SFTP可以一同使用,或者单独使用某一个
    1. user
    # /etc/proftpd/ftpd.passwd
    # 将家目录设为不存在的目录,后续使用<Limit>进行统一控制
    u1:$1$uWROkZWh$FzA2bjAqX8WXSyahNuhLV0:2000:2000::/nonexistent:/bin/bash
    galen:$1$vzCnaVih$cbSGH3balmW7K44PILuCB/:2001:2003::/nonexistent:/bin/bash
    otheruser:$1$3QmQ7wF3$qRJE9nC8t8w4n7qtyshE1/:2004:2004::/nonexistent:/bin/bash
    user1:$1$XMQbJG3S$4BUxe9VbBCWrItfE2AjuH0:2002:2003::/nonexistent:/bin/bash
    
    1. group
    # /etc/proftpd/ftpd.group
    samba_group_group1:x:2003:galen,user1
    
    1. proftpd.conf
    Include /etc/proftpd/conf.d/
    DefaultRoot /vol
    AllowForeignAddress OFF
    AuthUserFile /etc/proftpd/ftpd.passwd
    AuthGroupFile /etc/proftpd/ftpd.group
    
    <IfModule mod_rlimit.c>
      RLimitMemory session 4G
    </IfModule>
    # 禁止所有人操作根目录
    <Directory "/vol">
      <Limit WRITE>
        DenyAll
      </Limit>
    </Directory>
    # 允许操作根目录的子目录
    <Directory "/vol/*/*">
      <Limit ALL>
        AllowAll
      </Limit>
    </Directory>
    # /vol/share1目录允许属于samba_group_group1组的用户读写
    <Directory "/vol/share1">
      Umask 022 022
      <Limit DIRS WRITE>
        AllowGroup samba_group_group1
        AllowUser None
        DenyAll
      </Limit>
    </Directory>
    # /vol/share3禁止所有ftp登录的用户使用
    <Directory "/vol/share3">
      Umask 777 777
      <Limit DIRS WRITE READ>
        AllowGroup None
        AllowUser None
        DenyAll
      </Limit>
    </Directory>
    # /vol/share2目录允许otheruser使用,创建的文件与目录权限为666(proftpd没有执行位)
    <Directory "/vol/share2">
      Umask 000 000
      <Limit DIRS WRITE>
        AllowGroup None
        AllowUser otheruser
        DenyAll
      </Limit>
    </Directory>
    # 以上为使用FTP登录的设置
    # 以下为使用SFTP登录的设置
    <IfModule mod_sftp.c>
        <VirtualHost 0.0.0.0>
            ServerName "SFTP Server"
            DefaultRoot /vol
            SFTPEngine on
            Port 2222
            SFTPLog /var/log/proftpd/sftp.log
            AllowOverwrite yes
            SFTPHostKey /etc/ssh/ssh_host_rsa_key
            SFTPHostKey /etc/ssh/ssh_host_dsa_key
            SFTPAuthMethods password
            AuthUserFile /etc/proftpd/ftpd.passwd
            AuthGroupFile /etc/proftpd/ftpd.group
            MaxLoginAttempts 6
            SFTPCompression delayed
    
            <Directory "/vol">
              <Limit WRITE>
                DenyAll
              </Limit>
            </Directory>
    
            <Directory "/vol/*/*">
              <Limit ALL>
                AllowAll
              </Limit>
            </Directory>
    
            <Directory "/vol/share1">
              Umask 022 022
              <Limit DIRS WRITE>
                AllowGroup samba_group_group1
                AllowUser None
                DenyAll
              </Limit>
            </Directory>
            # 使用SFTP登录的任何用户都可以操作/vol/share3
            <Directory "/vol/share3">
              Umask 000 000
              <Limit DIRS WRITE>
                AllowGroup samba_group_group1
                AllowUser otheruser
                DenyAll
              </Limit>
            </Directory>
            # 不允许使用SFTP登录的用户操作/vol/share2
            <Directory "/vol/share2">
              Umask 777 777
              <Limit DIRS WRITE READ>
                AllowGroup None
                AllowUser None
                DenyAll
              </Limit>
            </Directory>
        </VirtualHost>
    </IfModule>
    

    总结

    proftpd实现的feature还有很多,比如:匿名用户、匿名FTP服务器、隐藏目录或文件、过期帐号等设置,有需要可以研究官网

  • 相关阅读:
    C# WinForm 中 MessageBox的使用详解
    C#中MemoryStream类的介绍
    C#中String类的几个方法(IndexOf、LastIndexOf、Substring)
    C#ImageList和ListView的使用
    ListView的BeginUpdate()和EndUpdate()的用处
    C#中AppDomain.CurrentDomain.BaseDirectory及各种路径获取方法
    C#字符串比较方法
    C# ListView用法详解
    c#中枚举类型的定义与使用
    c#中的模态对话框和非模态对话框
  • 原文地址:https://www.cnblogs.com/tongh/p/16190626.html
Copyright © 2020-2023  润新知