第 5章. 伺服器安全性

當一步系統被使用來當作公眾網路中的一部伺服器時,它將會成為攻擊的目標。 因此,強化系統的安全性以及 鎖定服務便成為系統管理員相當重要的事情。

在我們探討特定的議題前,請檢視下列的一般建議來加強系統的安全性:

5.1. 使用 TCP 包裹程式與 xinetd 來保全服務

TCP 包裹程式 提供許多種服務的存取控制,大部分目前的網路服務(如 SSH, Telnet 與 FTP)都使用 TCP 包裹程式,此程式可以在外來要求與所要求之服務間進行保衛的工作。

當與 xinetd (提供額外的存取、紀錄、繫結、重導與資源利用控制的一個超級服務) 一起使用時,由 TCP 包裹程式所提供的好處將可加倍。

提示建議
 

最好可以使用 IPTables 的防火牆規則與 TCP 包裹程式以及 xinetd 結合來產生服務存取 控制的冗餘性。 請參考 第7章 以取得關於使用 IPTables 指令來實作防火牆的更多資訊。

關於設定 TCP 包裹程式與 xinetd 的更多資訊可以在 Red Hat Enterprise Linux 參考手冊 一書中的 TCP Wrappers and xinetd 章節找到。

下列的章節假設您對每一個主題已經有基本的認識,而且將專門探討特定的安全性選項。

5.1.1. 使用 TCP 包裹程式加強安全性

TCP 包裹程式所能做到的不只是拒絕服務的存取,這裡將解釋如何使用它來傳送連線標題、來自特定主機的攻擊 警告以及強化紀錄的功能性。 如需關於 TCP 包裹程式功能性與控制語言的一個詳細清單,請參考 hosts_options 的 man page。

5.1.1.1. TCP 包裹程式與連線標題

傳送一個警告的標題給連線到一個服務的用戶端是用來偽裝伺服器在哪一部系統上執行一個很好的方法,同時也 讓一個潛在的攻擊者了解系統管理員是相當警惕的。 如要為一項服務實作一個 TCP 包裹程式的標題,請使用 banner 選項。

這個例子實作了一個 vsftpd 的標題。 請先建立一個標題檔案,可已將它存在系統上的 任何地方,不過檔案名稱必須與該系統程式名稱相同。 在此例中,檔案將被稱為 /etc/banners/vsftpd

這個檔案的內容如下:

220-Hello, %c
220-All activity on ftp.example.com is logged.
220-Act up and you will be banned.

%c 記號提供了許多的用戶端資訊,例如使用者名稱與主機名稱,或者是使用者名稱 與 IP 位址來使這個連線更加地具有警示性。 Red Hat Enterprise Linux 參考手冊 中含有 TCP 包裹程式中可用 的其他記號清單。

如要使外來的連線呈現這個標題,請增加下列這一行到 /etc/hosts.allow 檔案中:

vsftpd : ALL : banners /etc/banners/

5.1.1.2. TCP 包裹程式與攻擊警告

假如一個特定的主機或網路被抓到正在攻擊伺服器,可以使用 TCP 包裹程式並透過 spawn 指令來警告系統管理員關於來自該主機或網路的後續攻擊行動。

在這個例子中,假設來自 206.182.68.0/24 網路的一個怪客被抓到嘗試要攻擊伺服器,您可以將下列這一行 放到 /etc/hosts.deny 檔案中,該連線將會被拒絕,而且還會被紀錄到一個特殊的檔案中。

 ALL : 206.182.68.0 : spawn /bin/ 'date' %c %d >> /var/log/intruder_alert

%d 記號會提供攻擊者試圖要存取的服務名稱。

如要允許連線並且紀錄連線狀況,請放置 spawn 的指令到 /etc/hosts.allow 檔案中。

注請注意
 

因為 spawn 指令將會執行任何的 shell 指令,請建立一個特殊的程式碼,於一個特定的 用戶端試著要連線到伺服器時,來通知系統管理員或執行一連串的指令。

5.1.1.3. TCP 包裹程式與強化的紀錄

假如您需要特別地留意某些類型的連線,可以透過 severity 選項來提高該服務的紀錄等級。

在這個例子中,假設要嘗試連線到一部 FTP 伺服器連接埠號 23 (Telnet 的連接埠)的任何人為一個怪客, 請放置 emerg 旗號到紀錄檔案中,而不是使用預設的旗號 info, 並且拒絕該連線。

如要拒絕連線,請放置下列這一行到 /etc/hosts.deny 檔案中:

in.telnetd : ALL : severity emerg

這將會使用預設的 authpriv 紀錄工具程式,不過卻從預設的 info 轉為 emerg 以提高優先順序,這將會直接發佈紀錄檔的訊息到主控台上。

5.1.2. 使用 xinetd 來加強安全性

xinetd 超級伺服器是另一個有用的工具,可用來控制存取它附屬服務。 這個地方專門 探討如何使用 xinetd 來設定一個陷阱服務,並且控制任何給予的 xinetd 服務所能使用來阻礙阻絕服務攻擊的資源量。 如需可以使用的詳細清單,請參考 xinetdxinetd.conf 的 man page。

5.1.2.1. 設定一個陷阱

xinetd 一個重要的特色是它可以增加主機到一個全域性的 no_access 清單。 此清單中的主機將被拒絕向 xinetd 所管理之服務的連線,一直到一段所指定的時間 或直到 xinetd 重新啟動時。 這是由使用 SENSOR 屬性來完成的。 這項技術是用來阻擋試圖要對伺服器進行連接埠掃描之主機的一種簡單方法。

設定一個 SENSOR 的第一步驟是選擇一個您不打算使用的服務,在此例中,我們選擇 Telnet。

請編輯 /etc/xinetd.d/telnet 檔案,更改含有 flags 那一行為:

	      flags           = SENSOR

請在大括號內增加下列這些行:

	      deny_time       = 30

這將會拒絕嘗試要連線到這個連接埠的連線,有效時間為 30 分鐘。 deny_time 屬性的 其他可接受的數值為 FOREVER(在重新啟動 xinetd 之前,都保持禁止連線)與 NEVER (允許連線並且紀錄連線狀況)。

最後,最後一行應該為:

	      disable         = no

雖然使用 SENSOR 是一個很好的方法來偵測與停止來自不法主機的連線,它尚有兩個缺點 存在:

  • 它無法偵測到秘密的掃描。

  • 知道一個 SENSOR 正在執行中的攻擊者可以對特定的主機偽裝它們的 IP 位址,然後連線 到禁止連線的連接埠來進行阻絕服務攻擊。

5.1.2.2. 控制伺服器的資源

另一個 xinetd 的特色是它可以控制使用之資源服務量的能力。

它是藉由下列的指令來做到的:

  • cps = <number_of_connections> <wait_period> — 指定服務每秒所允許的連線,這個指令只接受整數數值。

  • instances = <number_of_connections> — 指定一項服務所允許的最大連線 數目,這個指令接受一個整數數值或 UNLIMITED

  • per_source = <number_of_connections> — 指定每一部主機的服務所允許 的連線,這個指令接受一個整數數值或 UNLIMITED

  • rlimit_as = <number[K|M]> — 以 KB 或 MB 指定服務所能使用的記憶體位址 空間容量,這個指令接受一個整數數值或 UNLIMITED

  • rlimit_cpu = <number_of_seconds> — 以秒數指定一項服務所能佔用 CPU 資源的時間,這個指令接受一個整數數值或 UNLIMITED

使用這些指令可以防止任何的一個 xinetd 服務超載系統,而導致阻絕服務的狀況發生。