使用Proftpd支援FTP/SFTP許可權管控

Hui_Tong發表於2022-04-25

簡介

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

相關文章