2013年6月14日 星期五

Linux vsftp

FTP 功能簡介
不同等級的使用者身份:user, guest, anonymous(1)實體帳號,real user;(2)訪客, guest;(3)匿名登入者, anonymous,
命令記錄與登錄檔記錄:FTP 可以利用系統的 syslogd 來進行資料的紀錄, 而記錄的資料包括了使用者曾經下達過的命令與使用者傳輸資料(傳輸時間、檔案大小等等)的紀錄呢! 所以你可以很輕鬆的在 /var/log/ 裡面找到各項登錄資訊喔!
限制使用者活動的目錄: (change root, 簡稱 chroot):為 了避免使用者在你的 Linux 系統當中隨意逛大街 (意指離開使用者自己的家目錄而進入到 Linux 系統的其他目錄去), 所以將使用者的工作範圍『侷限』在使用者的家目錄底下,嗯!實在是個不錯的好主意!FTP 可以限制使用者僅能在自己的家目錄當中活動喔!如此一來,由於使用者無法離開自己的家目錄,而且登入 FTP 後,顯示的『根目錄』就是自己家目錄的內容,這種環境稱之為 change root ,簡稱 chroot ,改變根目錄的意思啦!
這 有什麼好處呢?當一個惡意的使用者以 FTP 登入你的系統當中,如果沒有 chroot 的環境下,他可以到 /etc, /usr/local, /home 等其他重要目錄底下去察看檔案資料,尤其是很重要的 /etc/ 底下的設定檔,如 /etc/passwd 等等。如果你沒有做好一些檔案權限的管理與保護,那他就有辦法取得系統的某些重要資訊, 用來『入侵』你的系統呢!所以在 chroot 的環境下,當然就比較安全一些咯!
圖 21.1-1、FTP 伺服器的主動式連線示意圖
簡單的連線流程就如上圖所示,至於連線的步驟是這樣的:
  1. 建立命令通道的連線
    如 上圖所示,用戶端會隨機取一個大於 1024 以上的埠口 (port AA) 來與 FTP 伺服器端的 port 21 達成連線, 這個過程當然需要三向交握了!達成連線後用戶端便可以透過這個連線來對 FTP 伺服器下達指令, 包括查詢檔名、下載、上傳等等指令都是利用這個通道來下達的;
  2. 通知 FTP 伺服器端使用 active 且告知連接的埠號
    FTP 伺服器的 21 埠號主要用在命令的下達,但是當牽涉到資料流時,就不是使用這個連線了。 用戶端在需要資料的情況下,會告知伺服器端要用什麼方式來連線,如果是主動式 (active) 連線時, 用戶端會先隨機啟用一個埠口 (圖 21.1-1 當中的 port BB) ,且透過命令通道告知 FTP 伺服器這兩個資訊,並等待 FTP 伺服器的連線;
  3. FTP 伺服器『主動』向用戶端連線
    FTP 伺服器由命令通道瞭解用戶端的需求後,會主動的由 20 這個埠號向用戶端的 port BB 連線, 這個連線當然也會經過三向交握啦!此時 FTP 的用戶端與伺服器端共會建立兩條連線,分別用在命令的下達與資料的傳遞。 而預設 FTP 伺服器端使用的主動連線埠號就是 port 20 囉!


圖 21.1-2、 FTP 用戶端與伺服器端連線中間具有防火牆的連線狀態
  1. 用戶與伺服器間命令通道的建立:
    因為 NAT 會主動的記錄由內部送往外部的連線資訊,而由於命令通道的建立是由用戶端向伺服器端連線的, 因此這一條連線可以順利的建立起來的;
  2. 用戶與伺服器間資料通道建立時的通知:
    同樣的,用戶端主機會先啟用 port BB ,並透過命令通道告知 FTP 伺服器,且等待伺服器端的主動連線;
  3. 伺服器主動連到 NAT 等待轉遞至用戶端的連線問題:
    但 是由於透過 NAT 的轉換後,FTP 伺服器只能得知 NAT 的 IP 而不是用戶端的 IP , 因此 FTP 伺服器會以 port 20 主動的向 NAT 的 port BB 發送主動連線的要求。 但你的 NAT 並沒有啟動 port BB 來監聽 FTP 伺服器的連線啊!
IP , 因此 FTP 伺服器會以 port 20 主動的向 NAT 的 port BB 發送主動連線的要求。 但你的 NAT 並沒有啟動 port BB 來監聽 FTP 伺服器的連線啊!
瞭 解問題的所在了嗎?在 FTP 的主動式連線當中,NAT 將會被視為用戶端,但 NAT 其實並非用戶端啊, 這就造成問題了。如果你曾經在 IP 分享器後面連接某些 FTP 伺服器時,可能偶爾會發現明明就連接上 FTP 伺服器了 (命令通道已建立),但是就是無法取得檔案名稱的列表,而是在超過一段時間後顯示『 Can't build data connection: Connection refused,無法進行資料傳輸』之類的訊息, 那肯定就是這個原因所造成的困擾了。


那有沒有辦法可以克服這個問題呢?難道真的在 Linux NAT 後面就一定無法使用 FTP 嗎?當然不是! 目前有兩個簡易的方法可以克服這個問題:


1.使用 iptables 所提供的 FTP 偵測模組:
其 實 iptables 早就提供了許多好用的模組了,這個 FTP 當然不會被錯過! 你可以使用 modprobe 這個指令來載入 ip_conntrack_ftp 及 ip_nat_ftp 等模組,這幾個模組會主動的分析『目標是 port 21 的連線』資訊, 所以可以得到 port BB 的資料,此時若接受到 FTP 伺服器的主動連線,就能夠將該封包導向正確的後端主機了! ^_^
不過,如果你連結的目標 FTP 伺服器他的命令通道預設埠號並非標準的 21 埠號時 (例如某些地下 FTP 伺服器), 那麼這兩個模組就無法順利解析出來了,這樣說,理解嗎?


2.用戶端選擇被動式 (Passive) 連線模式:
除 了主動式連線之外,FTP 還提供一種稱為被動式連線的模式,什麼是被動式呢? 既然主動式是由伺服器向用戶端連線,反過來講,被動式就是由用戶端向伺服器端發起連線的囉! 既然是由用戶端發起連線的,那自然就不需要考慮來自 port 20 的連線啦!關於被動式連線模式將在下一小節介紹喔!
圖 21.1-3、FTP 的被動式資料流連線流程
  1. 用戶與伺服器建立命令通道:
    同樣的需要建立命令通道,透過三向交握就可以建立起這個通道了。
  2. 用戶端發出 PASV 的連線要求:
    當有使用資料通道的指令時,用戶端可透過命令通道發出 PASV 的被動式連線要求 (Passive 的縮寫), 並等待伺服器的回應;
  3. FTP 伺服器啟動資料埠口,並通知用戶端連線:
    如 果你的 FTP 伺服器是能夠處理被動式連線的,此時 FTP 伺服器會先啟動一個埠口在監聽。 這個埠口號碼可能是隨機的,也可以自訂某一範圍的埠口,端看你的 FTP 伺服器軟體而定。 然後你的 FTP 伺服器會透過命令通道告知用戶端該已經啟動的埠口 (圖中的 port PASV), 並等待用戶端的連線。
  4. 用戶端隨機取用大於 1024 的埠口進行連接:
    然後你的用戶端會隨機取用一個大於 1024 的埠號來對主機的 port PASV 連線。 如果一切都順利的話,那麼你的 FTP 資料就可以透過 port BB 及 port PASV 來傳送了。
1.隨時更新到最新版本的 FTP 軟體,並隨時注意漏洞訊息;
2.善用 iptables 來規定可以使用 FTP 的網域;
3.善用 TCP_Wrappers 來規範可以登入的網域;
4.善用 FTP 軟體的設定來限制使用你 FTP 伺服器的使用者的不同權限啊;
5.使用 Super daemon 來進階管理你的 FTP 伺服器;
6.隨時注意使用者的家目錄、以及匿名使用者登入的目錄的『檔案權限』;
7.若不對外公開的話,或許也可以修改 FTP 的 port 。
8.也可以使用 FTPs 這種加密的 FTP 功能!
vsftpd 是基於上面的說明來設計的一個較為安全的 FTP 伺服器軟體,他具有底下的特點喔:
  • vsftpd 這個服務的啟動者身份為一般使用者,所以對於 Linux 系統的使用權限較低,對於 Linux 系統的危害就相對的減低了。此外, vsftpd 亦利用 chroot() 這個函式進行改換根目錄的動作,使得系統工具不會被 vsftpd 這支服務所誤用;
  • 任何需要具有較高執行權限的 vsftpd 指令均以一支特殊的上層程序所控制, 該上層程序享有的較高執行權限功能已經被限制的相當的低,並以不影響 Linux 本身的系統為準;
  • 絕 大部分 ftp 會使用到的額外指令功能 (dir, ls, cd ...) 都已經被整合到 vsftpd 主程式當中了,因此理論上 vsftpd 不需要使用到額外的系統提供的指令,所以在 chroot 的情況下,vsftpd 不但可以順利運作,且不需要額外功能對於系統來說也比較安全。
  • 所有來自用戶端且想要使用這支上層程序所提供的較高執行權限之 vsftpd 指令的需求, 均被視為『不可信任的要求』來處理,必需要經過相當程度的身份確認後,方可利用該上層程序的功能。 例如 chown(), Login 的要求等等動作;
  • 此外,上面提到的上層程序中,依然使用 chroot() 的功能來限制使用者的執行權限。
由於具有這樣的特點,所以 vsftpd 會變的比較安全一些咯!底下就開始來談如何設定吧!


$sudo yum install vsftpd
$cd /etc/vsftpd/
$vi vsftpd.conf
# 1. 與匿名者有關的資訊:
anonymous_enable=NO        <==支援匿名者的登入使用 FTP 功能


# 2. 與實體用戶有關的設定
local_enable=YES            <==支援本地端的實體用戶登入
write_enable=YES            <==允許使用者上傳資料 (包括檔案與目.錄)
local_umask=002             <==建立新目錄 (755) 與檔案 (644) 的權限


# 3. 與伺服器環境有關的設定
dirmessage_enable=YES       <==若目錄下有 .message 則會顯示該檔案的內容
xferlog_enable=YES          <==啟動登錄檔記錄,記錄於 /var/log/xferlog
connect_from_port_20=YES    <==支援主動式連線功能
xferlog_std_format=YES      <==支援 WuFTP 的登錄檔格式
listen=YES                  <==使用 stand alone 方式啟動 vsftpd
pam_service_name=vsftpd     <==支援 PAM 模組的管理
userlist_enable=YES         <==支援 /etc/vsftpd/user_list 檔案內的帳號登入管控!
tcp_wrappers=YES            <==支援 TCP Wrappers 的防火牆機制
use_localtime=YES            <=使用本地端時間


userlist_deny=YES <=系統帳號不可登入主機 (亦即 UID 小於 500 以下的帳號)
userlist_file=/etc/vsftpd/user_list <= 檔案
banner_file=/etc/vsftpd/welcom.txt  <=使用者登入時顯示一些歡迎訊息的資訊


chroot_local_user=YES <=預設對使用者 (包括未來新增用戶) 進行 chroot
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list 如果使用預設,這裡就是不限制名單,如果不使用預設,這裡就是限制名單


local_max_rate=100000<=限制實體用戶的總下載流量 (頻寬)
max_clients=50<=限制最大同時上線人數
max_per_ip=1<=同一 IP 的 FTP 連線數




建立歡迎訊息vi /etc/vsftpd/welcome.txt
Hello



$sudo /etc/init.d/vsftp restart


被動式連線埠口的限制
vim /etc/vsftpd/vsftpd.conf
pasv_min_port=65400
pasv_max_port=65410


防火牆設定
加入 iptables 的 ip_nat_ftp, ip_conntrack_ftp 兩個模組
vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
開放 port 21 給網際網路使用
開放前一小節提到的 port 65400~65410 埠口給 Internet 連線用
iptables -A INPUT -p TCP -i $EXTIF --dport  21  --sport 1024:65534 -j ACCEPT
iptables -A INPUT -p TCP -i $EXTIF --dport 65400:65410 --sport 1024:65534 -j ACCEPT


沒有留言:

張貼留言