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