章 4. Linux 的安全性

內容目錄

4.1. 偽裝與防火牆
4.2. SSH:安全網路作業
4.3. 加密分割區和檔案
4.4. 利用 AppArmor 確認權限
4.5. 安全性與機密性

摘要

偽裝及防火牆可確保資料流及資料交換受到控制。SSH (保全外圍程序,Secure Shell) 可確保您透過加密的連線登入遠端主機。加密檔案或整個分割區能夠保護您的資料,不讓第三方存取您的系統。加上技術指導,找到有關 Linux 網路安全性的資訊。


4.1. 偽裝與防火牆

只要 Linux 用於網路環境,您可以使用允許操作網路封包的核心功能,讓內部和外部網路區域之間保持區隔。Linux netfilter 架構提供建立有效防火牆的方法,將不同的網路分開。利用 iptables (規則集定義的一般表格結構) 的幫助,準確地控制允許傳遞網路介面的封包。這類封包過濾器只要透過 SUSEfirewall2 及對應 YaST 模組的協助即可輕鬆設定。

4.1.1. 使用 iptables 過濾封包

netfilter 與 iptables 元件負責過濾及操作網路封包,以及網路位址轉譯 (NAT,Network Address Translation)。過濾標準和任何與其關聯的動作以鏈結方式儲存,在個別網路封包抵達時必須相互符合。符合的鏈結儲存於表格內。iptables 指令允許您變更這些表格和規則集。

Linux 核心維護三個表格,每個針對封包過濾器的特定功能種類:

filter

此表格保存一組過濾器規則,因為它以更嚴格的方式執行封包過濾 (packet filtering)機制,例如,決定封包是否允許通過 (ACCEPT) 或放棄 (DROP)。

nat

此表格定義對封包之來源和目標位址的任何變更。使用這些功能也可以讓您執行「偽裝」(masquerading),這是 NAT 用來連結私有網路與網際網路的一種特殊方式。

mangle

此表格中的規則可以操作儲存於 IP 標頭中的值 (如服務類型)。

圖形 4.1. iptables:封包的可能路徑

iptables:封包的可能路徑

這些表格包含數個符合封包的預先定義鏈結:

PREROUTING

此鏈結套用到內送封包。

INPUT

此鏈結套用到預定送到系統內部程序的封包。

FORWARD

此鏈結套用到僅透過系統路由的封包。

OUTPUT

此鏈結套用到來自於從系統本身的封包。

POSTROUTING

此鏈結套用到所有外送封包。

圖形 4.1, "iptables:封包的可能路徑" 說明網路封包在指定系統上傳送的路徑。為了簡化的緣故,圖中將表格列為鏈結的各部份,但是實際上,這些鏈結是在表格本身內。

所有可能情況中最簡單的一種,系統本身預定的內送封包抵達 eth0 介面。封包先參照 mangle 表的 PREROUTING 鏈結,然後再參照 nat 表的 PREROUTING 鏈結。下一個步驟有關封包的路由,決定封包的實際目標是系統本身的程序。傳遞 manglefilter 表的 INPUT 鏈結後,封包最後會到達其目標,也就是確定符合 filter 表的規則。

4.1.2. 偽裝基本原則

偽裝是 NAT (網路位址轉譯) 的 Linux 專用形式。它可以用來連結小型 LAN (主機使用私用範圍的 IP 位址;請參閱 節 18.1.2, "網路遮罩與路由") 與網際網路 (使用正式 IP 位址)。若要讓 LAN 主機能夠連接網際網路,這些主機的私用位址會轉譯為正式位址。這是在路由器上完成的,路由器當作 LAN 與網際網路之間的閘道。基本原則很簡單:路由器擁有一個以上的網路介面,通常是網路卡以及另一個與網際網路連結的介面。後者連結路由器與外界,一或多個其他的則連結路由器與 LAN 主機。當區域網路中的這些主機連接到路由器的網路卡時 (如 eth0),它們可以傳送任何不是預定給區域網路的封包到其預設的閘道或路由器。

[Important]使用正確的網路遮罩

設定您的網路時,確定廣播位址及網路遮罩在所有本地主機上都是相同的。如果不相同,可能會造成封包無法正確的路由。

如所述,只要其中一個 LAN 主機傳送預定給網際網位位址的封包時,就會送到預設路由器。不過,路由器必須先設定才能轉遞這類封包。為了安全的緣故,SUSE Linux 在預設安裝時不會啟用此功能。若要啟用,將檔案 /etc/sysconfig/sysctl 中的變數 IP_FORWARD 設定為 IP_FORWARD=yes

連線的目標主機可以看到您的路由器,但是並不知道您內部網路中產生封包的主機。這就是為什麼這個技術稱為偽裝。由於位址轉譯功能,所以路由器是任何回覆封包的第一個目的地。路由器必須識別這些內送封包並轉譯其目標位址,如此封包可轉遞到區域網路中的正確主機。

依據偽裝表格之內送交通的路由,是不可能從外面開啟對內部主機的連線。對於這類連線,表格中不會出現項目。此外,任何已經建立的連線在表格中都有指定給它的狀態項目,因此另一個連線無法使用此項目。

其結果是,您在一些應用程式通訊協定上可能會出現問題,如 ICQ、cucme、IRC (DCC、CTCP) 和 FTP (PORT 模式)。Netscape、標準的 FTP 程式以及許多其他通訊協定使用 PASV 模式。就封包過濾和偽裝而言,這種被動模式的問題較少。

4.1.3. 防火牆基本原則

「防火牆」大概是使用最為廣泛的字詞,用來描述提供及管理網路之間的連結機制,同時還能控制其間的資料流。嚴格來說,本節中描述的機制稱為「封包過濾器」。封包過濾器根據特定標準 (如通訊協定、通訊埠和 IP 位址) 規範資料流。這樣允許您根據封包的位址,阻斷不應該送到您網路上的封包。例如,若要允許公用存取您的網頁伺服器,請明確開啟對應連接埠。不過,封包過濾器不會掃描具有正常位址的封包內容,如導向您網頁伺服器的那些封包。例如,即使內送封包意圖危害您網頁伺服器上的 CGI 程式,封包過濾器仍會讓這些封包通過。

更有效但更複雜的機制是數種系統類型的組合,如與應用程式閘道或 Proxy 互動的封包過濾器。這個時候,封包過濾器會拒絕預定給停用連接埠的任何封包。只有導向到應用程式閘道的封包才會被接受。此閘道或 Proxy 會假裝是伺服器的實際用戶端。以這種意義而言,這類 Proxy 會視為通訊協定層級上應用程式所使用的偽裝主機。這種 Proxy 的範例之一是 Squid,一種 HTTP Proxy 伺服器。若要使用 Squid,瀏覽器必須設定成透過 Proxy 進行通訊。要求的任何 HTTP 頁面會從 Proxy 快取取得,而快取中找不到的頁面會透過 Proxy 從網際網路抓取。另一個範例則是,SUSE proxy-suite (proxy-suite) 為 FTP 通訊協定提供 Proxy。

下節將焦點放在 SUSE Linux 隨附的封包過濾器。如需有關封包過濾及防火牆的詳細資訊,請參閱 howto 套件中包含的「防火牆 HOWTO」內容。如果安裝了此套件,請使用 less /usr/share/doc/howto/en/txt/Firewall-HOWTO.gz 閱讀 HOWTO。

4.1.4. SUSEfirewall2

SUSEfirewall2 是讀取 /etc/sysconfig/SuSEfirewall2 中變數集的程序檔,可以產生一組 iptables 規則。它定義三個安全性區域,但是以下範例組態僅考慮第一個和第二個區域:

外部區域

假設沒有方法可以控制外部網路上發生的情況,因此需要保護主機。在大部分的情況中,外部網路就是網際網路,但是也可能是其他不安全的網路,例如 WLAN。

內部區域

這是指私用網路,通常是指 LAN。如果此網路上的主機使用私用範圍的 IP 位址 (請參閱 節 18.1.2, "網路遮罩與路由"),請啟用網路位址轉譯 (NAT),這樣內部網路上的主機即可存取外部網路。

廢除區域 (DMZ)

儘管外部及內部網路可以連接位於此區域中的主機,但是這些主機本身無法存取內部網路。這種設定可以在內部網路前加上額外的防護線,因為 DMZ 系統與內部網路是隔離的。

過濾規則集未明確允許的任何網路流量類型會由 iptables 封鎖。因此,具有內送流量的每個介面必須放置在三個區域中的其中一個。對於每個區域,定義允許的服務或通訊協定。規則集僅套用到遠端主機產生的封包。本地產生的封包不會被防火牆攔截。

使用 YaST 可以執行組態設定 (請參閱 節 4.1.4.1, "使用 YaST 設定")。也可以在檔案 /etc/sysconfig/SuSEfirewall2 中手動進行,該檔案的註解完整。不僅如此,在 /usr/share/doc/packages/SuSEfirewall2/EXAMPLES 中還提供一些範例案例。

4.1.4.1. 使用 YaST 設定

[Important]自動防火牆組態

在安裝後,YaST 在所有已設定的介面上會自動啟動防火牆。如果已設定系統並在系統上啟動,YaST 會使用伺服器組態模組中的 開啟防火牆中選取介面的連接埠開啟防火牆的連接埠 選項,以修改自動產生的防火牆組態。有些伺服器模組對話方塊具有 防火牆詳細資料 按鈕,可以啟動其他服務和連接埠。YaST 防火牆組態模組僅能啟動、關閉或重新設定防火牆。

YaST 的圖形組態對話方塊可從「YaST 控制中心」存取。選取 安全性和使用者+防火牆。該組態一共分成七個部份,可以在左手邊的三個架構直接存取。

啟動

在此對話方塊中設定啟動行為。預設的安裝中,會自動啟動 SUSEfirewall2。您也可以在此啟動和停止防火牆。若要在執行中的防火牆設定新的設定,請使用 立即儲存設定並重新啟動防火牆

圖形 4.2. YaST 防火牆設定

YaST 防火牆設定
介面

所有已知的網路介面都列在這裏。若要從區域移除介面,請選取介面,按 變更 後選擇 沒有指定區域。若要新增介面至區域,請選取介面,按 變更 後選擇任何可用的區域 。您也可以使用 自訂,以自己的設定建立特殊的介面。

允許的服務

您需要此選項以從系統提供服務至受保護的區域。按照預設值,只會保護系統不受外部區域的侵犯。明確的規範允許外部區域可使用的服務。在 選取區域所允許的服務 中選取適當的區域後,啟動服務。

偽裝

偽裝可將內部網路隱身於外部網路,如網際網路,但允許內部網路的主機存取外部網路。從外部網路發出對內部網路的要求會遭到封鎖,但是從內部網路發出的要求,從外部看起來會像是從偽裝伺服器發出。如果內部機器的特殊服務需要開放給外部網路使用,可以針對服務增加特殊的重新指向規則。

廣播

在此對話方塊中,已設定允許廣播的 UDP 埠。新增必需的連接埠號碼或服務到適當的區域,由空格分隔。請參閱 /etc/services 檔案。

不被接受的廣播紀錄可以在此啟動。這有可能會有問題,因為 Windows 主機使用廣播瞭解彼此,也因而產生許多不被接受的封包。

IPsec 支援

在此對話方塊設定 IPsec 服務是否可供外部網路使用。在 詳細資料 下,設定可信任的封包。

記錄層次

記錄有兩種規則:可接受和不被接受的封包。不被接受的封包包括 DROPPED 或 REJECTED。從 記錄全部記錄關鍵全部不要記錄 來選取這兩個規則。

當完成防火牆組態時,請按 下一步 結束此對話方塊。開啟防火牆設定的區域導向摘要。在此,勾選所有設定。所有已允許的服務,埠和通訊協定都會列在此摘要中。若要修改組態,使用 上一步。按 接受 可儲存您的組態。

4.1.4.2. 手動設定

以下段落提供成功組態的逐步指示。每個組態項目會依據是否與防火牆或偽裝功能相關加以標示。這裡並沒有涵蓋組態檔中所提與 DMZ (廢除區域) 相關的觀點。這些觀點僅適用較大型組織的更複雜網路基礎結構 (公司網路),因為需要全面的組態以及對該主題的深入瞭解。

首先,使用 YaST 模組系統服務 (Runlevel) 以啟動 runlevel 中的 SUSEfirewall2 (最有可能是 3 或 5)。它在 /etc/init.d/rc?.d/ 目錄中會設定 SUSEfirewall2_* 程序檔的符號連結。

FW_DEV_EXT (防火牆、偽裝)

連結到網際網路的設備。如果是數據機連線,請輸入 ppp0。如果是 ISDN 連結,請使用 ippp0。DSL 連線則使用 dsl0。指定 auto 使用與預設路由對應的介面。

FW_DEV_INT (防火牆、偽裝)

連結到內部私用網路的設備 (如 eth0)。如果沒有內部網路且防火牆僅保護執行的主機時,請留置空白。

FW_ROUTE (防火牆、偽裝)

如果需要偽裝功能,將此設定為 yes。外界將無法看到您的內部主機,因為網際網路路由器會忽略其私用網路位址 (例如,192.168.x.x)。

對於沒有偽裝的防火牆,如果想要允許存取內部網路,僅將此設定為 yes。在這種情況下,您的內部主機需要使用正式註冊的 IP。不過,通常您「不」應該允許外界存取您的內部網路。

FW_MASQUERADE (偽裝)

如果需要偽裝功能,將此設定為 yes。這可以提供網際網路主機,建立虛擬/直接的連線到網際網路。在內部網路和網際網路的主機之間使用 Proxy 伺服器較為安全。對於 Proxy 伺服器所提供的服務並不需要偽裝。

FW_MASQ_NETS (偽裝)

指定要偽裝的主機或網路,在個別項目之間加上空格。例如:

FW_MASQ_NETS="192.168.0.0/24 192.168.10.1"
FW_PROTECT_FROM_INT (防火牆)

將此設定為 yes,保護您的防火牆主機免於來自內部網路的攻擊。如果確實啟用,只有內部網路才可以使用服務。另請參閱 FW_SERVICES_INT_TCPFW_SERVICES_INT_UDP

FW_SERVICES_EXT_TCP (防火牆)

輸入應該可用的 TCP 連接埠。對於不應該提供任何服務的一般家用工作站,請留置空白。

FW_SERVICES_EXT_UDP (防火牆)

除非執行 UDP 服務且希望讓外界使用,否則請留置空白。使用 UDP 的服務包括 DNS 伺服器、IPSec、TFTP、DHCP 以及其他。如果要讓外界使用,輸入要使用的 UDP 連接埠。

FW_SERVICES_INT_TCP (防火牆)

利用此變數,定義可讓內部網路使用的服務。其表示法與 FW_SERVICES_EXT_TCP 相同,但是設定是套用到內部網路。只有在 FW_PROTECT_FROM_INT 設定為 yes 時,才需要設定變數。

FW_SERVICES_INT_UDP (防火牆)

請參閱 FW_SERVICES_INT_TCP。

設定防火牆後,測試您的設定。防火牆規則集的建立是以 root 身份輸入 SUSEfirewall2 start。接著使用 telnet,例如,從外部主機查看是否已實際拒絕連線。之後,檢視 /var/log/messages,在其中應該會看到如下內容:


Mar 15 13:21:38 linux kernel: SFW2-INext-DROP-DEFLT IN=eth0 
OUT= MAC=00:80:c8:94:c3:e7:00:a0:c9:4d:27:56:08:00 SRC=192.168.10.0 
DST=192.168.10.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=15330 DF PROTO=TCP 
SPT=48091 DPT=23 WINDOW=5840 RES=0x00 SYN URGP=0 
OPT (020405B40402080A061AFEBC0000000001030300)

其他測試防火牆設定的套件為 nmap 或 nessus。nmap 的文件可在 /usr/share/doc/packages/nmap 中找到,而 nessus 的文件則是在安裝個別套件後的 /usr/share/doc/packages/nessus-core 目錄中。

4.1.5. 如需詳細資訊

有關 SUSEfirewall2 套件的最新資訊及其他文件請參閱 /usr/share/doc/packages/SuSEfirewall2。netfilter 與 iptables 專案的首頁 (http://www.netfilter.org) 提供許多語言的大量文件。