Linux的安全
概述
UNIX的系統安全和系統管理員有很大的關系。安裝越多的服務,越容易導致系統的安全漏洞。一些其它的操作系統,如:SCO,實際上更容易有安全漏洞,因為,為了更加“用戶友好”,這些操作系統集成了更多的服務。
Linux本身是穩定和安全的,但是它可以以不同的形式發行。在安裝Linux時候,最好先最小化安裝,然後再加上必要的軟件。這樣可以減小某個程序出現安全隱患的可能。如果管理得好,Linux可以是最安全的系統。
如果在系統中有隱患存在,在網絡上成千上萬的自願者就會指出隱患,並給出修正。大的公司,比如:商業軟件公司,只能把有限的人力用於解決這方面的問題。把問題都公開出來,對它們來說可能沒有什麼好處,而且通過正規的發行和升級渠道,一個小小修正到用戶手中都要很長的時間。也許這些修正會以補丁的方式出現,但是商業軟件的系統管理員都傾向於使用現成的軟件,而且自以為這些軟件都是很專業的。
在編程的時候隨時可能發生錯誤,但是,當有上萬個人在看程序的源代碼,這些錯誤就能很快地被發現。現在全球共有一千二百萬的Linux拷貝,想想看,這是一種什麼情況。如果系統有安全漏洞,很容易就被某個人發現了。
這一章將討論一些保護服務器安全的一般方法。我們假定這台服務器是連在Internet上的。在通常情況下,有些服務,如:NFS、Samba、Imap和Pop只是供內部用戶使用的。當然,也可以把這台服務器和外界隔離,這樣就可以簡單地避免外部的入侵。但是這沒有什麼實際意義,我們下面要介紹的是如何避免來自外部的和內部的攻擊。
1. 基礎知識
盡量少讓外人知道有關系統的信息。有時候簡單地用finger程序就能知道不少系統信息,比如:有多少用戶、管理員什麼時候登錄、什麼時候工作、他們是誰、誰現在在用這個系統以及其它有利於黑客猜出用戶口令的信息。你可以用一個強大的finger daemon和tcpd限制可以連接到服務器的用戶以及他們可以知道的有關系統的信息。但是,最好還是把finger軟件包卸載掉。
日志是了解Linux系統運行情況的唯一方法。當然,這是以黑客沒有破壞日志文件為前提的,但是這種情況很少見。把所有的連接都記錄下來,可以發現攻擊者和他們試圖進行的攻擊。如果你看不懂日志,可以向別人請教,一定要學會看懂它們。向別人請教你不懂的東西這是很正常的,不要不好意思。我自己就是從不斷地犯錯誤和改正錯誤中學到不少知識的。因為驕傲自大不能學到東西和本身的資質差是兩碼事。看下面的《31. 創建所有重要的日志文件的硬拷貝》,你可以學到怎樣管理日志文件的一些有用的知識。
限制系統中SUID的程序。SUID的程序是以root(UNIX世界中的上帝)權限運行的程序。有時候這是必須的,但是在多數情況下這沒有必要。因為SUID程序可以做任何root可以做的事,這樣有更多的機會出現安全隱患。也許,它們有時候會帶來安全隱患,有時候不會,但是黑客可以利用SUID的程序來破壞系統的安全。這就是一種叫eXPloit的程序的由來。exploit程序是一種利用SUID程序的程序或腳本,具有很大的破壞力,可以用來得到root的shell、獲取passWord文件、讀其他人的郵件、刪除文件,等等。這方面的知識可以參考《34. 帶“s”位的程序》。
2. BIOS安全,設定引導口令
禁止從軟盤啟動,並且給BIOS加上密碼。每次啟動的時候都手工檢查一下BIOS,這樣可以提高系統的安全性。禁止從軟盤啟動,可以阻止別人用特殊的軟盤啟動你的計算機;給BIOS加上密碼,可以防止有人改變BIOS的參數,比如:允許從硬盤啟動或不用輸入口令就可以引導計算機。
3. 安全策略
有一點很重要而且必須指出的是:如果你不知道要保護什麼,那麼更本沒有辦法保證系統的安全。所以必須要有一個安全策略,基於這樣的一個策略才可以決定哪些東西允許別人訪問,哪些不允許。如何制定一個安全策略完全依賴於你對於安全的定義。下面的這些問題提供一些一般的指導方針:
* 你怎麼定義保密的和敏感的信息?
* 你想重點防范哪些人?
* 遠程用戶有必要訪問你的系統嗎?
* 系統中有保密的或敏感的信息嗎?
* 如果這些信息被洩露給你的競爭者和外面的人有什麼後果?
* 口令和加密能夠提供足夠的保護嗎?
* 你想訪問Internet嗎?
* 你允許系統在Internet上有多大的訪問量?
* 如果發現系統被黑客入侵了,下一步該怎麼做?
這個列表很短,真正的安全策略可能包含比這多得多的內容。可能你要做的第一件是:評估一下你偏執的程度。任何一個安全策略多少都有一定程度的偏執:確定到底在多大程度上相信別人,包括內部的人和外部的人。安全策略必須在允許用戶合理地使用可以完成工作所必須的信息和完全禁止用戶使用信息之間找到平衡點。這個平衡點就是由系統策略決定的。
4. 口令
這章的Linux安全概要就從口令的安全開始。許多人都把所有的東西保存在計算機上,防止別人查看這些信息的方法就是用口令把計算機保護起來。沒有什麼東西是絕對安全的。與常識相反的是:無法破解的口令是不存在的。只要給足時間和資源,所有的口令都能用社會工程(譯者注:原文是social engineering,找不出更好的翻譯,大致的意思是用社會和心理學的知識,而不是用純粹的技術手段)或強行計算的方法猜出來。
通過社會工程或其它方法獲得服務器的口令是最簡單和最流行的入侵服務器的方法。決大多數的技術支持人員很容易獲得其他用戶的口令,因為用戶的安全意識很差而且很輕易就相信自己的同事,特別是幫助自己解決問題的人。有很多登記在案的成功入侵就是因為一些別有用心的人利用安全管理上的松懈而獲得成功的。有時候,在特定的時間在特定的地點,上級或老板對員工喊話就有可能洩露機密,導致可怕的後果。
因為破解口令是一項很耗時間和資源的工作,所以應該使得口令文件難於破解,這樣即使黑客獲取了口令文件也不能輕易破解。作為一個系統管理員,自己在每個周末運行一下口令破解程序,是保證系統安全的好方法。這有利於盡早地發現和替換那些很容易被猜出來的口令。而且,還要有一個好的口令檢查機制,在用戶選擇新口令或改變舊口令的時候,來排除那些有安全隱患的口令。那些字典裡的單詞、或者全是大寫或全是小寫的以及沒有包含數字或特殊字符的字符串是不能用來做口令的。我建議用下面的規則選擇有效的口令:
* 口令至少要有6個字符,最好包含一個以上的數字或特殊字符。
* 口令不能太簡單,所謂的簡單就是很容易猜出來,也就是用自己的名字,電話號碼、生日、職業或者其它個人信息作為口令。
* 口令必須是有有效期的,在一段時間之後就要更換口令。
* 口令在這種情況下必須作廢或者重新設定:如果發現有人試圖猜測你的口令,而且已經試過很多次了。
5. 口令長度
安裝完Linux系統之後默認的最小口令長度為5。這就是說一個新的用戶可以訪問服務器,那麼他的口令必須多於5字符。但是這樣是不夠安全的,最好口令的長度能夠大於8。可以強制用戶使用8個字符以上的口令。編輯“/etc/login.defs”文件,把最小口令長度由5改成8。找到 PASS_MIN_LEN 5 這一行,改為:PASS_MIN_LEN 8 。“login.defs”是很重要的配置文件。可以在這個文件中設定一些其它的安全策略,比如:口令的有效期。
6. root帳號
“root”帳號是Unix系統中享有特權的帳號。“root”帳號是不受任何限制和制約的。因為系統認為root知道自己在做些什麼,而且會按root說的做,不問任何問題。因此,可能會因為敲錯了一個命令,導致重要的系統文件被刪除。用root帳號的時候,要非常非常小心。因為安全原因,在不是絕對必要的情況下,不要用root帳號登錄。特別要注意的是:不在自己的服務器上的時候,千萬不要在別的計算機上用“root”登錄自己的服務器。這是非常非常非常糟糕的一件事。
7. 加密
加密時要用到密匙,密匙是一個特殊的數字,把密匙和需要加密的信息經過加密算法加密之後,只有知道密匙的人才能把信息讀出來。如果所有的計算機主機都在你的控制下,加密當然是一個好方法,但是,如果其中一台“被信任的”主機被黑客控制了,你馬上就有危險了。這就不僅僅是用戶的帳號和口令有危險了。在通常情況下,加密是用來保證機密信息在系統中傳送的安全。如果一台計算機被控制了,那麼這些加密信息就會讓人知道或是洩密了。有一個好的安全策略,這種危險的可能性會降到最低,但是如果某台主機的密匙被洩露出去,那麼危險始終存在。使用如:OpenSSL、SSH和MD5這樣的加密技術是非常有用的,可以參考後面的章節。
8. “/etc/exports"文件
如果通過NFS把文件共享出來,那麼一定要配置“/etc/exports”文件,使得訪問限制盡可能的嚴。這就是說,不要用通配符,不允許對根目錄有寫權限,而且盡可能只給只讀權限。編輯exports文件(vi /etc/exports)加入:
例如:
/dir/to/export host1.mydomain.com(ro,root_squash)
/dir/to/export host2.mydomain.com(ro,root_squash)
“/dir/to/export”是你想共享出來的目錄,host.mydomain.com是允許訪問這個目錄的計算機。ro代表只讀,root_squash代表不允許對根目錄進行寫操作。使這些改變生效,你還要運行“/usr/sbin/exportfs -a”命令。
注意:在服務器上裝NFS服務是會有安全隱患的,就我個人而言,不建議你使用NFS。
9. 禁止使用控制台程序
一個最簡單而且最常用的保證系統安全的方法就是禁止使用所有的控制台程序,如:shutdown和halt。可以運行下面的命令來實現:
[root@deep]# rm -f