4.5. 安全性與機密性

Linux 或 UNIX 系統的其中一個主要特性是能夠同時 (多重使用者) 處理數個使用者,並允許這些使用者在同一部電腦上同時執行數個工作 (多工作業)。再者作業系統具有透明化的網路。使用者通常不知道他們正在使用的資料與應用程式是由其本地機器提供或是透過網路所提供。

使用多個使用者的功能,不同使用者的資料必須分開儲存。必須保證安全性與隱私。即使在電腦可以透過網路連結前,資料安全性就已經是一個重要的議題。就像今日,最重要的問題就是在遺失資料或損毀資料的媒體上 (大部份是指硬碟而言),仍然能夠提供資料。

本小節主要是將焦點放在機密議題以及保護使用者隱私的方法上,但是它並未著墨太多關於全面安全性概念應該永遠包含的一些程序,即在適當的位置具有定期更新、可運作以及已測試的備份。如果沒有這些,您可能很難將資料還原 不只是在某些硬體有缺陷的例子中,如果懷疑有人取得未授權的存取權並損毀檔案時也是如此。

4.5.1. 本地安全性與網路安全性

存取資料有數種方式:

  • 與具有所需資訊或具有電腦資料存取權的人員進行個人通訊

  • 直接從電腦的主控台 (實體存取)

  • 透過序列線

  • 使用網路連結

在所有的這些例子中,在使用者存取資源或是有問題的資料前,應該先驗證其身份。網頁伺服器在這方面可能限制比較少,但是您仍然不應該對任何網友揭露所有的個人資料。

在上方的清單中,第一個例子是需要與人頻繁的互動,例如,當您正在與銀行人員聯繫時,需要證明您就是擁有該銀行帳戶的人員。接著會要求您提供簽名、PIN 或密碼以證明您就是您所聲稱的那個人。在某些狀況下,有可能從某個知道的人問出一些資訊,只要使用一些巧妙的措詞提及一些已知的片斷資訊,就有可能贏得該人員的信賴。這個受害者有可能被引導逐漸揭露更多的資訊,但卻不自知。在駭客之間,稱此為「社會工程」。您只能以教育人們的方式以及以謹慎的方式來處理語言與資訊才能對抗這樣的受害。在攻擊者侵入電腦系統前,他們通常會嘗試鎖定接待人員、公司的客服人員或甚至是家庭成員。在許多狀況下,利用社會工程的攻擊通常都發現得很晚。

一個想要取得資料未授權存取權的人,也有可能使用傳統的方式,嘗試直接取得您的硬體。因此,應該善加保護機器,以防他人移動、替換或破壞其元件。這也適用於備份,甚至是任何的網路纜線或電線。另外也需要防護開機程序,因為有些眾所周知的按鍵組合,可能會引起不正常的行為。請設定 BIOS 與開機載入程式的密碼,以避免自己的電腦發生此狀況。

連接至序列埠的序列終端機仍然用於許多地方。不像網路介面,它們並不依賴網路通訊協定和主機通訊。它們使用簡單的纜線或紅外線埠,在設備之間來回傳送純文字字元。纜線本身是這類系統最弱的點:只要以舊型的印表機連接到系統,就可以輕易地記錄纜線上所執行的任何內容。印表機可以達成的動作也可以由其他方式來完成,端視攻擊所進行的動作而定。

讀取某個主機本地上的檔案所需的存取規則,就是在不同的主機上開啟與伺服器的網路連線。本地安全性與網路安全性之間是有區別的。這條界線在於資料必須放入封包以傳送到別的地方。

4.5.1.1. 本地安全性

本地安全性是從電腦執行位置的實體環境開始。在符合您的期望與需求的適當位置安裝機器。本地安全性的主要目標就是要將使用者彼此區隔開來,如此就不會有其他的使用者可以擅用另一個使用者的權限或身份。這是一般所遵守的規則,但是對於擁有系統最高權限的 root 使用者更是特別需要遵守。因為 root 可以使用任何本地使用者的身份,而且系統不會提示它輸入密碼,就可以讀取任何本地儲存的檔案。

4.5.1.2. 密碼

在 Linux 系統上,密碼不會以純文字儲存,而且輸入的文字字串也不會與儲存的型式直接符合。如果是這樣,只要有人取得該對應檔案的存取權,系統上的所有帳戶都將受到侵害。實際上,會加密儲存的密碼,而且每次輸入它時,還會再加密一次,然後再比較這兩個加密的字串。只要加密的密碼無法反轉計算成原始的文字字串,就不允許登入,這提供了更多的安全性。

實際上,這是由一種特殊的演算法所達成,也稱為「暗門演算法」,因為它只能往一個方向運作。取得加密字串的攻擊者將無法以直接再次套用相同的演算法來取得密碼。因此, 在找到一個組合與加密的密碼相似前,它將需要測試所有可能的字元組合。使用 8 個字元長的密碼,將需要計算相當多的可能組合。

在 70 年代,有人主張此方法比其他方法更為安全,因為使用了相當慢的演算法,它需要好幾秒才能加密一個密碼。然而,在另一方面,PC 已變得非常強大,可以在每秒內進行數十萬或甚至數百萬的加密。因此,加密的密碼不應該對一般的使用者顯示 (一般使用者無法讀取 /etc/shadow)。更重要的一點是密碼必須不易猜測,以防止密碼因為某些錯誤而變成可見。因此,將密碼如 "tantalize"「翻譯」成 "t@nt@1lz3" 並沒有太大的用處。

以某些看起來與字母相似的數字取代一個字的某些字母並不夠安全。使用字典猜測的密碼破解程式也可以猜測到這樣的替換。最好的方法是使用一個沒有一般意義但只對您個人有意義的文字,像是某句子或某書名文字的第一個字母,例如 "The Name of the Rose" by Umberto Eco。這將可以給予下列安全的密碼:"TNotRbUE9"。相反的,像是 "beerbuddy" 或 "jasmine76",將很容易被對您只有一些瞭解的人士猜到。

4.5.1.3. 開機程序

設定系統使其無法從軟碟或從 CD 開機,可以將設備整個移除或是設定 BIOS 的密碼,並將 BIOS 設成只允許從硬碟開機。一般而言,Linux 系統是由開機載入程式所啟動,允許您將額外的選項傳遞至開機核心。在 /boot/grub/menu.lst 中設定額外的密碼以防止其他人在開機時使用像是這樣的參數 (請參閱 章 9, 開機載入器)。這對於系統的安全性非常重要。不只是核心本身是以 root 權限執行,它也是第一個授權者可以在系統啟動時授與 root 權限。

4.5.1.4. 檔案許可權

一般而言,儘可能以限制最多的權限來進行指定的工作。例如,閱讀或撰寫電子郵件絕對不需要使用 root 的身份。如果郵件程式有問題,而這個問題有可能造成在程式啟動時,利用它以相同的程式權限來進行攻擊。遵照上方原則,可以減少可能的損毀。

在 SUSE 版本中所包含的 200,000 個以上的檔案權限是經過小心選擇的。安裝其他軟體或其他檔案的系統管理員應該極為注意何時會這麼做,特別是在設定權限時。資深以及對安全性敏感的系統管理員,永遠會使用 -l 選項加上 ls 指令以取得龐大的檔案清單,這可允許它們立即偵測是否有任何不正確的檔案權限。不正確的檔案屬性並不只是代表檔案已經過變更或遭到刪除。這些修改過的檔案有可能是 root 曾經執行過它們,或是在組態檔中,程式可能以 root 的權限使用過這些檔案。這大幅地增加了攻擊者的機會。像這一類的攻擊稱為布穀鳥式借巢孵蛋,因為不同的使用者 (鳥) 執行 (孵化) 程式 (蛋),就像布縠鳥誘使其他的鳥孵化牠自己的蛋。

SUSE Linux 系統包含 permissionspermissions.easypermissions.secure 以及 permissions.paranoid 檔案,全部都在 /etc 目錄中。這些檔案的目的就是用以定義特殊的權限,像是全球都可以寫入的目錄或是供檔案使用的 Setuser ID 位元 (具有 Setuser ID 位元集的程式並不是以啟動它的使用者權限執行,而是以檔案擁有者的權限執行,大部份是指 root 而言)。管理員可以使用 /etc/permissions.local 檔案以新增他自己的設定值。

若要定義 SUSE 的組態程式使用上方哪些檔案以據此設定權限,請選取 YaST 中的 安全性。若要學習更多關於此主題的詳細資訊,請參閱 /etc/permissions 中的備註或是 chmod 的手冊頁 (man chmod)。

4.5.1.5. 緩衝區溢位與格式字串問題

每當程式應該處理使用者可以或可能變更的資料時,就應該特別謹慎處理,不過這個問題大部份是針對應用程式設計人員而言,而非一般使用者。程式設計人員務必確保其應用程式以正確的方式解譯資料,而不需將它們寫入空間不足以儲存它們的記憶體區域中。另外,程式應該使用為該目的所定義的介面,以一致性的方式傳遞資料。

如果在寫入緩衝區時,未考量記憶體緩衝區的實際大小,就有可能發生「緩衝區溢位」。在某些例子中,此資料 (由使用者所產生) 使用了比緩衝區可用空間更多的空間。結果,所寫入的資料超過了緩衝區資料的結尾,因此在某些狀況下,儘可能讓程式執行使用者 (而非程式設計人員) 所設定的程式順序,而不只是處理使用者資料而已。這一類的問題有可能造成嚴重的後果,特別是如果使用特別的權限執行程式的話 (請參閱 節 4.5.1.4, "檔案許可權")。

格式字串問題 的運作方式有些不同,但是它又是有可能導致程式出狀況的使用者輸入。大部份而言,是利用這些程式的錯誤以及特殊的權限 (Setuid 以及 Setgid 程式),這也表示您可以移除對應的執行權限,以保護資料與系統免於這類的問題。此外,最好的方法是使用最低可能的權限來套用原則 (請參閱 節 4.5.1.4, "檔案許可權")。

假使緩衝區溢出與格式字串問題是與使用者資料處理相關的問題,如果已指定存取權給本地帳戶,就不只可以利用它們。許多已報告的問題都有可能透過網路連結被利用。因此,應該將緩衝區溢位與格式字串問題,分類成與本地安全性以及與網路安全性相關。

4.5.1.6. 病毒

與某些人的說法相反,有些病毒是在 Linux 上執行。然而,那些作者所發行的已知病毒是一種「概念證明」,以證明該技術如預期運作。目前為止沒有病毒已經蔓延

如果沒有寄主得以寄生,病毒將無法生存和蔓延。在此例子中,宿主將會是一個程式或是系統的重要儲存區域,例如主要開機記錄,也就是病毒的程式碼可以寫入的。由於多個使用者的功能,Linux 可以將存取權限制為某些檔案,特別是某些重要的系統檔案。因此,如果您以 root 權限進行一般工作,將會增加系統受到病毒感染的機會。相反的,如果您遵照上方所提及的原則,儘可能使用最低權限,則感染病毒的機率便微乎其微。

除此之外,您絕對不要從網際網路上某些您不了解的網站執行程式。SUSE 的 RPM 套件帶有加密的簽名以做為數位標籤,必須小心謹慎才能建立它們。病毒通常代表管理員或使用者缺乏必要的安全性認知,造成原先應該非常安全的系統有感染的風險。

病毒不應該與蠕蟲混淆,它完全屬於網路世界。蠕蟲並不需要宿主就可以散播。

4.5.1.7. 網路安全性

網路安全性對於防護從外面開始的攻擊非常重要。需要使用者名稱與密碼以驗證使用者的一般登入程序,仍然是本地的安全性問題。在透過網路登入的特定例子中,區別兩個安全性領域。一直到實際驗證所發生的事,都是網路安全性,而之後所發生的任何事則為本地安全性。

4.5.1.8. X 視窗系統以及 X 驗證

如一開始所提及,網路通透性是 UNIX 系統的其中一個主要特性。X 是 UNIX 作業系統的視窗系統,可以印象深刻的方式來利用此功能。使用 X 基本上就可以輕易地在遠端主機中登入並啟動圖形程式,接著就可以透過網路在您的電腦上顯示該程式。

應該使用 X 伺服器以遠端顯示 X 用戶端時,X 伺服器應該從未授權的存取來保護它 (即該顯示) 所管理的資源。更具體而言,某些權限必須指定給用戶端程式。使用 X Window 系統,就可以使用兩種方法來進行此動作,分別為以主機為基礎的存取控制以及以 Cookie 為基礎的存取控制。第一個是依賴用戶端應該執行的主機 IP 位址。負責控制的程式為 xhost。xhost 會將合法用戶端的 IP 位址輸入屬於 X 伺服器的小資料庫。然而,依賴 IP 位址的驗證並不安全。例如,如果有第二個使用者在傳送用戶端程式的主機上工作,則該使用者也可以存取 X 伺服器 就像有些人偷竊 IP 位址一樣。由於這些缺點,在此將不對此驗證方法做詳細的說明,但是您可以使用 man xhost 來學習它。

在以 Cookie 為基礎的存取控制例子中,所產生的字元字串只能讓 X 伺服器以及合法的使用者知道,就像某種 ID 卡。此 Cookie (這個字並不是指一般的餅乾,而是指包含警語的中國幸運籤餅) 是儲存在使用者主目錄的 .Xauthority 檔案中,並且提供給任何需要使用 X 伺服器的 X 用戶端來顯示視窗。使用者可以使用 xauth 工具來檢查 .Xauthority 檔案。如果您要重新命名 .Xauthority 或不小心從主目錄刪除檔案,您將無法開啟任何新的視窗或 X 用戶端。在 Xsecurity 的 man 頁面中,可以參閱更多關於 X Window 系統安全性機制的詳細資訊 (man Xsecurity)。

SSH (安全外圍程序) 可用以完整地加密網路連線,並將它以背景作業方式轉遞至 X 伺服器,但是使用者不會察覺到該加密機制。這又可稱為 X 轉遞。X 轉遞是藉由模擬伺服器端的 X 伺服器並在遠端主機上設定外圍程序的 DISPLAY 變數來達成。您可以在 節 4.2, "SSH:安全網路作業" 找到有關 SSH 的詳細資訊。

[Warning]警告

如果您未考慮您所登入的主機是否為安全的主機,請勿使用 X 轉遞。啟用 X 轉遞後,攻擊者可以透過 SSH 連線進行驗證,以入侵您的 X 伺服器並查看您的鍵盤輸入。

4.5.1.9. 緩衝區溢位與格式字串問題

節 4.5.1.5, "緩衝區溢位與格式字串問題" 中所討論,應該將緩衝區溢位與格式字串問題,分類成與本地與網路安全性相關的問題。隨著這類問題的本地變化、網路程式的緩衝溢位,當成功地利用這些瑕疵時,大部份都會使用它們來取得 root 權限。即使不是這樣,攻擊者也可能使用該問題來取得未授權的本地帳戶,以利用其他可能存在於系統上的弱點。

透過網路連結以利用緩衝區溢位與格式字串問題,絕對是遠端攻擊最常見的形式。對於這些程式的不當利用以開拓新發現的安全性漏洞,通常會張貼在安全性郵件清單上。使用它們就可以鎖定弱點,而不需知道程式碼的詳細資訊。經過這些年來,經驗顯示提供這些不當利用的程式碼對於更加安全的作業系統貢獻良多,很明顯地這是因為作業系統設計者被迫必須修正其軟體中的問題。有了免費軟體,每個人都可以存取原始程式碼 (SUSE Linux 是隨附在所有可用的原始程式碼),而且任何找到弱點及其不當利用程式碼的人,都可以提交修補程式以修正對應的問題。

4.5.1.10. 拒絕服務

此種拒絕服務 (DoS) 攻擊的主要目的就是要封鎖伺服器程式或甚至是整個系統,有可能以數種方式達成:使伺服器超出負載、以垃圾封包使其忙碌,或利用遠端緩衝區溢位。通常 DoS 攻擊的唯一目的就是要使服務消失。然而,一旦特定的服務變成無法使用時,通訊就有可能變成「攔截式攻擊」 (封包攔截、TCP 連線攔截、偽裝式攻擊) 以及 DNS 定址攻擊的弱點。

4.5.1.11. 攔截式:封包攔截、攔截、偽裝式攻擊

一般而言,由攻擊者所執行的遠端攻擊會將自己放在通訊主機之間,可稱為 攔截式攻擊。幾乎所有類型的攔截式攻擊共同點就是,受害者通常不會察覺正在進行的事情。這類的攻擊有許多可能的變化,例如,攻擊者有可能接收某個連線要求並將它轉遞給目標機器本身。現在受害者已無意識地建立與錯誤主機的連線,因為另一端假裝自己是合法的目標機器。

攔截式攻擊最簡單的形式稱為 嗅探器 攻擊者「只是」監聽經過的網路流量。至於更複雜的攻擊,「攔截式攻擊」有可能嘗試接收已建立的連線 (攔截)。如果要這麼做,攻擊者將需要一些時間分析封包,才能夠預測屬於該連線的 TCP 序號。當攻擊者最後奪取目標主機的角色時,受害者將會注意到此,因為他們會取得錯誤訊息說明連線因失敗而終止。有些通訊協定並沒有透過加密以防止攔截,只有在建立連線時執行簡單的驗證程序,使其更容易成為攻擊者攻擊的弱點。

偽裝式攻擊 是一種將封包加以修改以包含假的來源資料的攻擊,通常是 IP 位址。大部份主動攻擊的形式是依賴傳送這樣的假封包,這在 Linux 機器上只能由進階使用者執行 (root)。

許多所提及的攻擊都是結合 DoS 來執行。如果攻擊者見到有機會可以將某個主機出其不意地擊倒,即使只是很短的時間,這將使其更易於做主動的攻擊,因為該主機將有一段時間無法妨礙其攻擊。

4.5.1.12. DNS 定址攻擊

DNS 定址攻擊是指攻擊者破壞 DNS 伺服器的快取,即使用偽裝的 DNS 回覆封包以回覆它、嘗試使伺服器傳送某種資料給正在要求伺服器資訊的受害者。許多伺服器以 IP 位址或主機名稱來維持與其他主機的信任關係。攻擊者必須非常瞭解對主機之間信任關係的實際結構,以便將自己偽裝成其中一個信任的主機。通常,攻擊者會分析從伺服器所收到的一些封包以取得所需的資訊。攻擊者通常也需要在名稱伺服器鎖定適時的 DoS 攻擊。請使用加密連線,以便能夠驗證要連線的主機身份來保護自己。

4.5.1.13. 蠕蟲

一般常會將蠕蟲與病毒混淆,但是在這兩者之間其實有一個明確的界限。不像病毒,蠕蟲並不需要感染某個宿主程式才能存活。它們相當擅長於在網路結構上儘可能迅速散播。過去所出現的蠕蟲 (例如 Ramen、Lion 或 Adore) 都是利用伺服器程式已知的安全性漏洞像是 bind8 或 lprNG。防止蠕蟲的入侵其實相當容易。假設在安全漏洞的發現以及蠕蟲攻擊伺服器之間有些間隔,這樣正是感染程式的更新版本準時提供的好機會。不過這只對管理員在有問題的系統上真正安裝了安全性更新才有用。

4.5.2. 一些一般的安全性秘訣與技巧

為了能妥善處理安全性問題,則必須隨時使用新開發並隨時關心最新的安全性問題。保護系統免於這些問題的最好方法是盡快取得並安裝安全聲明中推薦的套件。SUSE 安全聲明由郵件清單發布,可透過下列連結 http://www.novell.com/linux/security/securitysupport.html 訂閱。suse-security-announce@suse.de 清單是第一手關於更新套件的資訊來源,並且包含 SUSE 主動貢獻者的安全性團隊成員。

郵件清單 suse-security@suse.de 是討論任何所關心的安全性問題的好地方。可在同一網頁訂閱

bugtraq@securityfocus.com 是全球其中一個最知名的安全性郵件清單。建議閱讀這個清單,它每天會收到 15 到 20 個張貼。在 http://www.securityfocus.com 可以找到更多的詳細資訊。

下列是關於處理基本安全性問題的有用規則清單:

  • 根據每個工作儘可能都使用限制最多的權限集合原則,避免以 root 的身份執行一般工作。這將可減少得到布穀鳥式借巢孵蛋或病毒的風險,並防止自己犯錯。

  • 如果有可能,請永遠嘗試使用加密的連線在遠端機器上工作。使用 ssh (安全外圍程式) 以取代 telnetftprsh 以及 rlogin 應該為標準的慣例。

  • 避免使用僅依據 IP 位址的驗證方法。

  • 請試著將最重要的網路相關套件保持在最新的狀態,並訂閱對應的郵件清單以接收這類程式新版的公告 (bind、sendmail、ssh 等等)。同樣的原則也適用於與本地安全性相關的軟體。

  • 變更 /etc/permissions 檔案以最佳化對系統安全性很重要的檔案權限。如果您從程式移除 Setuid 位元,它有可能再也無法依照所需的方式執行工作。另一方面,在大部份的情況下,請想想程式也將不再有潛在性的安全性風險。您可以採取全球可以寫入的目錄與檔案的相似方式。

  • 停用所有非必要的網路服務,讓伺服器正常運作。這可讓您的系統較為安全。開啟埠及 LISTEN 插槽狀態,都可以在 netstat 程式中找到。至於其選項,建議使用 netstat -apnetstat -anp-p 選項允許您查看哪些程序正在佔據哪個名稱下的埠。

    比較 netstat 的結果以及從主機外面對埠所做全面掃描的結果。進行此工作的最佳程式為 nmap,它不只檢查機器的埠,也會針對哪些服務在等待這些埠做出摘要。然而,埠掃描有可能被視為一種侵略行為,因此若無管理員的明確允許,請勿在主機上執行此動作。最後,請記得不只是要掃描 TCP 埠,另外也必須掃描 UDP 埠 (-sS-sU 選項)。

  • 如果要以可靠的方式來監督系統檔案的完整性,請使用 AIDE (進階入侵偵測環境) 程式,可在 SUSE Linux 找到。加密 AIDE 所建立的資料庫以防有人篡改它。另外,在您的機器之外複製一份資料庫備份,將它儲存在未連接網路的外部資料媒體上。

  • 在安裝協力廠商軟體時請謹慎小心。曾經有駭客將木馬程式建入安全軟體套件的 tar 歸檔中,所幸很快就被發現了。如果您要安裝二進位的套件,請確定您對所下載的網站沒有疑慮。

    SUSE 的 RPM 套件是以 GPG 簽名。SUSE 用以簽名的金鑰為:

    ID:9C800ACA 2000-10-19 SUSE Package Signing Key <build@suse.de>

    Key fingerprint = 79C1 79B2 E1C8 20C1 890F 9994 A84E DAE8 9C80 0ACA

    rpm --checksig package.rpm 指令顯示解除安裝的套件,其檢查總數與簽名是否正確。尋找該版本第一張 CD 上的金鑰以及全球大部份金鑰伺服器上的金鑰。

  • 定期檢查使用者與系統檔案的備份。請考慮如果您未測試備份是否可以使用,它有可能沒有用處。

  • 檢查記錄檔。請儘可能隨時撰寫小型的程序檔以搜尋可疑的項目。不可否認的,這不完全是一個鎖碎的工作。最後只有您才知道哪些項目是不尋常的,哪些才是正常的。

  • 使用 tcp_wrapper 以限制存取在機器上所執行的個別服務,因此您對於哪個 IP 位址可以連線至服務具有明確的控制權。如需關於 tcp_wrapper 的進一步資訊,請參閱 tcpd 與 hosts_access (man 8 tcpdman hosts_access) 的手冊頁面。

  • 使用 SUSEfirewall 以加強 tcpd 所提供的安全性 (tcp_wrapper)。

  • 將您的安全性措施設計成重複型:出現兩次的訊息總比沒有訊息來的好。

4.5.3. 使用集中式安全性報告位址

如果您發現安全性相關的問題 (請先檢查可用的更新套件),請撰寫電子郵件給 security@suse.de。請輸入問題的詳細說明,以及有關的套件版本編號。SUSE 會盡快回復。您最好能以 PGP 加密電子郵件。SUSE 的 PGP 金鑰為:


ID:3D25D3D9 1999-03-06 SUSE Security Team <security@suse.de>
Key fingerprint = 73 5F 2E 99 DF DB 94 C4 8F 5A A3 AE AF 22 F2 D5

這個金鑰也可以從 http://www.novell.com/linux/security/securitysupport.html 下載。