返回列表 發帖

[轉貼] 配置安全的 ProFTPD 伺服器

proftpd全稱:Professional FTP daemon是針對Wu-FTP的弱項而開發的,除了改進的安全性,還具備許多Wu-FTP沒有的特點,能以Stand-alone、xinetd模式運行等。ProFTP已經成為繼Wu-FTP之後最為流行的FTP伺服器軟體,越來越多的站點選用它構築安全高效的FTP站點,ProFTP配置方便,並有MySQL和Quota模組可供選擇,利用它們的完美結合可以實現非系統賬號的管理和用戶磁片的限制。ProFTPD 的特點:

    1. 單配置文件,其設置指示和apache的有類似之處,非常容易配置。
    2. 基於單個目錄的.ftpaccess設置文件,類似與apache的.htaccess文件。  
    3. 易於設置的多虛擬伺服器和匿名ftp服務。  
    4. 可以設置為從xinetd啟動,或者是獨立ftp伺服器兩種運行方式。  
    5. 匿名ftp的根目錄不需要任何特殊的目錄結構,或系統程式或其他系統文件。  
    6. ncfptd不執行任何外部程式,從而減少了安全隱患。  
    7. 可以根據文件屬主情況或unix風格的訪問控制來隱藏文件或目錄。  
    8. 以非root身份運行,從而減少了安全隱患。
    9. 強大的log功能,支援utmp/wtmp及wu-ftpd格式的記錄標準,並支援擴展功能的記錄。
    10. 支援Shadow口令,包括支援口令過期機制。
    11. 遵從GPL版權,開放源代碼。
    12. 可設定多個虛擬FTP server,而匿名FTP服務更是十分容易。
    13. 最新版本1.3.0ahttp://www.ProFTPD.org

一、基本ProFTPD伺服器配置過程:

1.如果安裝過wuftpd伺服器首先卸載

這裡以 ProFTPD 1.3.0 做示範,官方網址:http://www.ProFTPD.org
下載鏈結:ftp://ftp.proftpd.org/distrib/source/proftpd-1.3.0.tar.bz2

  1. [root@ftpd /]# bunzip proftpd-1.3.0.tar.bz2
  2. [root@ftpd /]# cp proftpd-1.3.0.tar /usr/src/
  3. [root@ftpd /]# cd /usr/src
  4. [root@ftpd src]# tar xvf proftpd-1.3.0.tar
  5. [root@ftpd src]# cd proftpd-1.3.0
  6. [root@pftd proftpd-1.3.0]# ./configure ; make ; make install
複製代碼


到現在為止,你已經完成了proftpd的編譯和安裝。並且在/usr/local/etc/目錄下有一個默認的proftpd配置文件proftpd.conf。

2.理解配置文件

下面是默認安裝後的配置文件:
ServerName “ProFTPD Default Installation”
ServerType standalone
DefaultServer on
ServerIdent off
Port 21
Umask 022
MaxInstances 30
User nobody
Group nogroup
<Directory /*>
AllowOverwrite on
</Directory>
<Anonymous ~ftp>
User ftp
Group ftp
UserAlias anonymous ftp
MaxClients 10
DisplayLogin welcome.msg
DisplayFirstChdir .message
<Limit WRITE>
DenyAll
</Limit>
</Anonymous>
    這裡筆者去掉了所有注視。熟悉Apache伺服器的配置方法的讀者很很容易理解。二者有許多相似之處。
單線指令,如ServerName and ServerType。
多線容器指令。如<Directory> and <Limit>。
配置伺服器後應當知道配置文件中指令的含義。可以參考官方配置指南(下載鏈結:http://www.proftpd.org/docs/directives/configuration.pdf )。下面主要介紹安全相關的部分。
ServerName :伺服器名稱。在登入時所顯示的伺服器名稱。確省是:“ProFTPD Default Installation”可以根據個人情況修改。
ServerType :伺服器工作類型。ProFTPD能以Stand-alone、xinetd兩種模式運行。
DefaultServer:是否啟用虛擬FTP,on為支援,off是關閉。
ServerIdent :是否顯示FTP軟體名稱,on為顯示,off是關閉。
Port:運行端口。設定於登入時,主機是監聽那一個端口。
Umask:指定確省配置文件的許可權一般是022。
MaxInstances:最大連接請求。設定伺服器于同一時間內可以處理的程式有幾筆,若伺服器運行類型設為standalone的話,可設低一點,以避免駭客的DoS攻擊。
User:指明運行FTP伺服器的用戶名稱。
Group: 指明運行FTP伺服器的用戶組名稱。
<Directory /*> 登入時想進入的目錄位置 (/*是通配符合),AllowOverwrite 表示是否允許客戶端覆蓋文件,這樣是不安全的應當選擇off。
</Anonymous> 是否建立匿名FTP站點。除非需要請刪除這個選型。
DisplayLogin welcome.msg 設置ftp登陸歡迎資訊文件。

3.配置實例

建立一個單機(standalone)模式的FTP伺服器
建立配置文件如下:
ServerName “FTP Server”
ServerType standalone
DefaultServer on
Port 21
Umask 027
MaxInstances 30
User nobody
Group nogroup
<Directory /*>
AllowOverwrite off
</Directory>
使用su命令切換為root用戶。
在/etc/rc.d/init.d目錄中安裝啟動腳本:cp ./contrib/dist/rpm/proftpd.init.d /etc/rc.d
  /init.d/proftpd
添加一個新組:groupadd nogroup。
建立符號鏈結讓FTP伺服器隨啟動自動啟動:ln -/etc/rc.d/init.d/proftpd /etc/rc.d/rc3.d/S95proftpd
測試連接情況:從客戶端測試proftpd是否正常運行:
  
C:WINDOWS>ftp 192.168.2.33
  Connected to 192.168.2.33.
  220 ProFTPD 1.2.0rc3 Server (ProFTPD Default Installation)[ftpd.test.com.cn]
  User (192.168.2.33none)): ideal
  Password:
  230 User ideal logged in.
  ftp>
ProFTPD的控制命令:/etc/rc.d/init.d/proftpd stop 關閉伺服器
                       /etc/rc.d/init.d/proftpd start 啟動伺服器
                       /etc/rc.d/init.d/ proftpd reload 重新載入修改後的配置文件etc/proftpd.conf並且啟動伺服器。

    4.建立一個安全的匿名ProFTPD站點

    如果人們只需要從FTP伺服器等到一些小文件(幾兆),可以使用Apache web伺服器代替匿名FTP站點。如果要通過一個匿名賬號頻繁上傳、下載文件,就要建立一個安全的ProFTPD伺服器。下面是配置文件/etc/proftpd.conf內容(其中incoming目錄容許用戶上傳文件):
<Anonymous ~ftp>
User ftp
Group ftp
RequireValidShell off
UserAlias anonymous ftp
MaxClients 40
<Directory *>
<Limit WRITE>
DenyAll
</Limit>
</Directory>
<Directory incoming>
<Limit WRITE>
AllowAll
</Limit>
<Limit READ>
DenyAll
</Limit>
</Directory>
</Anonymous>

    根據以上內容建立的ProFTPD伺服器會為自動連接到匿名ProFTPD伺服器的用戶創建一個chroot限制,用戶的主目錄為站點的根目錄。下面解釋主要配置指令的作用:
User 和 Group:這兩個指令確保User ftp和Group ftp擁有所有匿名會話。
RequireValidShell:由於在/etc/passwd中沒有用戶FTP的有效列表,所以該指令說明ProFTPD允許User ftp的匿名會話。
UserAlias:該指令把anonymous賦予FTP賬號,以便所有用戶可以使用ftp和anonymous作為用戶名登錄匿名FTP伺服器。
MaxClients:這裡限制匿名連接數目是40,你可以根據系統負載設定連接數目。
<Directory>容器:這些容器給定目錄的各種限制:
第一個目錄容器對每個用戶和每個目錄禁止寫許可權(包括上傳、刪除和修改)。
第二個目錄容器在incoming子目錄中給每個用戶寫許可權。
最後一個Limit指令確保在incoming子目錄中上傳文件的用戶不能查看和恢復目錄中的文件。

    5. 設定虛擬主機

  可以通過指令:VirtualHost來實現虛擬主機,一個最簡單的例子:
  <VirtualHost 192.168.2.35>
  ServerName "virtual FTP server"
  </VirtualHost>
若你僅僅希望通過匿名訪問某個虛擬主機,則使用如下的指令:
  
<Anonymous ~student>
User student
Group ftp
MaxClientsPerHost 1 "Sorry,This ftp only use one's IP connect!!"
AnonRequirePassword on
RateReadBPS 512000     “限制帶寬最大速度”
RateReadFreeBytes 512000
RateReadHardBPS on
<Limit LOGIN /home/student/*>
Order allow,deny
Allow from 192.16.*.*   “限制IP登陸範圍”
Deny from all
</Limit>
<Limit READ>   “設置/home/student用戶可以讀”
AllowAll
</Limit>
<Limit DELE>   “不能刪除 文件”
DenyAll
</Limit>
<Limit RNFR>   “不可更名文件”
DenyAll
</Limit>
<Limit MKD>   “不可建立文件目錄”
DenyAll
</Limit>
</Anonymous>
Limit參數說明:
CWD  :Change Working Directory,變換目錄之意;
MKD  :MaKe Directory,可建立目錄與否;
RNFR :ReName FRom,可更改檔名與否;
DELE :DELEt,可刪除文件語法;
RMD  :ReMove Directory,可移除目錄與否;
RETR :RETRieve,下載之意由伺服器傳送數據到客戶端;
READ :可讀取與否 ;
WRITE:可寫入與否 ;
STOR :STORe,上傳之意,由客戶端傳送數據到伺服器;
ALL  :允許全部的動作;

二、 基本加固ProFTPD伺服器步驟

   1.升級版本
    升級陳舊的ProFTPD版本,因為早期的ProFTPD版本存在的安全漏洞。對於一個新配置的ProFTPD伺服器來說使用最新穩定版本是最明智的選擇,可以在其官方網站下載其源代碼進行編譯。ProFTPD最新版本是1.3.0,官方網址:http://www.ProFTPD.org

   2.理解ProFTPD伺服器運行方式
    守護進程(Daemon)定義:是在電腦啟動時就被運行的,並在系統中持續運行的進程, 它等待著隨時為客戶提供自身負責的服務。守護進程的工作就是打開一個端口,並且等待(Listen)進入的連接。 如果客戶提請了一個連接,守護進程就創建(fork)子進程來響應此連接, 而父進程繼續監聽更多的服務請求。正因為如此,每個守護進程都可以處理多個客戶服務請求。ProFTPD能以Stand-alone、xinetd兩種模式運行。首先我們要理解這兩個模式的含義。

    (1)Stand-alone(運行獨立)守護進程
    Stand-alone(獨立運行)守護進程由init腳本負責管理,所有獨立運行的守護進程的腳本在/etc/rc.d/init.d/目錄下。系統服務都是獨立運行的守護進程包括:syslogd和cron等。運行獨立的守護進程工作方式稱作:stand-alone。它Unix傳統的C/S模式的訪問模式。伺服器監聽(Listen)在一個特點的端口上等待客戶端的連線。如果客戶端產生一個連接請求,守護進程就創建(Fork)一個子伺服器響應這個連接,而主伺服器繼續監聽。以保持多個子伺服器池等待下一個客戶端請求。stand-alone模式工作原理見圖5。
  
圖5 stand-alone工作模式

    工作在stand-alone模式下的網路服務有route、gated。另外是大家最熟悉是Web伺服器:Apache和郵件伺服器Sendmail、域名伺服器Bind。因為這些負載很大伺服器上,預先創子伺服器,可以通過客戶的服務速度。在Linux系統中通過stand-alone工作模式啟動的服務由/etc/rc.d/下面對應的運行級別當中的符號鏈結啟動。

(2)xinetd模式
    從守護進程的概念可以看出,對於系統所要通過的每一種服務,都必須運行一個監聽某個端口連接所發生的守護進程,這通常意味著資源浪費。為了解決這個問題,Linux引進了“網路守護進程服務程式”的概念。Redhat Linux 9.0使用的網路守護進程是xinted(eXtended InterNET daemon)。和stand-alone模式相比xinted模式也稱 Internet Super-Server(超級伺服器)。xinetd能夠同時監聽多個指定的端口,在接受用戶請求時,他能夠根據用戶請求的端口不同,啟動不同的網路服務進程來處理這些用戶請求。可以把xinetd看做一個管理啟動服務的管理伺服器,它決定把一個客戶請求交給那個程式處理,然後啟動相應的守護進程。xinetd模式工作原理見圖6。

圖6 xinetd工作模式


    和stand-alone工作模式相比,系統不想要每一個網路服務進程都監聽其服務端口。運行單個xinetd就可以同時監聽所有服務端口,這樣就降低了系統開銷,保護系統資源。但是對於訪問量大、經常出現併發訪問時,xinetd想要頻繁啟動對應的網路服務進程,反而會導致系統性能下降。察看系統為Linux服務提供那種模式方法在Linux命令行可以使用pstree命令可以看到兩種不同方式啟動的網路服務。一般來說系統一些負載高的服務:sendmail、Apache服務是單獨啟動的。而其他服務類型都可以使用xinetd超級伺服器管理。守護進程的分類:系統守護進程:如atd、crond、lpd、syslogd、login等。網路守護進程:如sshd、httpd、sendmail、xinetd等。
    查看目前運行的守護進程樹可以使用命令:“pstree”。pstree指令用ASCII字符顯示樹狀結構,清楚地表達程式間的相互關係。如果不指定程式識別碼或用戶名稱,則會把系統啟動時的第一個程式視為基層,並顯示之後的所有程式。若指定用戶名稱,便會以隸屬該用戶的第一個程式當作基層,然後顯示該用戶的所有程式。主要命令選型:

 -a  顯示每個程式的完整指令,包含路徑,參數或是常駐服務的標示。
 -c  不使用精簡標示法。
 -G  使用VT100終端機的列繪圖字符。
 -h  列出樹狀圖時,特別標明現在執行的程式。
 -H<程式識別碼>  此參數的效果和指定"-h"參數類似,但特別標明指定的程式。
 -l  採用長列格式顯示樹狀圖。
 -n  用程式識別碼排序。預設是以程式名稱來排序。
 -p  顯示程式識別碼。
 -u  顯示用戶名稱。
 -U  使用UTF-8列繪圖字符。
  pstree 輸出介面見圖7()內是進程號。

圖7 pstree 輸出介面


    xinetd提供類似于inetd+tcp_wrapper的功能,但是更加強大和安全。xinetd(eXtended InterNET services daemon)提供類似于inetd+tcp_wrapper的功能,但是更加強大和安全。它能提供以下特色:
  • 支援對tcp、ucp、RPC服務(但是當前對RPC的支援不夠穩定) 。
  • 基於時間段的訪問控制 。
  • 功能完備的log功能,即可以記錄連接成功也可以記錄連接失敗的行為。
  • 能有效的防止DoS攻擊(Denial of Services) 。
  • 能限制同時運行的同意類型的伺服器數目 。
  • 能限制啟動的所有伺服器數目 。
  • 能限制log文件大小 。
  • 將某個服務綁定在特定的系統介面上,從而能實現只允許私有網路訪問某項服務 。
  • 能實現作為其他系統的代理。如果和ip偽裝結合可以實現對內部私有網路的訪問。
    原則上任何系統服務都可以使用xinetd,然而,我認為,最適合應該是哪些常用的internet服務,同時,這個服務的請求數目和頻繁程度不會太高。象DNS和Apache就不適合採用這種方式,而象Ftp、telnet、 SSH等就很適合使用xinetd方式,系統默認使用xinetd的服務可以分為如下幾類:
  1、標準internet服務:telnet ftp
  2、資訊服務:finger netstat systat
  3、郵件服務:imap imaps pop2 pop3 pops
  4、RPC服務:rquotad rstatd rusersd sprayd walld
  5、BSD服務:comsat exec login ntalk shell talk
  6、內部服務:chargen daytime echo servers services time
  7、安全服務:irc
  8、其他服務:name uucp

Red Hat 中xinetd 的配置文件:主配置文件:/etc/xinetd.conf,每一個由xinetd啟動的服務在目錄/etc/xinetd.d/下都有一個以服務名稱命名的配置文件。在主配置文件/etc/xinetd.conf中將/etc/xinetd.d目錄下的所有文件的內容使用 includedir /etc/xinetd.d語句包含進來。xinetd的配置選項見表-1。

表 1. xinetd的指示符


    xinetd能有效的防止拒絕服務攻擊(Denial of Services)原理:
    (a)限制同時運行的進程數:

    通過設置instances選項設定同時運行的併發進程數:
instances=20
    當伺服器被請求連接的進程數達到20個時,xinetd將停止接受多出部分的連接請求。直到請求連接數低於設定值為止。
    (b)限制一個IP地址的最大連接數:

    通過限制一個主機的最大連接數,從而防止某個主機獨佔某個服務。
per_source=5
    這裡每個IP地址可以連接單個IP地址的連接數是5個。

    (c)限制負載:

    xinetd還可以使用限制負載的方法防範拒絕服務攻擊。用一個浮點數作為負載系數,當負載達到這個數目的時候,該服務將暫停處理後續的連接:
max_load = 2.8
    上面的例子中當一項系統負載達到2.8時,所有服務將暫時中止,直到系統負載下降到設定值以下。說明要使用這個選項,編譯時要加入--with-loadavg ,xinetd將而已處理max-load配置選項。從而在系統負載過重時關閉某些服務進程,來實現某些拒絕服務攻擊。

    (d)限制所有伺服器數目(連接速率):

    xinetd可以使用cps選項設定連接速率,下面的例子:
cps = 25 60
    第一個參數表示每秒可以處理的連接數,如果超過了這個連接數之後進入的連接將被暫時停止處理;第二個參數表示停止處理多少秒後繼續處理先前暫停處理的連接。即伺服器最多啟動25個連接,如果達到這個數目將停止啟動新服務60秒。在此期間不接受任何請求。

3.儘量使用xinetd方式運行ProFTPD伺服器
    ProFTPD能以Stand-alone、xinetd兩種模式運行。當用戶賬號比較少又經常需要連接到ProFTPD伺服器時推薦使用xinetd模式運行。使用xinetd方式運行ProFTPD可以有效防範DoS攻擊。使用xinetd方式運行ProFTPD的步驟:
    (1)檢查確省運行情況

    確省情況下ProFTPD以stand-alone工作模式運行,可以使用“ps aux| grep proftpd”命令查看進程號,然後使用kill命令中止運行。

    (2)修改配置文件

    修改/etc/proftpd.conf文件的ServerType選項由“standalone”改為“inetd”。

    (3)建立用戶組

    groupadd nogroup
    (4)創建配置文件/etc/xinetd.d/proftpd,代碼如下:

service ftp
{
flags = REUSE
socket_type = stream   “服務的數據封包類型為stream”
instances = 30           “最多可以同時建立30個ftp連接。”
max_load = 3.0        “最大負載“
wait = no         “不需等待,即ftp服務將以多線程的方式運行”
user = root         “執行此服務進程的用戶是root”
server = /usr/local/sbin/proftpd “啟動腳本位置”
log_on_success = HOST PID
log_on_failure = HOST RECORD
disable = no   “允許運行proftpd”
}

    (5)重新啟動xinetd配置

    killall -USR1 xinetd

    (6)使用命令連接伺服器

    可以使用“ftp localhost”連接本地伺服器,如果連接被拒絕,可以使用命令:
    tail -f /var/log/messages查看錯誤資訊。

四、其他安全策略

1.隱藏ProFTPD伺服器版本資訊
    通常軟體的BUG資訊是和特定版本相關的,因此版本號是駭客尋求最有價值的資訊。隱藏ProFTPD版本號比較簡單,修改配置文件:/etc/Proftpd.conf:
ServerIdent off

2.偽裝ProFTPD伺服器
    Windows下的FTP服務多是Serv-U,可以把ProFTPD偽裝為Serv-U,方法是修改配置文件proftpd.conf,添加如下內容:
ServerIdent on \"Serv-U FTP Server v5.0 for WinSock ready...\"
存盤退出後,重新啟動proftpd服務,登錄到修改了提示資訊的FTP伺服器進行測試:
C:\\>ftp 192.168.0.1
Connected to 192.168.0.1.
220 Serv-U FTP Server v5.0 for WinSock ready...
User (192.168.0.1none)):
331 Password required for (none).
Password:
530 Login incorrect.
Login failed.
ftp > quit
221 Goodbye.
    這樣從表面上看,伺服器就是一個運行著Serv-U的Windows了。

3. 使用非root許可權運行ProFTPD
    以非root許可權運行ProFTPD 。修改配置文件:/etc/Proftpd.conf:
User nobody      #設置FTP服務以nobody運行
Group nogroup        #注意:原來是“Group nobody”,一定要改為“Group nogroup ”
上面的配置表示以nobody用戶身份運行ProFTPD伺服器 。使用nobody身份運行能夠降低緩衝區溢出攻擊所帶來的危險。

4.監控ProFTPD伺服器運行情況
    通常新部署一個ProFTPD伺服器之後需要進行一段時間的監控:記錄FTP連接記錄、誰連接到我的FTP伺服器。Proftpd本身附帶了幾個命令可以使用。
    (1) 記錄FTP連接數
    使用usr/local/bin/ftpcout命令,可以顯示FTP伺服器連接用戶數量資訊。 我們還可以使用watch命令配合使用,運行下面命令:
watch -n 360 /usr/local/bin/ftpcount
    這個命令每三百六十秒顯示一次連接用戶數量的資訊。
    (2) 搜尋誰與FTP伺服器連接
    使用usr/local/bin/ftpwho命令可以顯示誰連接到FTP伺服器。一個簡單的輸出如下:
Master proftpd process 8322:
8387 0m1s proftpd: sheila - reboot.intevo.com: IDLE
8341 3m59s proftpd: kabir - k2.intevo.com: IDLE
- - 2 users
    以上輸出顯示有兩個用戶(sheila和kabir)從不同的電腦連接到FTP伺服器,輸出內容還包括:為這些用戶服務的ProFTPD的進程和主ProFTPD的進程ID。

5.修改配置文件伺服器
    ProFTPD使用的配置文件和Apache類似:
    單線指令:ServerName 和 ServerType
    多線容器指令:<Directory>和 <Limit>
    如果以前配置過Apache的話,會很容易掌握。Proftpd伺服器配置文件etc/Proftpd.conf中的許多選項可以加固伺服器。

(1)通過IP地址限制FTP訪問
    假設要允許主機名稱myhost.domain.com訪問FTP伺服器,首先使用命令:
Ping myhost.domain.com
假設等到IP地址是:216.112.169.138。下面修改配置文件,加入以下內容:
<Limit LOGIN>
Order Allow, Deny
Allow from 216.112.169.138
Deny from all
</Limit>
    注意不要在Allow命令後直接使用主機名稱,因為檢查主機名稱會降低伺服器的運行速度。另外主機名稱比IP地址更具有欺騙性。如果myhost.domain.com沒有固定IP地址,主機用戶在下一次從ISP獲得一個IP地址時就無法和FTP伺服器連接。這時必須給整個網路授予FTP訪問的許可權。命令如下:“Allow from 216.112.169.” 。

(2)使用PAM作為ProFTPD授權用戶的鑒別方法
    ProFTPD可以加入嵌入式認證模組,成為PAM-aware的FTP伺服器。PAM全稱:Pluggable Authentication Module (嵌入式認證模組)。它最初有SUN公司開發;很快被Linux社區的接受,並且開發了更多的模組。其目標是提供一套可用於驗證用戶身份的函數庫,從而將認證從應用程式開發中獨立出來。Linux-PAM處理四種獨立的(管理)工作。它們是: 認證管理; 帳號管理; 會話期間管理;和口令管理。
    PAM工作方式:
(1)       調用某個應用程式,以得到該程式的服務。
(2)       PAM應用程式調用後臺的PAM庫進行認證工作。
(3)       PAM庫在/etc/pam.d/目錄中搜尋有關應用程式細節的配置文件,該文件告訴PAM,本應用程式使用何種認證機制。
(4)       PAM庫裝載所需的認證模組。
(5)       這些模組可以讓PAM與應用程式中的會話函數進行通信。
(6)       會話函數向用戶要求有關資訊。
(7)       用戶對這些要求做出回應,提供所需資訊。
(8)       PAM認證模組通過PAM庫將認證資訊提供給應用程式。
(9)       認證完成後,應用程式做出兩種選擇:
*將所需許可權賦予用戶,並通知用戶。
*認證失敗,並通知用戶。PAM工作流程見圖8。
  
圖8 PAM工作流程

    下面手工建立一個/etc/pam.d/ftp文件包括以下內容:
%PAM-1.0
auth required /lib/security/pam_listfile.so item=user \
sense=deny file=/etc/ftpusers onerr=succeed
auth required /lib/security/pam_stack.so service=system-auth
auth required /lib/security/pam_shells.so
account required /lib/security/pam_stack.so service=system-auth
session required /lib/security/pam_stack.so service=system-auth
然後在配置文件/etc/Proftpd.conf加入兩行:
AuthPAMAuthoritative on
AuthPAMConfig ftp
    這樣ProFTPD伺服器會自動把/etc/pam.d/ftp配置用於用戶授權。這樣用戶連接到ProFTPD伺服器時都由PAM使用/etc/pam.d/ftp文件進行認證。

(3)對FTP用戶使用chroot限制
    Unix(以及類Unix)作業系統提供了一種功能,讓用戶在重新映射的根文件系統中執行進程。chroot(更改根目錄)命令會將根(/)文件系統的重新映射轉換成相對於當前根目錄的指定目錄,然後在新的根目錄下執行指定的命令。ProFTPD伺服器要限制普通FTP用戶可以訪問的目錄,配置很簡單,如果限制skate組的skate用戶登錄時不能切換到其他目錄,修改配置文件加入一行:
DefaultRoot ~ skate,skate
    這樣他只能呆在自己的home目錄中。警告: 正如在真實生活中一樣,沒有監牢是不可攻破的。使用網路常駐程式中任何已知的弱點,惡意的用戶可以上載並執行刻意編制的程式代碼,促使系統核心允許他們衝破chroot,因而能夠追蹤其他不屬於已更換根目錄環境的進程,或者以你不會喜歡的方式來利用可用的設備。在chroot監牢中執行不安全的常駐程式可擋住大多數利用該常駐程式來侵入伺服器電腦的舉動。不過,你不能企望chroot能讓伺服器完全安全!務必遵守其他步驟。

(4)限制FTP命令特權
    *禁止一些用戶創建和刪除目錄的特權
    如果發現一些用戶有威脅行為,可以把他放在一個特定組中(badusers)使用如下的配置:
<Directory /*>
<Limit MKD RMD>
Order deny,allow
DenyGroup badusers
AllowAll
</Limit>
</Directory>
    這樣除了那個特定的用戶組之外,其他用戶可以創建和刪除目錄。
   
    *建立只能上載的FTP伺服器
    如果要建立一個只能上載的FTP伺服器,在主伺服器或者虛擬主容器中使用如下配置:
<Directory /*>
<Limit RETE>
DenyAll
</Limit>
</Directory>
  
    *限制對單個目錄的訪問。

<Directory /*>
<Limit CWD>
DenyAll
</Limit>
</Directory>
    這樣相應的FTP用戶就不能更改目錄。如果使用DenyGroup groupname代替DenyAll ,將配置範圍限定在/etc/group文件中定義的groupname用戶組中。

    *限制目錄瀏覽特權
<Directory /my/mp3s>
<Limit DIRS>
DenyGroup newfriends
</Limit>
</Directory>
以上配置可以限制/my/mp3s目錄中名為newfriends組的目錄瀏覽特權。這樣可以防止他得到/my/mp3s目錄的列表。

(5)控制FTP命令緩衝區大小
    許多駭客通過發送一個大尺寸的命令攻擊FTP伺服器,希望造成伺服器緩衝區溢出。可以在使用CommandBufferSize命令可以限制客戶端命令長度。通常設定為512。

(6)修改ProFTPD伺服器使用端口
    ProFTP如果使用Stand-alone模式,可以通過設置proftpd.conf來控制它。使用不同端口的設置也較為簡單,只需在proftpd.conf中將“Port xx”改為需要的值即可。

(7)使不同用戶之間相互隔離
    一些用戶通常訪問ISP的FTP伺服器時,會看到一些不應當的系統資訊,因此隱藏這些資訊是必要的,下面是一個配置:
DefaultRoot “/www”
<Directory /www>
HideNoAccess on
<Limit ALL>
IgnoreHidden on
</Limit>
</Directory>
HideNoAccess指令將用戶隱藏/www 目錄下的所有條目,IgnoreHidden指令指示ProFTPD 伺服器忽略用戶所有指令。

(8)簡化配置文件
    對於初學者來說看到大量的配置文件和註釋時反到會感到不知所措。如果/etc/group 中定義了一個novices的組,希望組用戶可以在 /ftp/download目錄中上傳和下載,可以如下配置proftpd.conf :
<Directory /ftp/download>
<Limit READ>
AllowGroup novices
</Limit>
<Limit WRITE>
DenyGroup novices
</Limit>
</Directory>
<Directory /ftp/upload>
<Limit READ>
DenyGroup novices
</Limit>
<Limit WRITE>
AllowGroup novices
</Limit>
</Directory>

五、加密FTP伺服器與客戶端連接
    傳統的網路服務程式FTP在本質上都是不安全的,因為它們在網路上用明文傳送口令和數據,嗅探器非常容易就可以截獲這些口令和數據。而且,這些服務程式的安全驗證方式也是有其弱點的,就是很容易受到“中間伺服器”(server-in-the-middle)這種方式的攻擊。所謂“中間伺服器”的攻擊方式,就是“中間伺服器”冒充真正的伺服器接收你傳給伺服器的數據,然後再冒充你把數據傳給真正的伺服器。伺服器和你之間的數據傳送被“中間伺服器”轉手後做了手腳之後,就會出現很嚴重的問題。雖然近年來出現了很多種ftp的替代服務,例如ssh加密通道的sftp/scp,或使用IPSEC協議的VPN通道等等,但是在大多數情況下,ftp的通用性和易用性使得它在很長一段時間內必然無法被完全取代。所以如同其他一系列古董服務(例如SMTP/HTTP)一樣,近年來也出現了一些不需要對ftp協議自身做完全更改的協議擴展模組,能夠良好的完成相容性和功能擴展。ftp SSL/TLS Extension就是其中一種方式。
    SSL/TLS協議,SSL(Secure SocketLayer)最早是netscape公司設計的用於HTTP協議加密的安全傳輸協議,SSL工作于TCP協議的傳輸層(TCP層)和應用程式之間。作為一個中間層,應用程式只要採用SSL提供的一套SSL套接字API來替換標準的Socket套接字,就可以把程式轉換為SSL化的安全網路程式,在傳輸過程中將由SSL協議實現數據機密性和完整性的保證。SSL協議的當前版本為3.0,當SSL取得大規模成功後,IETF(www.ietf.org)將SSL作了標準化,規範為RFC2246,並將其稱為TLS(TransportLayerSecurity)。從技術上講,TLS1.0與SSL3.0的差別非常微小,SSL由於其歷史應用的原因在當前的商業應用程式之中使用得更多一些。
下面配置支援TLS的ProFTPD伺服器。

1.首先配置文件

# ./configure --with-modules=mod_tls \
--with-modules=mod_sql:mod_sql_mysql \
--with-includes=/usr/local/include \
--with-libraries=/usr/local/lib/mysql
# make;# make install

2. 接下來製作憑證

# mkdir /etc/ssl/certs
# mkdir /etc/ssl/private
# chmod og-rwx /etc/ssl/private
# mkdir /etc/ssl/crl
# mkdir /etc/ssl/newcerts
修改 /etc/ssl/openssl.cnf
把 dir = ./demoCA 改成 dir = /etc/ssl

3.製作最高層認證中心 (Root CA)

Private Key ( Public Key )
# openssl genrsa -des3 -out /etc/ssl/private/myrootca.key 2048
# chmod og-rwx /etc/ssl/private/myrootca.key
填寫憑證申請書 (然後按照問題回答即可)
#openssl req -new -key /etc/ssl/private/myrootca.key -out /tmp/myrootca.req
簽發憑證
# openssl x509 -req -days 7305 -sha1 -extfile /etc/ssl/openssl.cnf
-extensions v3_ca -signkey /etc/ssl/private/myrootca.key -in /tmp/myrootca.req -out /etc/ssl/certs/myrootca.crt
# rm -f /tmp/myrootca.req
製作伺服器用的憑證
Private Key ( Public Key )
# openssl genrsa -out /etc/ssl/private/myhost.key 2048
# chmod og-rwx /etc/ssl/private/myhost.key
填寫憑證申請書
# openssl req -new -key /etc/ssl/private/myhost.key -out /tmp/myhost.req

4.用最高層認證中心簽發憑證

# openssl x509 -req -days 3650 -sha1 -extfile /etc/ssl/openssl.cnf
-extensions v3_req -CA /etc/ssl/certs/myrootca.crt -CAkey /etc/ssl/private/myrootca.key -CAserial /etc/ssl/myrootca.srl -CAcreateserial -in /tmp/myhost.req -out /etc/ssl/certs/myhost.crt
# rm -f /tmp/myhost.req

5. 接下來設定/usr/local/etc/proftpd.conf,主要是在最後加上以下有關TLS的設定

< IfModule mod_tls.c >
TLSEngine on
TLSLog /var/log/tls.log
TLSProtocol SSLv23
TLSOptions NoCertRequest
TLSRequired On
TLSRSACertificateFile /etc/ssl/certs/myhost.crt
TLSRSACertificateKeyFile /etc/ssl/private/myhost.key
TLSCACertificateFile /etc/ssl/certs/myrootca.crt
TLSVerifyClient On
< /IfModule >
    使用支援TSL技術的客戶端連接FTP伺服器。到此為止伺服器端安裝設置完畢,登陸伺服器的客戶端使用FlashFXP , FlashFXP由於安裝使用的文章比較多,所以本文就不詳細介紹了。其他支援TLS連接的客戶端很多windows環境下的FileZilla、UltraFXP,Linux環境下的C-kermit 8.0(http://www.columbia.edu/kermit/ck80.html ),fireftp(firefox瀏覽器的ftp插件下載鏈結:http://releases.mozilla.org/pub/mozilla.org/extensions/fireftp/fireftp-0.94.2-fx.xpi )和lftp(http://lftp.yar.ru/ )。
    lftp 是一個功能強大的下載工具,它支援訪問文件的協議: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在編譯的時候包含openssl庫)。llftp的介面非常想一個shell: 有命令補全,歷史記錄,允許多個後臺任務執行等功能,使用起來非常方便。它還有書籤、排隊、鏡像、中斷點續傳、多進程下載等功能。
    命令行語法
lftp [OPTS] <site>
`lftp' 是在 rc 文件執行後 lftp 執行的第一個命令
-f <file>           執行文件中的命令後退出
-c <cmd>            執行命令後退出
--help              顯示幫助資訊後退出
--version           顯示 lftp 版本後退出
其他的選項同 `open' 命令
-e <cmd>            在選擇後執行命令
-u <user>[,<pass>]  使用指定的用戶名/口令進行驗證
-p <port>           連接指定的端口
<site>              主機名, URL 或書籤的名字
    如果在命令行中輸入的站點名稱,lftp將直接登錄站點,如果在命令行不輸入站點名稱,則必須在進入到lftp介面後用open命令打開 。
    更多可以支援TSL的FTP客戶端查看列表:http://www.ford-hutchinson.com/~fh-1-pfh/ftps-ext_col.html
    這樣我們就成功的為FTP增添了TSL加密連接.而一個比較完整安全的FTP站點也配置完成了 。

返回列表