天天看點

建構安全的Web伺服器----goodloveboys [精彩] [轉]FreeBSD下建構安全的Web伺服器

[精彩] [轉]FreeBSD下建構安全的Web伺服器

    http://www.chinaunix.net 作者: goodloveboys  發表于:2005-06-24 20:28:52   【 發表評論】【 檢視原文】【 Web伺服器讨論區】【 關閉】  

雖然個人認為部分有點出入, 但是貴在比較全, HOHO,  看看也是一種學習,  有的還真沒有見過

建立時間:2005-06-23

文章屬性:原創

文章送出:heiyeluren (heiyeshuwu_at_163.com)

* 作者:heiyeluren

* 建立:2005-04-10 20:38

* 修改:2005-05-14 23:25

* 郵箱:heiyeluren_at_163.com

* 首頁:http://www.unixsky.net

* 部落格:http://blog.csdn.net/heiyeshuwu

::目錄::

序言

一、系統和服務程式的安裝

1. 系統安裝

2. 服務程式安裝

二、系統安全設定

1. 使用者控制

2. 檔案通路控制

3. 系統服務和端口控制

4. 日志管理和控制

5. 檔案指紋檢測

6. 系統指紋洩露和防範

7. 系統核心安全

8. 系統安全優化

三、服務程式的安全設定

1. Apache安全設定

2. PHP安全設定

3. Mysql安全設定

4. vsFTPd安全設定

5. SSH的安全設定

四、防火牆的安裝和設定

1. 安裝ipfw

2. 配置ipfw

五、Unix/Linux上的後門技術和防範

1. 帳号後門

2. shell後門

3. cron服務後門

4. rhosts後門

5. Login後門

6. Bind後門

7. 服務後門

8. rootkit後門

9. 核心後門

10. 其他後門

六、結束語

附錄

序言

在我們跑Web伺服器的時候,大家可能都會一緻認為使用Linux+Mysql+Apache+PHP整個開源的系統是比較好的選擇,但是我個人認為這是不合理的,首先要根據你的應用來覺得你使用什麼服務。假如你需要跑Oracle等大型應用的話,而且Oracle在Linux下是支援的比較好的,那麼使用Linux是個好的選擇,因為在FreeBSD下安裝Oracle是個非常麻煩的事情。那麼如果是跑普通的網站應用的話,我覺得使用 FreeBSD+ Mysql+Apache+PHP是個好的選擇,因為對于一個網站來講,穩定安全是第一位的,否則你的網站什麼時候被人修改了都不知道怎麼回事,或者被黑客入侵,把資料修改或者删除,那就糟糕了,畢竟現在什麼紅客、黑客的一堆,不能不防。當然,不是說Linux不安全,但是在Linux 下內建了很多不安全的程式,導緻了它的不安全,但如果設定的好,Linux一樣可以很安全。在中國網絡應急響應中心(http://www.cert.org.cn)這幾個月的資料來看,每個月被入侵成功最高的是 Linux系統,占百分之六十多,然後過來是Windows系統,占百分之三十多,而FreeBSD的入侵比例是百分之幾。

任何系統都可以很安全,也可以很不安全,關鍵是管理者怎麼做的,世界上沒有最安全的系統,隻有更安全的系統。下面的文章就是

在FreeBSD平台上建構一個比較安全的Web伺服器,希望對網管和網絡安全愛好者能有一些啟發,權當抛磚引玉,希望能夠有更好闡述的文章。

一、系統和服務程式的安裝

1. 系統安裝

為了保證系統的安全,我們系統準備采用最新的FreeBSD版本,首先是安全,系統相容性也比較好,這個主要是個人習慣和需求,為了簡單起見,這裡我們選用了最新的FreeBSd5.3版本進行安裝。整個安裝過程我就不講了,如果不清楚的朋友可以參考FreeBSD中文手冊(http: //www.freebsd.org.cn),整個過程不是很複雜,雖然沒有Windows/Linux的系統安全簡單,但是比起有些Unix的安裝來講是人性許多的。安裝中必須把基本包和核心源代碼都裝上,為了以後編譯核心友善,如果另外,如果喜歡使用ports安裝軟體的話,還要把ports裝上,但是盡量一些沒有必要的程式不要裝。如果要安裝 Webmin等,還要把perl等包裝上。系統檔案拷貝完以後,會要求配置一些設定,比如把IP位址、名字伺服器等設好,不要打開IPv6,不需要 DHCP等服務,不要系統預設的FTP服務,配置 /etc/inetd.conf 時把 SSH服務打開,友善我們進行遠端管理,如果不想使用inetd這個超級服務來管理的話,可以關閉它,在/etc/rc.conf中添加  inetd_enable="NO",然後設定sshd_enable="YES"一樣可以打開SSH服務,後面我們會詳細談到SSH的設定。

系統裝完後,在 /etc/inetd.conf 中把除了ssh之外的服務全部關閉,特别是telnet和rlogin等服務,一定要慎重,否則很可能每幾天系統就被入侵了。安裝完系統後,建議對系統進行更新,比如使用 make world 或 cvsup 把系統核心和ports進行更新。這個步驟和Windows裝完後打更新檔差不多。

2. 服務程式安裝

系統裝完以後,就開始安裝我們的應用軟體,我們的方針還是最新的軟體是最安全的,比如能夠防止一些老版本中的溢出等等。我們基本就是要讓我們的系統有資料庫,同時能夠處理Web服務,同時能夠遠端對網站進行檔案管理的FTP服務。我們基本選擇的程式都是比較通常的程式。另外,為了有個可視化的管理工具,我們同時也可以安裝一個基于浏覽器的管理工具Webmin,友善沒有ssh用戶端等等的時候進行管理。

首先我們選用的Web服務是Apache httpd 2.0.53,這是目前的最新版本,當然你也可以考慮1.3的版本,主要是看個人習慣。我們網站是PHP程式編寫,是以要安裝PHP,版本是 4.3.11,也是最新的版本,如果你的網站程式需要PHP5的支援,那麼可以下載下傳 php5.0.4。資料庫還是最快速的Mysql,選擇的版本是最新的 4.0.23,如果你需要外鍵、事務、子查詢、存儲過程等的支援,那麼你可以考慮 4.1和5.0的版本。最後我們的FTP選擇最安全的vsFTPd,因為它是最安全快速的,我在區域網路中測試它的最高創數速率能夠達到10MB/S, proFTPd隻有8MB/S,vsFTPd針對小型FTP伺服器支援非常好,畢竟我使用者不多,幾個更新網站而已,當然,如果你喜歡簡單友善,也可以考慮使用FreeBSD自帶的FTPd,功能和易用性也是不錯的。如果你使用者比較多,并且功能要求比較高,建議使用proFTPd、pure-FTPd、wu -FTPd等,但有些FTPd不是非常安全,選擇時候一定要慎重考慮。

伺服器程式清單:

Apache 2.0.53 下載下傳位址:http://httpd.apache.org

PHP 4.3.11 下載下傳位址:http://www.php.net

Mysql 4.0.23 下載下傳位址:http://dev.mysql.com

vsFTPd 2.0.2 下載下傳位址:http://vsftpd.beasts.org

反正最少的服務+最少的端口+安全的設定 = 最大的安全,盡量能夠不需要使用的服務就不要安裝,比如telnetd、rlogind等,那麼相反會對伺服器安全構成威脅。

安裝以上程式你可以采用手工編譯安裝,也可以采用FreeBSD的ports 來進行安裝,這看個人愛好,我個人比較喜歡使用手工安裝,如果不明白具體安裝的朋友可以參考我的Blog上關于安裝Apache+PHP+Mysql的方法。

二、系統安全設定

1. 使用者控制

盡量少的使用者,我們的FTP帳戶是和系統帳戶綁定在一起的,是以我們添加使用者的時候先建立一個目錄,然後把建立的使用者主目錄指向到該目錄下。假設我需要一個使用者能夠管理我的網站,而我網站的目錄是在 /usr/www 目錄下,那麼我們建立立的使用者 www_user 的主目錄就指向  /usr/www 目錄,同時它的shell是沒有的:/usr/sbin/nologin ,主要是為了防止它通過ssh登陸到系統。同時FTP的密碼也要設定的非常複雜,防止黑客通過暴力破解獲得FTP權限。另外還要說道我們的root使用者的密碼,我想最少應該不要少于10位的數字+字母+字元的密碼(我的密碼是18位),否則是非常不安全的,如果密碼簡單,那麼黑客通過短時間的暴力破解 SSH中的root帳戶,不用幾天,系統就可能被攻破了,同時也建議最少一個月更改一次root使用者的密碼。(強烈建議一般帳戶不要有登陸系統的權限,就是把shell設為/usr/sbin/nologin)

一般如果要使用root權限建議建立一個屬于wheel組的小使用者,然後登陸後通過su指令提升為root使用者進行管理,如果黑客通過破解了我們普通使用者的權限後登陸系統,也不能直接通過root權限進行管理,這是一種安全防範的簡單方法。

2. 檔案通路控制

有時候被黑客入侵後拿到了小權限使用者,比如傳了一個WebShell到系統中,那麼對方很可能會把 /etc/passwd 等内容直接讀取出來,同時檢視/etc/master.passwd中對加密後的root使用者的密碼hash進行破解,最後拿到密碼進行登陸系統。那麼我們就要控制部分檔案隻有root能夠通路,其他使用者無權通路。比如uname,gcc等,如果黑客拿到小權限使用者後就會檢視系統版本,然後找到該版本系統對應的溢出程式,使用gcc來進行編譯,如果我們能夠限制黑客通路uname和gcc等程式,能在一定程度上減緩黑客入侵的腳步。

使用chmod來改變某個檔案的權限資訊,比如我要 /etc/passwd 和 /etc/master.passwd 檔案隻能允許root通路:

使用八進制數字來設定

# chmod 700 /etc/passwd

# chmod 700 /etc/master.passwd

使用字元标記來進行設定

# chmod u+w+r+x,go-w-r-x /etc/passwd

# chmod u+w+r+x,go-w-r-x /etc/master.passwd

系統中有多個重要檔案需要設定控制通路權限,一定要控制好,否則将會構成重要威脅。

3. 系統服務和端口控制

端口開的越多就越給黑客多一個入侵的機會,服務越多,危險越大,因為你不知道那些服務是不是有潛在的漏洞或者又發現了新的漏洞,是以盡量少的服務,比如sendmail預設是打開的,那麼些建議你把sendmail關閉,關閉防範是在 /etc/rc.conf中加上:

sendmail_enable = "NONE",如果設為"NO"那麼隻能夠關閉掉pop3服務,不能關閉smtp的服務,是以要設定為"NONE"。

系統中最好除了我們能夠看到的Apache、Mysql、vsFTPd、SSH之外不要打開其他任何端口和服務。基本的方式是使用 netstat -a 檢視打開的端口,然後從對應的端口來找相關的服務,比如我們這裡應該隻允許開的端口有 21, 22, 80, 3306等,如果有其他端口,那麼一定要仔細檢查,很可能是黑客的後門或者是會對系統安全構成威脅的服務。同時有些服務不需要監聽網絡連接配接的話,隻是需要本地的連接配接,比如 Mysql,那麼就可以關閉Socket監聽,這個将在Mysql安全設定中講解,另外,可以通過防火牆來控制部分端口通路和連接配接狀況,比如Mysql的3306端口隻允許192.168.0.1通路,那麼我們就在ipfw裡添加規則:

ipfw add 10001 allow tcp from 192.168.0.1 to 10.10.10.1 80 in

這樣就能夠防止黑客來通路伺服器上的Mysql服務。具體防火牆的設定将在下面“防火牆設定”中詳細講解。

4. 日志管理和控制 (未完)

5. 檔案指紋檢測

檔案指紋就是我們檔案的基本資訊,比如檔案權限、檔案所屬使用者/組、檔案最後修改日期、檔案大小等等,這些都是重要資訊,一般黑客入侵後都可能修改檔案,那麼檔案指紋就不一樣了。另外,檔案的md5校驗值也屬于檔案的指紋的一種。

為了防止黑客篡改系統中的部分核心檔案,比如 /etc/passwd, /etc/shadow, /etc/inetd.conf 等等,那麼我們就可以考慮把部分重要檔案進行備份,同時做一份目前有的檔案的一個指紋保留,比如把 /etc,/bin, /usr/bin 目錄下的檔案進行指紋保留:

# ls -l /etc >; /var/back/etc.txt

# ls -l /bin >; /var/back/bin.txt

# ls -l /bin >; /var/back/usrbin.txt

當然,還有就是給每個重要的檔案加上md5校驗值,如果覺得不對勁的時候就進行比對,保證檔案的安全。

你可以給你覺得需要做指紋備份的目錄進行備份,一般這是為了以後被黑客入侵後的系統檢測和系統恢複。比如可以通過檔案被修改的時間來确定是不是被入侵,比如可以對比看 /etc/inetc.conf檔案和備份的檔案有什麼不同來确定是不是安裝了服務型後門等。

6. 系統指紋洩漏和防範 (未完)

一般黑客為了入侵某個系統,一定會先進行掃描等工作,掃描包括目标系統的端口開放情況和伺服器使用服務程式和作業系統情況。比如很簡單的手工檢測Web服務的指紋:

# telnet target.com 80

那麼就很可能傳回Apache和PHP的版本資訊,那麼同時也可能使用掃描工具對Mysql、vsFTPd、SSH等服務的端口進行掃描,擷取這些服務的指紋。多暴露一份系統資訊,那麼系統就多一份危險。那麼解決辦法就是把伺服器上服務程式的Banner全部修改掉,進而能夠迷惑黑客。

下面簡單的說一些修改那些服務Banner的方法。

* Apache

修改httpd.conf檔案,設定以下選項:

ServerSignature Off

ServerTokens Prod

上面的适用apache1***, apache 2.0這些都是預設 , 不過還是有server=Apache字樣, 若要完全去掉需重新編譯。

徹底地去掉banner, 修改httpd.h:

Include/httpd.h

Define SERVER_BASEVENDOR "Apache Group"

Define SERVER_PRODUCTVENDOR "Apache"

Define SERVER_BASEVERSION "1.3.27"

後從新編譯Apache就能夠完全去掉了。

* PHP

在php.ini中設定 expose_php = Off ,那麼将無法在 http頭資訊中看到php的版本資訊。

* Mysql

* vsFTPd

vsFTPd基本上是無法擷取到一些關于vsFTPd的banner資訊的,不過因為vsFTPd預設的banner資訊是 "Welcome to FTP Server!"對于高手來說,還是能夠猜測到一點,是以我們要徹底改掉。修改vsFTPd的配置檔案  vsftpd.conf 中的下面選項:

Ftpd_banner=xxxxx

把後面的xxxxx改為你想要的banner資訊。

* SSH

好象FreeBSD下預設安裝的SSH被telnet target.com 22 的時候會顯示SSH和FreeBSD的資訊,簡直是個大禍害,什麼都告訴别人了,但是目前為止我還不知道怎麼修改,知道的高手請指點。

7. 系統核心安全

FreeBSD有個比較強的功能,就是能夠定義系統核心的安全等級,主要是為了防止核心後門專門定制的,能通過不同的等級限制對核心的通路和對防火牆等的修改。我們首先要開啟系統的安全等級,然後設定安全等級,我們打開 /etc/rc.conf:

# ee /etc/rc.conf

加入下面的内容:

kern_securelevel_enable="YES"

kern_securelevel="-1"

第一句是打開安全等級,第二句是定義等級。它一共五個等級,下面說說不同之處。

* kern_securelevel -1:這是系統預設級别,沒有提供任何核心的保護錯誤;

* kern_securelevel  0:基本上作用不多,當你的系統剛啟動就是0級别的,當進入多使用者模式的時候就自動變成1級了。

* kern_securelevel  1:在這個級别上,有如下幾個限制:

a. 不能通過kldload或者kldunload加載或者解除安裝可加載核心子產品;

b. 應用程式不能通過/dev/mem或者/dev/kmem直接寫記憶體;

c. 不能直接往已經裝在(mounted)的磁盤寫東西,也就是不能格式化磁盤,但是可以通過标準的核心接口執行寫操作;

d. 不能啟動X-windows,同時不能使用chflags來修改檔案屬性;

* kern_securelevel  2:在 1 級别的基礎上還不能寫沒裝載的磁盤,而且不能在1秒之内制造多次警告,這個是防止DoS控制台的;

* kern_securelevel  3:在 2 級别的級别上不允許修改IPFW防火牆的規則。

如果你已經裝了防火牆,并且把規則設好了,不輕易改動,那麼建議使用3級别,如果你沒有裝防火牆,而且還準備裝防火牆的話,不建議使用。我們這裡推薦使用 2 級别,能夠避免比較多對核心攻擊。

8. 系統安全優化

一般優化系統主要是重新編譯核心,去掉一些不要的驅動等等,你可以參考我在我Blog上寫的關于編譯核心的文章。我們這裡對網絡和核心一些選項進行優化和安全設定。編輯 /etc/sysctl.conf 檔案,在裡面加入如下内容:(有注釋)

#最大的待發送TCP資料緩沖區空間

net.inet.tcp.sendspace=65536

#最大的接受TCP緩沖區空間

net.inet.tcp.recvspace=65536

#最大的接受UDP緩沖區大小

net.inet.udp.sendspace=65535

#最大的發送UDP資料緩沖區大小

net.inet.udp.maxdgram=65535

#本地套接字連接配接的資料發送空間

net.local.stream.sendspace=65535

#加快網絡性能的協定

net.inet.tcp.rfc1323=1

net.inet.tcp.rfc1644=1

net.inet.tcp.rfc3042=1

net.inet.tcp.rfc3390=1

#最大的套接字緩沖區

kern.ipc.maxsockbuf=2097152

#系統中允許的最多檔案數量

kern.maxfiles=65536

#每個程序能夠同時打開的最大檔案數量

kern.maxfilesperproc=32768

#當一台計算機發起TCP連接配接請求時,系統會回應ACK應答資料包。該選項設定是否延遲ACK應答資料包,把它和包含資料的資料包一起發送,在高速網絡和低負載的情況下會略微提高性能,但在網絡連接配接較差的時候,對方計算機得不到應答會持續發起連接配接請求,反而會降低性能。

net.inet.tcp.delayed_ack=0

#屏蔽ICMP重定向功能

net.inet.icmp.drop_redirect=1

net.inet.icmp.log_redirect=1

net.inet.ip.redirect=0

net.inet6.ip6.redirect=0

#防止ICMP廣播風暴

net.inet.icmp.bmcastecho=0

net.inet.icmp.maskrepl=0

#限制系統發送ICMP速率

net.inet.icmp.icmplim=100

#安全參數,編譯核心的時候加了options TCP_DROP_SYNFIN才可以用

net.inet.icmp.icmplim_output=0

net.inet.tcp.drop_synfin=1

#設定為1會幫助系統清除沒有正常斷開的TCP連接配接,這增加了一些網絡帶寬的使用,但是一些死掉的連接配接最終能被識别并清除。死的TCP連接配接是被撥号使用者存取的系統的一個特别的問題,因為使用者經常斷開modem而不正确的關閉活動的連接配接

net.inet.tcp.always_keepalive=1

#若看到net.inet.ip.intr_queue_drops這個在增加,就要調大net.inet.ip.intr_queue_maxlen,為0最好

net.inet.ip.intr_queue_maxlen=1000

#防止DOS攻擊,預設為30000

net.inet.tcp.msl=7500

#接收到一個已經關閉的端口發來的所有包,直接drop,如果設定為1則是隻針對TCP包

net.inet.tcp.blackhole=2

#接收到一個已經關閉的端口發來的所有UDP包直接drop

net.inet.udp.blackhole=1

#為網絡資料連接配接時提供緩沖

net.inet.tcp.inflight.enable=1

#如果打開的話每個目标位址一次轉發成功以後它的資料都将被記錄進路由表和arp資料表,節約路由的計算時間,但會需要大量的核心記憶體空間來儲存路由表

net.inet.ip.fastforwarding=0

#kernel編譯打開options POLLING功能,高負載情況下使用低負載不推薦SMP不能和polling一起用

#kern.polling.enable=1

#并發連接配接數,預設為128,推薦在1024-4096之間,數字越大占用記憶體也越大

kern.ipc.somaxconn=32768

#禁止使用者檢視其他使用者的程序

security.bsd.see_other_uids=0

#設定kernel安全級别

kern.securelevel=0

#記錄下任何TCP連接配接

net.inet.tcp.log_in_vain=1

#記錄下任何UDP連接配接

net.inet.udp.log_in_vain=1

#防止不正确的udp包的攻擊

net.inet.udp.checksum=1

#防止DOS攻擊

net.inet.tcp.syncookies=1

#僅為線程提供實體記憶體支援,需要256兆以上記憶體

kern.ipc.shm_use_phys=1

# 線程可使用的最大共享記憶體

kern.ipc.shmmax=67108864

# 最大線程數量

kern.ipc.shmall=32768

# 程式崩潰時不記錄

kern.coredump=0

# lo本地資料流接收和發送空間

net.local.stream.recvspace=65536

net.local.dgram.maxdgram=16384

net.local.dgram.recvspace=65536

# 資料包資料段大小,ADSL為1452。

net.inet.tcp.mssdflt=1460

# 為網絡資料連接配接時提供緩沖

net.inet.tcp.inflight_enable=1

# 資料包資料段最小值,ADSL為1452

net.inet.tcp.minmss=1460

# 本地資料最大數量

net.inet.raw.maxdgram=65536

# 本地資料流接收空間

net.inet.raw.recvspace=65536

#ipfw防火牆動态規則數量,預設為4096,增大該值可以防止某些病毒發送大量TCP連接配接,導緻不能建立正常連接配接

net.inet.ip.fw.dyn_max=65535

#設定ipf防火牆TCP連接配接空閑保留時間,預設8640000(120小時)

net.inet.ipf.fr_tcpidletimeout=864000

三、 服務程式的安全設定

到這裡就是本文的重點所在了,我們将花費比較多的文字進行描述,當然,是以描述不一定是非常正确的,也希望能夠對你有一些幫助。我們系統預設是運作了包括Apache、Mysql、vsFTPd,SSH等服務,我們以下進行一一講解。

1. Apache的安全設定

Apache的核心設定就是在 httpd.conf 裡面,我們安裝的Apache的目錄是在 /usr/local/apache2/ 下,那麼我們的配置檔案就是在  /usr/local/apache2/conf/httpd.conf ,如果你是使用ports等安裝的,配置檔案應該是在/etc或 /usr/local/etc目錄下。使用ee或者vi打開配置檔案:

# ee /usr/local/apache2/conf/httpd.conf

下面我們就要進行比較多的安全設定了,基本的服務、端口、主目錄等等設定就不說了,隻講與安全有關的設定。

(1)指定運作Apache服務的使用者群組

這是比較重要的,因為權限是繼承的,如果運作Apache服務的使用者權限太高,那麼很可能使得入侵者通過WebShell等就會對系統構成嚴重威脅。一般我們運作Apache的是nobody使用者和nobody組。在httpd.conf的250-275行之間找到User和Group選項,比如我們預設設定如下(去掉了注釋資訊):

<IfModule !mpm_winnt.c>;

<IfModule !mpm_netware.c>;

User nobody

Group #-1

</IfModule>;

</IfModule>;

(2) Apache的日志檔案

Apache的日志檔案是非常重要的,可以發現apache的運作狀況和通路情況,對于判斷入侵等有重要幫助。它的預設選項是:

# 錯誤日志存放目錄,預設是存放在apache安裝目錄的logs下

ErrorLog logs/error_log

# 日志記錄的級别,級别有debug, info, notice, warn, error, crit等,預設是“warn”級别

LogLevel warn

# 通路日志記錄的格式,每一種格式都有不同的内容,根據你的需要進行定制,以擷取最多通路資訊

LogFormat "%h %l %u %t /"%r/" %>;s %b /"%{Referer}i/" /"%{User-Agent}i/"" combined

LogFormat "%h %l %u %t /"%r/" %>;s %b" common

LogFormat "%{Referer}i ->; %U" referer

LogFormat "%{User-agent}i" agent

# 使用上面格式的那一種,預設是使用common

CustomLog logs/access_log common

檔案格式預定義的格式内容:

%a 遠端使用者IP

%A 本地httpd伺服器的ip

%f 傳送的檔案名

%h 遠端主機

%m 請求方式

%l identd給出的遠端名

%p 連接配接的httpd端口号

%P 請求的httpd程序

%t 時間

%T 服務請求時間

你可以定制自己的日志格式,然後通過CustomLog logs/access_log common來進行調用。

注意,日志檔案是由運作Apache的使用者進行打開的,要注意該檔案的安全,防止被黑客改寫或者删除。

(3) Apache服務資訊顯示控制

在配置檔案中有個選項是控制是否顯示apache版本資訊、主機名稱、端口、支援的cgi等資訊的:

ServerSignature On

預設為On,那麼将顯示所有資訊:

我故意通路一個不存在的檔案:http://www.target.com/404.html

那麼就會在給的錯誤提示中顯示如下資訊:

Apache/2.0.53 (Unix) PHP/4.3.11 Server at target.com Port 80

所有Apache和PHP的資訊暴露無遺,這是很不安全的。當然同時還有Off和EMail選項,Off将不顯示任何資訊,EMail将顯示管理者的郵箱位址,建議設為Off或者EMail,這樣能夠避免洩漏Apache伺服器的資訊給黑客。

(4) 目錄浏覽

在httpd.conf中可以設定apache能夠對一些沒有索引檔案的網頁目錄進行目錄浏覽:

<Directory />;

    Options Indexes FollowSymLinks

    AllowOverride None

</Directory>;

這是不合适也不安全的,建議不需要目錄浏覽:

<Directory />;

    Options FollowSymLinks

    AllowOverride None

</Directory>;

(5) 使用者首頁

設定httpd.conf中的:

UserDir public_html

能夠使得每個使用系統的使用者在自己的主目錄下建立 public_html 目錄後就能夠把自己的網頁放進該目錄,然後通過:

http://www.target.com/~使用者名/網頁 就能夠顯示自己的網頁,這是不安全的,而且對于我們伺服器來講,這沒有必要,是以我們直接關閉該功能:

UserDir disabled

或者把該内容改名,改成 一個黑客比較不容易猜到的檔案名,比如:

UserDir webserver_public_htmlpath

也可以隻允許部分使用者具有該功能:

UserDir enabled user1 user2 user3

(6) CGI執行目錄

如果你的apache要執行一些perl等cgi程式,那麼就要設定一下選項:

ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

但是這也給了黑客利用一些不安全的cgi程式來進行破壞,是以如果你不需要cgi的話,建議關閉該選項:

#ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

(7) 控制PHP腳本隻能通路指定目錄

在httpd.conf添加如下内容:

php_admin_value open_basedir /usr/www

後面的路徑是你需要PHP腳本能夠通路的目錄,如果PHP腳本想要通路其他目錄将出項錯誤提示。

(8) 目錄通路控制 (未完)

這項内容最複雜,同時涉及的東西也比較多,我隻能簡單說一下,不清楚請參考其他文章。

比如下面的内容:

<Directory />;

    Options FollowSymLinks

    AllowOverride None

</Directory>;

就是允許通路每一個目錄,裡面設定的是允許執行的動作,一般包含的動作有:Options、AllowOverride、Order、Allow、Deny。

Options是隻對指定目錄及其子目錄能夠執行的操作,Indexes、Includes、FollowSymLinks、ExecCGI、MultiViews、None、All等操作。

AllowOverride是指定目錄通路的權限,當然也可以通過 AccessFileName檔案指定的 .htaccess 來控制。它的操作有:None、All、Options、FileInfo、AuthConfit、Limit等。

Order、Allow、Deny三個指令必須配合來控制目錄通路權限。Order指定檢查次序的規則,比如Order Allow,  Deny,表示先按Allow檢查,如果不比對再按Deny進行檢查。Order Deny, Allow ,表示先按Deny規則檢查,如果不滿足條件,再按Allow進行檢查。

控制目錄通路權限的檔案

預設在Unix平台下能夠使用 .htaccess 來對目錄權限進行規則定義,但是這是不安全的,建議關閉,預設的選項:

AccessFileName .htaccess

建議設成:

#AccessFileName .htaccess

全部目錄權限定義使用httpd.conf中的定義,不使用 .htaccess。

(9) 使用者通路認證

這個技術非常重要,能夠控制一些非法使用者通路本内容。假設我們的網站: http://www.target.com/admin 是我們的背景管理目錄,我不允許一些非法使用者進行通路,那麼我就必須設定對該目錄通路是需要驗證的。

先在httpd.conf中加入要進行通路認證的目錄:

<Directory "/usr/www/admin">;

authtype basic

authname "Private"

authuserfile /usr/local/apache/bin/admin.dat

require user login_user

Options Indexes FollowSymlinks MultiViews

AllowOverride None

</Directory>;

上面我們就設定了我們的 /usr/www/admin目錄是必須進行認證才能通路的,接着我們設定通路密碼:

# /usr/local/apahche/bin/htpasswd -c /usr/local/apache/bin/admin.dat login_name

New password: *****

Re-type new password: *****

Adding password for user login_name

那麼下次任何使用者通路http://www.target.com/admin目錄的時候就需要輸入使用者名login_name和你設定的密碼。

2. PHP安全設定

PHP本身再老版本有一些問題,比如在 php4.3.10和php5.0.3以前有一些比較嚴重的bug,是以推薦使用新版。另外,目前鬧的轟轟烈烈的SQL Injection也是在PHP上有很多利用方式,是以要保證安全,PHP代碼編寫是一方面,PHP的配置更是非常關鍵。

我們php手手工安裝的,php的預設配置檔案在 /usr/local/apache2/conf/php.ini,我們最主要就是要配置php.ini中的内容,讓我們執行php能夠更安全。

整個PHP中的安全設定主要是為了防止phpshell和SQL Injection的攻擊,一下我們慢慢探讨。我們先使用任何編輯工具打開/etc/local/apache2/conf/php.ini,如果你是采用其他方式安裝,配置檔案可能不在該目錄。

(1) 打開php的安全模式

php的安全模式是個非常重要的内嵌的安全機制,能夠控制一些php中的函數,比如system(),同時把很多檔案操作函數進行了權限控制,也不允許對某些關鍵檔案的檔案,比如/etc/passwd,但是預設的php.ini是沒有打開安全模式的,我們把它打開:

safe_mode = on

(2) 使用者組安全

當safe_mode打開時,safe_mode_gid被關閉,那麼php腳本能夠對檔案進行通路,而且相同組的使用者也能夠對檔案進行通路。

建議設定為:

safe_mode_gid = off

如果不進行設定,可能我們無法對我們伺服器網站目錄下的檔案進行操作了,比如我們需要對檔案進行操作的時候。

(3) 安全模式下執行程式主目錄

如果安全模式打開了,但是卻是要執行某些程式的時候,可以指定要執行程式的主目錄:

safe_mode_exec_dir = /usr/bin

一般情況下是不需要執行什麼程式的,是以推薦不要執行系統程式目錄,可以指向一個目錄,然後把需要執行的程式拷貝過去,比如:

safe_mode_exec_dir = /tmp/cmd

但是,我更推薦不要執行任何程式,那麼就可以指向我們網頁目錄:

safe_mode_exec_dir = /usr/www

(4) 安全模式下包含檔案

如果要在安全模式下包含某些公共檔案,那麼就修改一下選項:

safe_mode_include_dir = /usr/www/include/

其實一般php腳本中包含檔案都是在程式自己已經寫好了,這個可以根據具體需要設定。

(5) 控制php腳本能通路的目錄

使用open_basedir選項能夠控制PHP腳本隻能通路指定的目錄,這樣能夠避免PHP腳本通路/etc/passwd等檔案,一定程度上限制了phpshell的危害,我們一般可以設定為隻能通路網站目錄:

open_basedir = /usr/www

(6) 關閉危險函數

如果打開了安全模式,那麼函數禁止是可以不需要的,但是我們為了安全還是考慮進去。比如,我們覺得不希望執行包括system()等在那的能夠執行指令的php函數,或者能夠檢視php資訊的phpinfo()等函數,那麼我們就可以禁止它們:

disable_functions = system,passthru,exec,shell_exec,popen,phpinfo

如果你要禁止任何檔案和目錄的操作,那麼可以關閉很多檔案操作

disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown

以上隻是列了部分不叫常用的檔案處理函數,你也可以把上面執行指令函數和這個函數結合,就能夠抵制大部分的phpshell了。

(7) 關閉PHP版本資訊在http頭中的洩漏

我們為了防止黑客擷取伺服器中php版本的資訊,可以關閉該資訊斜路在http頭中:

expose_php = Off

比如黑客在 telnet www.target.com 80 的時候,那麼将無法看到PHP的資訊。

(8) 關閉注冊全局變量

在PHP中送出的變量,包括使用POST或者GET送出的變量,都将自動注冊為全局變量,能夠直接通路,這是對伺服器非常不安全的,是以我們不能讓它注冊為全局變量,就把注冊全局變量選項關閉:

register_globals = Off

當然,如果這樣設定了,那麼擷取對應變量的時候就要采用合理方式,比如擷取GET送出的變量var,那麼就要用$_GET['var']來進行擷取,這個php程式員要注意。

(9) 打開magic_quotes_gpc來防止SQL注入

SQL注入是非常危險的問題,小則網站背景被入侵,重則整個伺服器淪陷,是以一定要小心。php.ini中有一個設定:

magic_quotes_gpc = Off

這個預設是關閉的,如果它打開後将自動把使用者送出對sql的查詢進行轉換,比如把 ' 轉為 /'等,這對防止sql注射有重大作用。是以我們推薦設定為:

magic_quotes_gpc = On

(10) 錯誤資訊控制

一般php在沒有連接配接到資料庫或者其他情況下會有提示錯誤,一般錯誤資訊中會包含php腳本目前的路徑資訊或者查詢的SQL語句等資訊,這類資訊提供給黑客後,是不安全的,是以一般伺服器建議禁止錯誤提示:

display_errors = Off

如果你卻是是要顯示錯誤資訊,一定要設定顯示錯誤的級别,比如隻顯示警告以上的資訊:

error_reporting = E_WARNING & E_ERROR

當然,我還是建議關閉錯誤提示。

(11) 錯誤日志

建議在關閉display_errors後能夠把錯誤資訊記錄下來,便于查找伺服器運作的原因:

log_errors = On

同時也要設定錯誤日志存放的目錄,建議根apache的日志存在一起:

error_log = /usr/local/apache2/logs/php_error.log

注意:給檔案必須允許apache使用者的群組具有寫的權限。

3. Mysql的安全設定

我們把Mysql安裝在 /usr/local/mysql目錄下,我們必須建立一個使用者名為mysql,組為mysql的使用者來運作我們的mysql,同時我們把它的配置檔案拷貝到 /etc目錄下:

# cp suport-files/my-medium.cnf /etc/my.cnf

chown root:sys /etc/my.cnf

chmod 644 /etc/my.cnf

使用使用者mysql來啟動我們的mysql:

# /usr/local/mysql/bin/mysqld_safe -user=mysql &

(1) 修改root使用者的的密碼

預設安裝的mysql是沒有密碼的,是以我們要修改,以防萬一。下面采用三種方式來修改root的密碼。

*  用mysqladmin指令來改root使用者密碼

# mysqladmin -uroot password test

這樣,MySQL資料庫root使用者的密碼就被改成test了。(test隻是舉例,我們實際使用的密碼一定不能使用這種易猜的弱密碼)

*  用set password修改密碼:

mysql>; set password for [email protected]=password('test');

這時root使用者的密碼就被改成test了。

*  直接修改user表的root使用者密碼    

mysql>; use mysql;

mysql>; update user set password=password('test') where user='root';

mysql>; flush privileges;

這樣,MySQL資料庫root使用者的密碼也被改成test了。其中最後一句指令flush privileges的意思是強制重新整理記憶體授權表,否則用的還是緩沖中的密碼,這時非法使用者還可以用root使用者及空密碼登陸,直到重新開機MySQL伺服器。

(2) 删除預設的資料庫和使用者

我們的資料庫是在本地,并且也隻需要本地的php腳本對mysql進行讀取,是以很多使用者不需要。mysql初始化後會自動生成空使用者和test庫,這會對資料庫構成威脅,我們全部删除。

我們使用mysql用戶端程式連接配接到本地的mysql伺服器後出現如下提示:

mysql>; drop database test;

mysql>; use mysql;

mysql>; delete from db;

mysql>; delete from user where not(host="localhost" and user="root");

mysql>; flush privileges;

(3) 改變預設mysql管理者的名稱

這個工作是可以選擇的,根據個人習慣,因為預設的mysql的管理者名稱是root,是以如果能夠修改的話,能夠防止一些腳本小子對系統的窮舉。我們可以直接修改資料庫,把root使用者改為"admin"

mysql>; use mysql;

mysql>; update user set user="admin" where user="root";

mysql>; flush privileges;

(4) 提高本地安全性

提高本地安全性,主要是防止mysql對本地檔案的存取,比如黑客通過mysql把/etc/passwd擷取了,會對系統構成威脅。mysql 對本地檔案的存取是通過SQL語句來實作,主要是通過Load DATA LOCAL INFILE來實作,我們能夠通過禁用該功能來防止黑客通過SQL 注射等擷取系統核心檔案。

禁用該功能必須在 my.cnf 的[mysqld]部分加上一個參數:

set-variable=local-infile=0

(5) 禁止遠端連接配接mysql

因為我們的mysql隻需要本地的php腳本進行連接配接,是以我們無需開socket進行監聽,那麼我們完全可以關閉監聽的功能。

有兩個方法實作:

* 配置my.cnf檔案,在[mysqld]部分添加 skip-networking 參數

* mysqld伺服器中參數中添加 --skip-networking 啟動參數來使mysql不監聽任何TCP/IP連接配接,增加安全性。如果要進行mysql的管理的話,可以在伺服器本地安裝一個phpMyadmin來進行管理。

(6) 控制資料庫通路權限

對于使用php腳本來進行互動,最好建立一個使用者隻針對某個庫有 update、select、delete、insert、drop table、create table等權限,這樣就很好避免了資料庫使用者名和密碼被黑客檢視後最小損失。

比如下面我們建立一個資料庫為db1,同時建立一個使用者test1能夠通路該資料庫。

mysql>; create database db1;

mysql>; grant select,insert,update,delete,create,drop privileges on db1.* to [email protected] identified by 'admindb';

以上SQL是建立一個資料庫db1,同時增加了一個test1使用者,密碼是admindb,但是它隻能從本地連接配接mysql,對db1庫有select,insert,update,delete,create,drop操作權限。

(7) 限制一般使用者浏覽其他使用者資料庫

如果有多個資料庫,每個資料庫有一個使用者,那麼必須限制使用者浏覽其他資料庫内容,可以在啟動MySQL伺服器時加--skip-show-database 啟動參數就能夠達到目的。

(8) 忘記mysql密碼的解決辦法

如果不慎忘記了MySQL的root密碼,我們可以在啟動MySQL伺服器時加上參數--skip-grant-tables來跳過授權表的驗證  (./safe_mysqld --skip-grant-tables &),這樣我們就可以直接登陸MySQL伺服器,然後再修改root 使用者的密碼,重新開機MySQL就可以用新密碼登陸了。

(9) 資料庫檔案的安全

我們預設的mysql是安裝在/usr/local/mysql目錄下的,那麼對應的資料庫檔案就是在/usr/local/mysql/var目錄下,那麼我們要保證該目錄不能讓未經授權的使用者通路後把資料庫打包拷貝走了,是以要限制對該目錄的通路。

我們修改該目錄的所屬使用者群組是mysql,同時改變通路權限:

# chown -R mysql.mysql /usr/local/mysql/var

# chmod -R go-rwx /usr/local/mysql/var

(10) 删除曆史記錄

執行以上的指令會被shell記錄在曆史檔案裡,比如bash會寫入使用者目錄的.bash_history檔案,如果這些檔案不慎被讀,那麼資料庫的密碼就會洩漏。使用者登陸資料庫後執行的SQL指令也會被MySQL記錄在使用者目錄的.mysql_history檔案裡。如果資料庫使用者用SQL語句修改了資料庫密碼,也會因.mysql_history檔案而洩漏。是以我們在shell登陸及備份的時候不要在-p後直接加密碼,而是在提示後再輸入資料庫密碼。

另外這兩個檔案我們也應該不讓它記錄我們的操作,以防萬一。

# rm .bash_history .mysql_history

# ln -s /dev/null .bash_history

# ln -s /dev/null .mysql_history

(11) 其他

另外還可以考慮使用chroot等方式來控制mysql的運作目錄,更好的控制權限,具體可以參考相關文章。

4. vsFTPd安全設定

vsFTPd是一款非常著名的ftp daemon程式,目前包括Redhat.com在内很多大公司都在使用,它是一款非常安全的程式,因為它的名字就叫:Very Secure FTP Daemon (非常安全的FTP伺服器)。

vsftpd設定選項比較多,涉及方方面面,我們下面主要是針對安全方面進行設定。

目前我們的需求就是使用系統帳戶同時也作為是我們的FTP帳戶來進行我們檔案的管理,目前假設我隻需要一個帳戶來更新我的網站,并且我不希望該帳戶能夠登陸我們的系統,比如我們的網站的目錄是在/usr/www下面,那麼我們建立一個使用者ftp,它的主目錄是/usr/www,并且它的shell 是 /usr/sbin/nologin,就是沒有shell,防止該使用者通過ssh等登陸到系統。

下面在進行系統詳盡的設定,主要就是針對vsftpd的配置檔案vsftpd.conf檔案的配置。

(1) 禁止匿名使用者通路, 我們不需要什麼匿名使用者,直接禁止掉:

anonymous_enable=NO

(2) 允許本地使用者登陸,因為我們需要使用ftp使用者來對我們網站進行管理:

local_enable=YES

(3) 隻允許系統中的ftp使用者或者某些指定的使用者通路ftp,因為系統中帳戶衆多,不可能讓誰都通路。

打開使用者檔案清單功能:

userlist_enable=YES

隻允許使用者檔案清單中的使用者通路ftp:

userlist_deny=NO

使用者名檔案清單路徑:

userlist_file=/etc/vsftpd.user_list

然後在/etc下建立檔案 vsftpd.user_list 檔案,一行一個,把使用者ftp加進去,同時也可以加上你允許通路的系統帳戶名。

(4) 禁止某些使用者登陸ftp:

pam_service_name=vsftpd

指出VSFTPD進行PAM認證時所使用的PAM配置檔案名,預設值是vsftpd,預設PAM配置檔案是/etc/pam.d/vsftpd。

/etc/vsftpd.ftpusers

VSFTPD禁止列在此檔案中的使用者登入FTP伺服器,使用者名是一行一個。這個機制是在/etc/pam.d/vsftpd中預設設定的。

這個功能和(3)裡的功能有點類似,他們倆能結合使用,那樣就最好了。

(5) 把本地使用者鎖定在自己的主目錄,防止轉到其他目錄,比如把/etc/passwd給下載下傳了:

chroot_local_users=NO

chroot_list_enable=YES

chroot_list_file=/etc/vsftpd.chroot_list

然後在/etc下建立vsftpd.chroot_list檔案,裡面把我們要限制的本地帳戶加進去,一行一個,我們加上ftp,防止它登陸到系統。

(6) 隐藏檔案真實的所有使用者群組資訊,防止黑客拿下ftp後檢視更多系統使用者資訊:

hide_ids=YES

(7) 取消ls -R指令,節省資源,因為使用該指令,在檔案清單很多的時候将浪費大量系統資源:

ls_recurse_enable=NO

(8) 上傳檔案的預設權限,設定為022:

local_umask=022

如果要覆寫删除等,還要打開:

write_enable=YES

(9) ftp的banner資訊,為了防止黑客擷取更多伺服器的資訊,設定該項:

ftpd_banner=banner string

把後面的banner string設為你需要的banner提示資訊,為了安全,建議不要暴露關于vsFTPd的任何資訊。

另外,如果你的資訊比較多的話,可以設定為提示資訊是讀取一個檔案中的資訊:

banner_file=/directory/vsftpd_banner_file

(10) 打開日志功能:

xferlog_enable=YES

同時設定日志的目錄:

xferlog_file=/var/log/vsftpd.log

啟用詳細的日志記錄格式:

xferlog_enable=YES

(11) 如果打開虛使用者功能等,那麼建議關閉本地使用者登陸:

local_enable=NO

vsFTPd還有很多安全設定,畢竟人家的名字就是:Very Secure FTP Daemon,反正它的溢出漏洞什麼的是很少的,如果要更安全,建議按照自己的需要設定vsftpd,設定的好,它絕對是最安全的。

5. SSH安全設定

SSH是一個基于SSL的安全連接配接遠端管理的服務程式,主要出現就是為了解決telnet、rlogin、rsh等程式在程式互動過程中存在明文傳輸易被監聽的問題而産生的,目前基本上是推薦使用ssh來代替telnet、rlogin、rsh等遠端管理服務。

ssh能夠直接在windows平台下通過Secure SSH Client等用戶端工具進行連接配接管理,目前最流行的伺服器端就是OpenSSH程式,目前最新版本是OpenSSH4.0版,詳細可以參考www.openssh.com網站。

OpenSSH在FreeBSD下已經內建安裝了,FreeBSD5.3下的OpenSSH版本是3.8.1,建議ports更新到4.0。

主要的安全配置檔案是/etc/ssh/sshd_config檔案,我們編輯該檔案。

(1) 使用protocol 2代替protocol 1,SSH2更加安全,可以防止攻擊者通過修改攜帶的版本banner來劫持(hijacking)啟動會話程序并降低到protocol 1。注釋掉protocol 2,1 改用下面語句代替:

protocol 2

(2) 合理設定最大連接配接數量, 防止DOS攻擊

  MaxStartups 5:50:10

(3)關閉X11forwording ,防止會話劫持

  X11Forwarding no

(4)建議不使用靜态密碼,而使用DSA 或RSA KEY,修改如下内容可以關閉使用密碼認證:

  PasswordAuthentication no

(5)可以限制某個組或光是單個使用者通路shell

  AllowGroups wheel

或者

  AllowUsers heiyeluren

(6) 限制root使用者登陸,主要是為了防止暴力破解

    PermitRootLogin no

(7) 不允許密碼為空的使用者登陸

    PermitEmptyPasswords no

(8)使用TCP wrappers來限制一些通路,修改/etc/hosts.allow檔案,注釋掉"ALL : ALL : allow",增加如下内容:

  sshd:localhost:allow

  sshd:friendlcomputer:allow

  sshd:all : deny

  #相關指令:

  #chsh -s /sbin/nologin user

四、防火牆的安裝和設定

FreeBSD自帶有一個基于包過濾的防火牆--ipfw,雖然功能沒有專業防火牆那麼強大,但是應付一個Web站點的安全還是足夠的,是以我們決定選用該防火牆來保護我們的Web伺服器。

1. 安裝ipfw

IPFW 的主要部分是在核心中運作的, 是以會需要在FreeBSD核心配置檔案中添加部分選項。(注意,如果你沒有安裝FreeBSD核心源代碼,是無法進入以下目錄的,是以運作之前一定要先安裝核心源代碼)我們先進入核心配置檔案:

# cd /sys/i386/conf

# cp GENERIC ./kernel_fw

打開核心配置檔案:

# ee ./kernel_fw

添加四個選項,不需要後面的注釋資訊:

options IPFIREWALL # 将包過濾部分的代碼編譯進核心。

options IPFIREWALL_VERBOSE

# 啟用通過syslogd記錄的日志。如果沒有指定這個選項,即使您在過濾規則中指定記錄包, 也不會真的記錄它們

options IPFIREWALL_VERBOSE_LIMIT=10

# 限制通過 syslogd(8) 記錄的每項包規則的記錄條數。在惡劣的環境中如果您想記錄防火牆的活動, 而又不想由于 syslog 洪水一般的記錄而導緻拒絕服務攻擊, 那麼這個選項将會很有用。

options IPFIREWALL_DEFAULT_TO_ACCEPT

# 這将把預設的規則動作從 ``deny'' 改為 ``allow''。這可以防止在沒有配置防火牆之前使用啟用過 IPFIREWALL  支援的核心重新開機時把自己鎖在外面。 另外, 如果您經常使用 ipfw(8) 來解決一些問題時它也非常有用。 盡管如此,在使用時應該小心,因為這将使防火牆敞開, 并改變它的行為。

編譯核心:

# /usr/sbin/config kernel_fw

# cd ../compile/kernel_fw (注意你的版本,如果是低于5.0的版本用../../compile/kernel_fw)

# make depend

# make

# make install

重新開機系統。注意,我們沒有選擇options IPFIREWALL_DEFAULT_TO_ACCEPT該選項,就是說預設系統啟動後是打開防火牆的,并且防火牆預設是不允許任何連接配接的(deny from any to any),是以一定要在本地操作,否則你将被“鎖在門外”,如果你選擇了該選項則可以使用ssh等連接配接不受影響,不過這相對不安全。

2. 配置ipfw

如果配置普通情況下的規則,使用指令配置的模式:

ipfw的配置指令:ipfw [-N] 指令 [編号] 動作 [log(日志)] 協定 位址 [其它選項]

例如:

# ipfw add allow tcp from any to 10.10.10.1 80 #允許外界通路我的web服務

# ipfw add allow tcp from any to 10.10.10.1 21 #允許外面通路我的ftp服務

# ipfw add allow tcp from any to 10.10.10.1 22 #允許外界通路我的ssh服務

如果使用規則包的形式,那麼檢視下面内容。

系統啟動後,我們還要配置rc.conf檔案來運作我們的防火牆:

# ee /etc/rc.conf

加入如下内容:

gateway_enable="YES" # 啟動網關

firewall_enable="YES" # 激活firewall防火牆

firewall_script="/etc/rc.firewall" # firewall防火牆的預設腳本

firewall_type="/etc/ipfw.conf" # firewall自定義腳本

firewall_quiet="NO" # 起用腳本時,是否顯示規則資訊。現在為“NO”假如你的防火牆腳本已經定型,那麼就可以把這裡設定成“YES”了。

firewall_logging_enable="YES" # 啟用firewall的log記錄。

設定完成後我們再編輯/etc/syslog.conf檔案:

# ee /etc/syslog.conf

加入以下行:

!ipfw

*.*                 /var/log/ipfw.log

現在到了最重要的編輯規則包了:

# ee /etc/ipfw.conf

我們添加一下規則:(注意 10.10.10.1是我們伺服器的IP)

######### TCP ##########

add 00001 deny log ip from any to any ipopt rr

add 00002 deny log ip from any to any ipopt ts

add 00003 deny log ip from any to any ipopt ssrr

add 00004 deny log ip from any to any ipopt lsrr

add 00005 deny tcp from any to any in tcpflags syn,fin

# 這5行是過濾各種掃描包

add 10001 allow tcp from any to 10.10.10.1 80 in  # 向整個Internet開放http服務。

add 10002 allow tcp from any to 10.10.10.1 21 in  # 向整個Internet開放ftp服務。

add 10000 allow tcp from 1.2.3.4 to 10.10.10.1 22 in

# 向Internet的xx.xx.xx.xx這個IP開放SSH服務。也就是隻信任這個IP的SSH登陸。

# 如果你登陸伺服器的IP不固定,那麼就要設為:add 10000 allow tcp from any to 10.10.10.1 22 in

add 19997 check-state

add 19998 allow tcp from any to any out keep-state setup

add 19999 allow tcp from any to any out #這三個組合起來是允許内部網絡通路出去,如果想伺服器自己不和Internet進行tcp連接配接出去,可以把19997和19998去掉。(不影響Internet對伺服器的通路)

########## UDP ##########

add 20001 allow udp from any 53 to 10.10.10.1 # 允許其他DNS伺服器的資訊進入該伺服器,因為自己要進行DNS解析嘛~

add 29999 allow udp from any to any out # 允許自己的UDP包往外發送。

########## ICMP #########

add 30000 allow icmp from any to any icmptypes 3

add 30001 allow icmp from any to any icmptypes 4

add 30002 allow icmp from any to any icmptypes 8 out

add 30003 allow icmp from any to any icmptypes 0 in

add 30004 allow icmp from any to any icmptypes 11 in

#允許自己ping别人的伺服器。也允許内部網絡用router指令進行路由跟蹤。

五、Unix/Linux上的後門技術和防範

對黑客來講,入侵一個系統隻是萬裡長征的開始,最主要的是長期占有一個殭屍電腦(傀儡機),是以,後門技術往往非常重要。對于我們來講,總是處于被動的地位,百密一疏,總有沒有做到位的地方,誰都不能保證自己的系統是絕對安全的,是以不能避免我們可能會被入侵。黑客入侵後肯定會留後門,當然,除了那些高手,境界非常高,入侵隻是為了測試或者技術挑戰,對于一般黑客來講,入侵之後留個後門是很重要的,我們要防範,當然就要了解常用的後門技術,下面就簡單的講将在 Unix/Linux系統中比較常見的後門技術。

1. 帳号後門

最普通和原始的後門技術,一般就是在系統中添加一個管理者帳戶。

# echo "heiyeluren:*:0:0::/root:/bin/sh" >;>; /etc/passwd

# echo "heiyeluren::0:0::0:0::/root:/bin/sh" >;>; /etc/shadow

給系統增加一個 uid和gid都為0(root)的帳号,無密碼。

FreeBSD的密碼是存儲在 /etc/master.passwd裡面的,那麼後面的指令就應該改成:

# echo "heiyeluren:::::::::" >;>; /etc/master.passwd

也可以使用程式來實作:

#include "stdio.h"

#define PASSWD_PATH "/etc/passwd"

#define SHADOW_PATH "/etc/master.passwd"

main()

{

FILE *fd;

fd = fopen(PASSWD_PATH, "a+");

fprintf(fd, "heiyeluren:*:0:0::/root:/bin/sh/n");

fclose(fd);

fd = fopen(SHADOW_PATH, "a+");

fprintf(fd, "heiyeluren::0:0::0:0::/root:/bin/sh/n");

fclose(fd);

}

# gcc -o adduser adduser.c

# ./adduser

這種方法比較傻,一般比較容易發現,特别是系統帳戶不多的時候。也有的使用者名起的比較迷惑人,比如起個r00t的使用者名,uid和gid都是0,這樣如果不注意,可能就會被蒙混過關了。

* 防範方法:

這種方法雖然比較容易發現,但是我們還是要防範,要多注意觀察系統的帳戶情況,本來我們系統帳戶就不多,檢查起來比較友善,另外也要注意那些比較少使用的帳戶是不是被更改過,比如預設的帳戶有bind,它的shell是 /usr/sbin/nologin,就是不能登陸的,但是黑客入侵後把它改了,比如改為/bin/csh,那麼對方就能登陸了,但是你确不知道。是以最好辦法是把/etc/passwd另外備份一份,不定期的檢查,同時把 /etc/passwd和/etc/master.passwd設為隻有root才能檢視。

2. shell後門

這個比較常用,也比較流行。一般就是把root執行的shell程式通過setuid的形式把shell程式拷貝到其他能夠執行的地方,然後隻要用小權限使用者執行該shell就能夠直接擷取root權限。

比如:

# cp /bin/sh /tmp/.backdoor

# chown root:root /tmp/.backdoor

# chmod +s /tmp/.backdoor

這樣隻是把sh複制了,如果你喜歡其他shell,比如ksh、csh也可以,具體你看各個不同的作業系統而定。你就可以把那個加了s标記的 shell程式放到任何目錄,最好是深一點,不容易被人發現的地方,比如/usr/local/share/man之類的目錄,然後你使用小權限使用者登陸後執行該 shell就可以了,比如我們上面複制的shell,我們隻要用小權限使用者登陸後執行:

$ /tmp/.backdoor

#

就可以了,當然,如何獲得小權限使用者,你可以使用暴力破解一些帳戶,或者自己建立一個小權限的帳戶。

* 防範方法:

首先給各個主要目錄加上我們上面說的檔案指紋校驗,知道某個目錄下有什麼檔案,如果多出了可疑檔案可以仔細檢查。還有使用find指令來查找有沒有危險的root suid程式:

find / -type f (-perm -4000 -o -perm -2000 ) -print

3. Crontab服務後門

crontab指令就相當于windows下的at指令,定期執行某些任務。對黑客來講,比如定期建立一個帳戶,然後過多久就删除,這樣管理者永遠看不到系統中有後門,這樣是非常保險的。。

* 防範方法:

cron的服務預設是存儲在 /var/spool/crontab/root目錄下,定期檢查cron服務,看是否有異常的任務在執行,或者如果你不使用cron的話,直接關閉掉它。

4. rhosts後門

Rhosts檔案常常被黑客利用來制作後門,如果系統開了rlogin、rexec等r的服務,因為象rlogin這樣的服務是基于rhosts檔案裡的主機名使用簡單的認證方法,是以黑客隻要将.rhosts檔案設定成"++",那麼就允許任何人從任何地方使用該使用者名,無須密碼登陸513端口的 rlogin服務就行。而且r之類的服務沒有日志能力,不容易被發現。

實作方法:

# echo "++" >; /usr/heiyeluren/.rhosts

# rlogin -l heiyeluren localhost

這樣就不需要任何密碼,直接輸入使用者名heiyeluren就登陸到了系統。

* 防範辦法:

不要使用rlogin等服務,同時也不推薦使用telnet等服務,因為telnetd等守護程序溢出漏洞一堆,而且在資料傳輸過程中是沒有加密的,很容易被嗅探,建議使用ssh等經過安全加密的服務來替代。

5. Login後門

login程式通常用來對telnet來的使用者進行密碼驗證. 入侵者擷取login的原代碼并修改使它在比較輸入密碼與存儲密碼時先檢查後門密碼. 如果使用者敲入後門密碼,它将忽視管理者設定的密碼讓你長驅直入。

* 防範方法:

一般針對這類後門,一般都是使用"string"指令搜尋login程式中是否有中是否有密碼等字元串來進行檢查。如果密碼經過加密,那麼就對login檔案進行指紋記錄和MD5值的記錄,覺得異常時進行檢測。

6. Bind後門

就是通過常用的網絡連接配接協定 TCP/UDP/ICMP 來建立連接配接的後門,這個在Windows下可是轟轟烈烈。

比較普遍的有TCP協定的後門都是寫一段程式開一個指定的端口進行監聽,然後從用戶端進行連接配接後登陸系統。也有黑客為了隐蔽使用UDP協定來連接配接。 icmp後門也常見,一般是。有時候可能bind後門跟服務後門結合,黑客通過自己寫的bind後門來替換inetd中的服務。

* 防範方法:

經常使用netstat指令檢查有沒有非法的端口打開,最好直接用防火牆屏蔽除了正常通路的端口之外的端口。對于ping後門的話,直接在防火牆上禁止ping伺服器

7. 服務後門

一般是替換或者添加服務來實作後門。比如在 /etc/inetd.conf 中添加或者替換某個服務來運作自己的後門程式,或者在某些服務中加入自己的後門代碼。如果是替換服務的話,該服務必須不被使用,而且不容易發現。如果是自己添加的服務,那麼必須在/etc/services中設定對應的服務和端口才能使用。

* 防範方法:

經常檢查服務,最好備份 /etc/inetd.conf 、/etc/services等檔案,同時在FreeBSD下也要時常檢查  /usr/loca/etc/rc.d 下面的腳本是否是合法的并且是否那些腳本裡面有沒有啟動非法程式。如果是在服務程式中添加自己的代碼,那麼就要對檔案的指紋進行校驗,比如md5值看是否比對。

8. rootkit後門

rootkit後門一般是替換管理者使用的工具,比如ls、ps、netstat、who等常用檔案,把那些程式替換成被黑客加了特殊代碼的程式,那樣就能達到控制的效果。而且現在已經有很多現成能下載下傳使用的rootkit。

* 防範方法:

按照我們前面的方法,給每個檔案建立系統指紋檔案和md5校驗值,如果覺得不對勁的時候檢視檔案指紋是否比對,有沒有别修改過,就知道是否着了rootkit的道。

9. 核心後門

通過加載核心子產品的方式來加載後門,比較複雜。一般核心後門都是針對作業系統而言的,不同的作業系統核心子產品設定編寫方法都不一樣,一般不通用。核心後門一般無法通過md5校驗等來判斷,所有基本比較難發現,目前針對核心後門比較多的是Linux和Solaris下。

* 防範方法:

FreeBSD下通過我們上面講的設定核心安全等級來控制加載核心子產品。

10. 其他後門

還有包括.forward等其他各類後門,另外很多後門可能是結合多種技術,比如把rootkit和核心後門結合在一起,實際過程中,黑克是會更難對付的。當然還有許多我們沒有發現高手獨門秘訣,這需要靈活檢查,不過隻要勤勞一點,安全會提升很多。

六、結束語

安全是一個整體,即使那麼服務你設定的非常安全,但是不能保證永遠安全,安全是動态的,必須不斷的充實自己的知識,發現新漏洞、新技術。如果你需要更安全的系統,一定要自己有時常能夠手工作入侵檢測或者使用部分工具幫助你進行入侵檢測。同時推薦你安裝一些網絡入侵檢測系統(NIDS),比如Snort。

我想這個題目真的有點大了,開始寫的時候沒有那種感覺,越做到後來越覺得想要說的很多,最後隻能泛泛而談了一下,雖然如此,也希望能夠給在使用FreeBSD的網管和網絡安全愛好者一點點的幫助,那就足夠了。

感謝所有緻力于開源世界安全研究和管理并且願意共享自己學習心得的朋友!

最後謝謝你能夠耐心閱讀本文。

(聲明:本人也是初學者,文章不當之處,敬請指出,同時本文參考了很多高手的文章,有些不能一一注明,敬請諒解。)

附錄(本文參考資料)

* 《黑客防線》2004年6月 《細心構造安全的PHP系統》(作者:單長虹)

* 《黑客防線》2004年5月 《一步一步加強Mysql的安全》(作者:單長虹)

* 《黑客防線》2004年5月 《檔案系統安全巧設定》(作者:小華健)

* 《黑客防線》2004年1月 《知己知彼,方能百戰不殆-Apache安全設定面面觀》(作者:老牛)

* 《黑客防線》2003年11月《打造免費的分布式入侵檢測系統》(作者:王雪冰)

* 《安全焦點》文檔精華  《利用FreeBSD組建安全的網關》(作者:iceblood)

* 《安全焦點》文檔精華  《MySQL資料庫安全配置》(作者:san)

* 《安全焦點》文檔精華  《PHP安全配置》(作者:san)

* 《安全焦點》文檔精華  《一些FreeBSD相關的安全問題》(作者:xundi)

* 《安全焦點》文檔精華  《FreeBSD系統優化部分核心參數調整中文注釋》(作者:iceblood)

* 《FreeBSD系統安裝及安全調整》(作者:xundi)

* 《詳談 vsftpd 的設定 》(作者:未知)

* 《Linux系統中OpenSSH的安裝和配置》(LinuxAid.com.cn網站技術文檔)

* 《如何建立後門》(作者:未知)