使用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埠打開後仍然有問題,可能是客戶端防火牆攔截
  • 被動模式:伺服器端的數據傳輸埠是隨機打開的,可能會被防火牆攔截

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伺服器、隱藏目錄或文件、過期帳號等設置,有需要可以研究官網

Tags: