使用Proftpd支援FTP/SFTP許可權管控
簡介
FTP
文件傳輸協議,FTP由FTP伺服器(存儲文件)和FTP客戶端(通過FTP協議訪問FTP伺服器上的資源)組成
傳輸方式
- 主動模式(Port)
- 客戶端與伺服器端的TCP 21埠建立連接 -> 登錄
- 發送PORT命令告知伺服器需要做什麼操作,客戶端使用哪個埠傳輸數據
- 伺服器端通過TCP 20埠連接至客戶端指定埠
- 進行數據傳輸
- 被動模式(Passive)
- 客戶端與伺服器端的TCP 21埠建立連接 -> 登錄
- 客戶端發送Pasv命令到伺服器端
- 伺服器端收到Pasv命令後隨機打開一個埠,並通知客戶端在此埠傳輸數據
- 進行數據傳輸
- 主動模式:將伺服器21、20埠打開後仍然有問題,可能是客戶端防火牆攔截
- 被動模式:伺服器端的數據傳輸埠是隨機打開的,可能會被防火牆攔截
SFTP
安全文件傳輸協議,基於 SSH2 協議建立安全連接來傳輸文件。與FTP不同,SFTP不區分數據通道與命令通道,而是數據和命令都會通過單個連接以特殊格式的數據包進行傳輸,配置時可以指定埠。可以通過用戶名密碼認證、RSA認證、DSA認證等方式管理用戶登錄
配置工具
- 大多數Linux系統自帶的openssh除了提供ssh連接外還提供sftp功能,使用方便、配置簡單,但是無法做到像samba那樣細粒度的許可權管控,只能對不同的用戶配置不同的家目錄以及文件夾許可權
- proftpd可高度配置許可權管控,設置用戶和組,同時支援FTP與SFTP的使用,但是配置相對繁瑣很多
下面介紹proftpd的配置使用
proftpd使用
FTP基本配置
使用ftpasswd工具創建用戶和組
- 添加用戶和組
# 創建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
- 寫入相關配置到/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的
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 |
- 對於新建文件或目錄的許可權控制使用umask,即:新文件或目錄的許可權 = 基本許可權與umask按位異或,舉例:
基本許可權為777,如果我們想將創建的文件設置為創建用戶可讀寫執行,同組用戶與其他用戶只讀,那麼設置umask為022,最終得到新建文件或目錄的許可權為755
7 ^ 0 = 7
7 ^ 2 = 5
7 ^ 2 = 5
- proftpd的基本許可權沒有執行位,及base-mode = 666
- 我們想設置ftp目錄 /vol/share1 為創建者可讀寫、同組只讀、其他用戶只讀,第一個022為新建文件的umask,第二個022為新建目錄的umask
<Directory "/vol/share1">
Umask 022 022
<Limit DIRS WRITE>
AllowAll
</Limit>
</Directory>
詳細示例
該配置實現了:
- 用戶、組的配置
- 某個目錄允許某個組或用戶讀寫
- 用戶、組、其他用戶對文件的使用許可權
- 通過配置目錄禁止訪問變相實現FTP、SFTP可以一同使用,或者單獨使用某一個
- 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
- group
# /etc/proftpd/ftpd.group
samba_group_group1:x:2003:galen,user1
- 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伺服器、隱藏目錄或文件、過期帳號等設置,有需要可以研究官網

