理論描述
Linux系統(tǒng)中,有不少實現(xiàn)FTP服務器的軟件套件。但是,大部分都是基于Linux系統(tǒng)用戶。。這一方面,沒必要,ftp用戶能上傳下載文件即可;另一方面,不安全,ftp用戶一旦采用弱密碼,則會大大降低系統(tǒng)安全性。
根據(jù)我們的需求,我們的FTP服務器需要滿足以下特點:
匿名登錄
FTP的Passive傳輸模式
UTF-8編碼,對客戶端推送語言編碼
虛擬用戶,用戶磁盤空間限額
FTPS安全傳輸
根據(jù)以上需求,我們采用了proftpd這款軟件。它不但能優(yōu)雅的完成上述功能,還能有更多的強大功能等待我們發(fā)現(xiàn)。
proftpd服務器完全使用編譯的方式安裝軟件,使用一個配置文件來配置服務。proftpd支持使用mysql數(shù)據(jù)庫存儲用戶信息。然而,在滿足我們需要的情況下,為了保持系統(tǒng)簡潔性,我們采用文件存儲用戶信息。
proftpd軟件短小精悍,官方鳥語文檔豐富,可讀性非常好。
操作步驟
獲取軟件包
搭建系統(tǒng)時,官方最新的穩(wěn)定版本是1.3.xx,從下面地址下載源代碼包:
ftp://ftp.proftpd.org/distrib/source/
下載后,解壓。
tar xvfproftpd-1.3.xx.tar.gz
安裝軟件
這里采用編譯的形式安裝
./configure–with-modules=mod_quotatab:mod_quotatab_file:mod_ban:mod_tls:\
mod_rewrite:mod_ifsession–enable-ctrls –enable-nls
–with-modules//編譯時包括選項:
mod_quotatab //啟用 quota用戶磁盤限額
mod_quotatab_file //采用基于文件的quotatab
mod_ban //啟動動態(tài)黑名單,防止密碼猜測,DDOS攻擊
mod_tls //啟用tls,實現(xiàn)功能FTPS
mod_rewrite //啟用重寫,可實現(xiàn)用戶上傳內容自動改名
mod_ifsession //啟用會話判斷,可判斷會話,對用戶IP設置規(guī)則。
–enable-ctrls //啟用訪問控制,可設置ACL
–enable-nls //啟用語言探測,解決中文亂碼。
make
//默認安裝到/usr/local/ ,需要root權限
makeinstall
編譯安裝完成后,我們看一下,安裝后的文件分布:
[root@ftp ~]# cd /usr/local
[root@ftp local]# ls -R
./bin:
ftpasswd ftpcount ftpdctl ftpmail ftpquota ftptop ftpwho prxs
./etc:
conf.d proftpd.conf (部分輸出)
./etc/conf.d:
ban.tab ftpd.group ftpquota.limittab mod_ban.conf mod_tls.conf proftpd-key.pem
cacert.pem ftpd.passwd ftpquota.tallytab mod_quota.conf proftpd-cert.pem whitelist
配置主配置文件
接下來,講解配置文件。下面的配置文件只是一個實例,并不通用。使用者根據(jù)自身情況酌情修改,
在開始配置proftpd配置文件之前,請確保已經(jīng)正確配置了,proftpd需要的文件,目錄,文件池等必要條件。
# This isa basic ProFTPD configuration file . rename it to
#'proftpd.conf' for actual use. Itestablishes a single server
# and asingle anonymous login. It assumes thatyou have a user/group
#"nobody" and "ftp" for normal operation and anon.
#————————————————————————–
# mainconfigure for
# by xiyang-liu
#————————————————————————–
##配置管理員郵箱地址,實際沒什么用,服務器相當安全,至今沒給我發(fā)過郵件
ServerAdmin xiyangliu1987@gmail.com
##配置服務器名,實踐說明在設置了服務器偽裝后,不提示服務器名。
ServerName"Xiyang-liu.comFTP Server"
## 配置服務器偽裝,這里我們偽裝proftpd成Server-U服務器。
ServerIdent on "Serv-UFTP Server v6.4 for WinSock ready…"
##設置服務器運行模式,獨立服務,或者被監(jiān)管
ServerType standalone
#ServerType inetd
##設置為默認服務器
DefaultServer on
##設置服務器進程運行使用的用戶
User nobody
##設置服務器進程運行使用的組
Group nobody
##設置關閉IPv6支持
UseIPv6 off
##設置服務器接受請求的端口
Port21
##設置被動模式使用的端口范圍
PassivePorts6000065535
##設置用戶上傳文件的權限掩碼
Umask022
##設置用戶被chroot鎖定到的各自的Home目錄
DefaultRoot~
##關閉歡迎信息顯示
DeferWelcome off
##如果顯示歡迎信息,則指定顯示的文件
DisplayLogin welcome.msg
##指定切換文件夾時,顯示的歡迎信息
DisplayChdir.message
#
#
##登錄超時時間,從出現(xiàn)輸入用戶名的提示符到斷開連接的時間
TimeoutLogin1200
##空閑超時,無操作超時
TimeoutIdle600
##不傳輸超時,數(shù)據(jù)連接建立,但是沒有數(shù)據(jù)傳輸
TimeoutNoTransfer900
##延遲超時,從數(shù)據(jù)連接建立到有數(shù)據(jù)傳輸最大延遲時間
TimeoutStalled3600
##不使用DNS反查詢
UseReverseDNS off
##上傳時,允許覆蓋已有的文件
AllowOverwrite yes
##不使用RFC 1413協(xié)議反查用戶信息,加快FTP訪問速度
IdentLookups off
## 開啟delay引擎,更安全。
## 為什么這么說呢Proftpd在接受用戶請求的時候,會查詢用戶列表,以確
##定是否有這個用戶。如果有,還會查詢黑名單列表,訪問控制列表。這些查詢都需要
##時間。所以,不同情況(服務器存在賬戶和不存在賬戶)下,從輸入用戶名到出現(xiàn)密
##碼提示符之間的時間會有一個時間差值。這個時間很短,憑人無法感覺,但是計算機
##可以識別,通過對這個時間差進行分析,可以試探那些Proftpd上存在哪些用戶,不
##存在哪些用戶。
## 開啟delay引擎,會均衡這個時間段。無論輸入的用戶存不存在,從用戶名輸入到
##彈出密碼提示符的時間間隔都是一樣的!
DelayEngine on
##指定日志格式
LogFormatdefault"%h%l %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
LogFormat write "%h %l %u %t \"%r\" %s%b"
TransferLog/usr/local/var/proftpd/log/transfer.log
ExtendedLog/usr/local/var/proftpd/log/access.log WRITE,READ write
ExtendedLog/usr/local/var/proftpd/log/auth.log AUTHauth
#
#
##如果存在lang模塊
<<>IfModule mod_lang.c>
##開啟lang引擎
LangEngine on
##默認語言英文
LangDefaulten_US
##使用強制utf8編碼
UseEncoding on
##制定語言模塊位置
LangPath/usr/local/share/locale/
<<>/IfModule>
#
##如果存在facts模塊
.c>
##關閉FactsAdvertise,提高兼容性。
FactsAdvertise off
<IfModule>
#
##限制特定操作
<<>LimitSITE_CHMOD,SITE_CHGRP>
##阻止所有用戶使用更改權限 更改組命令
DenyAll
<<>/Limit>
#
##設置虛擬用戶
##指定虛擬用戶的passwd和group文件,格式和系統(tǒng)文件一樣
AuthUserFile /usr/local/etc/conf.d/ftpd.passwd
AuthGroupFile/usr/local/etc/conf.d/ftpd.group
#這里->這里 之間是約束說明。
##創(chuàng)建虛擬用戶的時候制定home目錄,應該是下面目錄的子目錄。
# homedir/ftp_pool/home/
##虛擬用戶統(tǒng)一使用nobody的UID和GID
###問:為什么不使用不同的UID和GID那樣不是更安全嗎
###答:也可以使用不同的UID和GID,但是那樣太費事。使用不同UID和GID。首先,
##要判斷和系統(tǒng)UID和GID是不是有沖突;其次,要每次創(chuàng)建用戶需要找一個沒用過的
##UID和GID;再次,得給新創(chuàng)建的用戶賦予權限;最后,災難恢復太麻煩。
# useridnobody
# groupidnobody
#這里->這里 之間是約束說明。
#
#
#設置匿名用戶資源
<<>Anonymous/ftp_pool/pub/>
##匿名用戶使用的用戶和組
User ftp
Group ftp
##用戶別名
UserAlias anonymous ftp
##不要求合法的shell
RequireValidShellno
MaxClients50
##限制匿名用戶登錄的位置
<<>Limit LOGIN>
##限制順序為先允許 再阻止
OrderAllow,Deny
##允許內網(wǎng)用戶登錄匿名目錄
Allow10.0.0.0/8
Allow172.16.0.0/12
Allow192.168.0.0/16
##阻止所有其他用戶
Deny ALL
<<>/Limit>
#
##配置upload目錄權限
#限制寫
Order Allow,Deny
##只允許技術部上傳
Allow 10.1.5.0/24
##阻止其他所有用戶
Deny ALL
<<>/Limit>
<Directory>
##配置匿名用戶權限
<<>Limit WRITE>
##阻止所用戶的寫權限
DenyAll組織所有
<<>/Limit>
<Anonymous>