伺服器架設篇 - CentOS 6.x

第七章、網路安全與主機基本防護:限制埠口, 網路升級與 SELinux

認識 cracker 的攻擊手法,以及透過該手法我們該如何保護主機本身!

最近更新時間: 2011/07/21

通過第一篇的鍛鍊之後,現在你應該已經利用 Linux 連上 Internet 了。但是你的 Linux 現在恐怕還是不怎麼安全的。 因此,在開始伺服器設定之前,我們必須要讓你的系統強壯些!以避免被惡意的 cracker 所攻擊啊!在這一章當中, 我們會介紹封包的流向,然後根據該流向來制訂系統強化的流程!包括線上自動升級、服務管控以及 SELinux 等等。現在就來瞭解瞭解囉!

7.1 網路封包連線進入主機的流程

在這一章當中,我們要討論的是,當來自一個網路上的連線要求想進入我們的主機時, 這個網路封包在進入主機實際取得資料的整個流程是如何?瞭解了整個流程之後, 你才會發現:原來系統操作的基本概念是如此的重要! 而你也才會瞭解要如何保護你的主機安全吶!閒話少說,咱們趕緊來瞧一瞧先。

7.1.1 封包進入主機的流程

第一章我們就談過網路連線的流程, 當時舉的例子是希望你可以理解為啥架設伺服器需要瞭解作業系統的基本觀念。在這一章當中,我們要將該流程更細緻化說明, 因為,透過這個流程分析,你會知道為啥我們的主機需要進行過一些防護之後,系統才能夠比較強壯。此外,透過第二章的網路概念解釋後,你也瞭解了網路是雙向的,伺服器與用戶端都得要有 IP:port 才能夠讓彼此的軟體互相溝通。那麼現在,假設你的主機是 WWW 伺服器,透過底下的圖示,網路封包如何進入你的主機呢?

網路封包進入主機的流程
圖 7.1-1、網路封包進入主機的流程
  1. 經過防火牆的分析:

    Linux 系統有內建的防火牆機制,因此你的連線能不能成功,得要先看防火牆的臉色才行。預設的 Linux 防火牆就有兩個機制,這兩個機制都是獨立存在的,因此我們預設就有兩層防火牆喔。第一層是封包過濾式的 netfilter 防火牆, 另一個則是透過軟體控管的 TCP Wrappers 防火牆。

    • 封包過濾防火牆:IP Filtering 或 Net Filter
      要進入 Linux 本機的封包都會先通過 Linux 核心的預設防火牆,就是稱為 netfilter 的咚咚,簡單的說,就是 iptables 這個軟體所提供的防火牆功能。為何稱為封包過濾呢?因為他主要是分析 TCP/IP 的封包表頭來進行過濾的機制,主要分析的是 OSI 的第二、三、四層,主要控制的就是 MAC, IP, ICMP, TCP 與 UDP 的埠口與狀態 (SYN, ACK...) 等。詳細的資料我們會在第九章防火牆介紹。

    • 第二層防火牆:TCP Wrappers
      通過 netfilter 之後,網路封包會開始接受 Super daemonsTCP_Wrappers 的檢驗,那個是什麼呢? 說穿了就是 /etc/hosts.allow 與 /etc/hosts.deny 的設定檔功能囉。 這個功能也是針對 TCP 的 Header 進行再次的分析,同樣你可以設定一些機制來抵制某些 IP 或 Port ,好讓來源端的封包被丟棄或通過檢驗;

    透過防火牆的管控,我們可以將大部分來自網際網路的垃圾連線丟棄,只允許自己開放的服務的連線進入本機而已, 可以達到最基礎的安全防護。

  2. 服務 (daemon) 的基本功能:

    預設的防火牆是 Linux 的內建功能,但防火牆主要管理的是 MAC, IP, Port 等封包表頭方面的資訊,如果想要控管某些目錄可以進入, 某些目錄則無法使用的功能,那就得要透過權限以及伺服器軟體提供的相關功能了。舉例來說,你可以在 httpd.conf 這個設定檔之內規範某些 IP 來源不能使用 httpd 這個服務來取得主機的資料, 那麼即使該 IP 通過前面兩層的過濾,他依舊無法取得主機的資源喔!但要注意的是, 如果 httpd 這支程式本來就有問題的話,那麼 client 端將可直接利用 httpd 軟體的漏洞來入侵主機,而不需要取得主機內 root 的密碼!因此, 要小心這些啟動在網際網路上面的軟體喔!

  3. SELinux 對網路服務的細部權限控制:

    為了避免前面一個步驟的權限誤用,或者是程序有問題所造成的資安狀況,因此 Security Enhanced Linux (安全強化 Linux) 就來發揮它的功能啦!簡單的說,SELinux 可以針對網路服務的權限來設定一些規則 (policy) ,讓程序能夠進行的功能有限, 因此即使使用者的檔案權限設定錯誤,以及程序有問題時,該程序能夠進行的動作還是被限制的,即使該程序使用的是 root 的權限也一樣。舉例來說,前一個步驟的 httpd 真的被 cracker 攻擊而讓對方取得 root 的使用權,由於 httpd 已經被 SELinux 控制在 /var/www/html 裡面,且能夠進行的功能已經被規範住了,因此 cracker 就無法使用該程序來進行系統的進一步破壞囉。現在這個 SELinux 一定要開啟喔!

  4. 使用主機的檔案系統資源:

    想一想,你使用瀏覽器連接到 WWW 主機最主要的目的是什麼?當然就是讀取主機的 WWW 資料啦! 那 WWW 資料是啥?就是檔案啊!^_^!所以,最終網路封包其實是要向主機要求檔案系統的資料啦。 我們這裡假設你要使用 httpd 這支程式來取得系統的檔案資料,但 httpd 預設是由一個系統帳號名稱為 httpd 來啟動的,所以:你的網頁資料的權限當然就是要讓 httpd 這支程式可以讀取才行啊!如果你前面三關的設定都 OK ,最終權限設定錯誤,使用者依舊無法瀏覽你的網頁資料的。

在這些步驟之外,我們的 Linux 以及相關的軟體都可能還會支援登錄檔記錄的功能,為了記錄歷史歷程, 以方便管理者在未來的錯誤查詢與入侵偵測,良好的分析登錄檔的習慣是一定要建立的,尤其是 /var/log/messages 與 /var/log/secure 這些個檔案!雖然各大主要 Linux distribution 大多有推出適合他們自己的登錄檔分析軟體,例如 CentOS 的 logwatch ,不過畢竟該軟體並不見得適合所有的 distributions ,所以鳥哥嘗試自己寫了一個 logfile.sh 的 shell script,你可以在底下的網址下載該程式:

好了,那麼根據這些流程,你覺得 cracker 這些個壞蛋能夠怎樣的攻擊我們的系統呢?得要先到對方想要怎麼破壞, 我們才能夠想辦法來補強系統嘛!底下先講講基本的攻擊手法囉。

7.1.2 常見的攻擊手法與相關保護

我們由圖 7.1-1 瞭解到資料傳送到本機時所需要經過的幾道防線後,那個權限是最後的關鍵啦! 現在你應該比較清楚為何我們常常在基礎篇裡面一直談到設定正確的權限可以保護你的主機了吧? 那麼 cracker 是如何透過上述的流程還能夠攻擊你的系統啊?底下就讓我們來分析分析。

    取得帳號資訊後猜密碼

由於很多人喜歡用自己的名字來作為帳號資訊,因此帳號的取得是很容易的!舉例來說,如果你的朋友將你的 email address 不小心洩漏出去,例如: dmtsai@your.host.name 之類的樣式,那麼人家就會知道你有一部主機,名稱為 your.host.name,且在這部主機上面會有一個使用者帳號,帳號名稱為 dmtsai ,之後這個壞傢伙再利用某些特殊軟體例如 nmap 來進行你主機的 port scan 之後,嘿嘿!他就可以開始透過你主機有啟動的軟體功能來猜你這個帳號的密碼了!

另外,如果你常常觀察你的主機登錄檔,那你也會發現如果你的主機有啟動 Mail server 的服務時, 你的登錄檔就會常常出現有些怪傢伙嘗試以一些奇怪的常見帳號在試圖猜測你的密碼, 舉例來說像:admin, administrator, webmaster .... 之類的帳號,嘗試來竊取你的私人信件。 如果你的主機真的有這類的帳號,而且這類的帳號還沒有良好的密碼規劃,那就容易『中標』! 唉!真是麻煩!所以我們常講,系統帳號千萬不能給予密碼,容易被猜密碼啊

這種猜密碼的攻擊方式算是最早期的入侵模式之一了,攻擊者知道你的帳號,或者是可以猜出來你的系統有哪些帳號, 欠缺的就只是密碼而已,因此他會『很努力的』去猜你的密碼,此時,你的密碼規劃如果不好的話,很容易就被攻擊了! 主機也很容易被綁架啊!所以,良好的密碼設置習慣是很重要的

不過這種攻擊方式比較費時,因為目前很多軟體都有密碼輸入次數的限制,如果連續輸入三次密碼還不能成功的登入, 那該次連線就會被斷線!所以,這種攻擊方式日益減少,目前偶而還會看到就是了!這也是初級 cracker 會使用的方式之一。 那我們要如何保護呢?基本方式是這樣的:

  • 減少資訊的曝光機會:例如不要將 Email Address 隨意散佈到 Internet 上頭;
  • 建立較嚴格的密碼設定規則:包括 /etc/shadow, /etc/login.defs 等檔案的設定, 建議你可以參考基礎篇內的帳號管理那一章來規範你的使用者密碼變更時間等等, 如果主機夠穩定且不會持續加入某些帳號時,也可以考慮使用 chattr 來限制帳號 (/etc/passwd, /etc/shadow) 的更改;
  • 完善的權限設定:由於這類的攻擊方式會取得你的某個使用者帳號的登入權限, 所以如果你的系統權限設定得宜的話,那麼攻擊者也僅能取得一般使用者的權限而已,對於主機的傷害比較有限啦! 所以說,權限設定是重要的;

    利用系統的程式漏洞『主動』攻擊

圖 7.1-1 裡面的第二個步驟中,我們知道如果你的主機有開放網路服務時, 就必須有啟動某個網路軟體嘛!我們也知道由於軟體可能撰寫方式的問題,可能產生一些會被 cracker 亂用的臭蟲程式碼,而這些臭蟲程式碼由於產生問題的大小,有分為 bug (臭蟲,可能會造成系統的不穩定或當機) 與 Security (安全問題,程式碼撰寫方式會導致系統的使用權限被惡意者所掌握) 等問題。

當程式的問題被公布後,某些較高階的 cracker 會嘗試撰寫一些針對這個漏洞的攻擊程式碼, 並且將這個程式碼放置到 cracker 常去的網站上面,藉以推銷自己的『功力』..... 鳥哥要提醒的是,這種程式碼『是很容易被取得的』。 當更多『盈盈美黛子(台語,閒閒沒事幹之意)』取得這些程式碼後,他可能會想要『試一試這個攻擊程式的威力』, 所以就拿來『掃射』一番,如果你八字比較輕,或者當天星座學家說你比較倒楣時,可能就會被不小心的攻擊到...

這種攻擊模式是目前最常見的,因為攻擊者只要拿到攻擊程式就可以進行攻擊了, 『而且由攻擊開始到取得你系統的 root 權限不需要猜密碼, 不需要兩分鐘,就能夠立刻入侵成功』,所以『盈盈美黛子』們最愛的就是這個咚咚了。 但這個玩意兒本身是靠『你主機的程式漏洞』來攻擊的,所以,如果你的主機隨時保持在即時更新的階段, 或者是關閉大部分不需要的程式,那就可以躲避過這個問題。因此,你應該要這樣做:

  • 關閉不需要的網路服務:開的 port 越少,可以被入侵的管道越少, 一部主機負責的服務越單純,越容易找出問題點。
  • 隨時保持更新:這個沒話講!一定要進行的!
  • 關閉不需要的軟體功能:舉例來說,後面會提到的遠端登入伺服器 SSH 可以提供 root 由遠端登入,那麼危險的事情當然要給他取消啊!^_^

    利用社交工程作欺騙

社交工程 (Social Engineering) 指的其實很簡單,就是透過人與人的互動來達到『入侵』的目的! @_@!人與人的互動可以入侵你的主機?鳥哥在呼嚨你嗎?當然不是。

近日在台灣的社會你不是常看到某些人會以『退稅、中獎、花小錢買貴重物品』等名義來欺騙善良老百姓, 讓老百姓掏出口袋裡的金錢給那些可惡的金光黨嗎?社交工程也是類似的方法。在大公司裡面, 或許你可能會接到這樣的電話:『我是人事部門的經理,我的帳號為何突然間不能登入了? 你給我看一看,恩?乾脆直接幫我另建一個帳號,我告訴你我要的密碼是....』。如果你一時不查給他帳號密碼的話, 你的主機可能就這樣被綁走了~

社交工程的欺騙方法多的是,包括使用『好心的 email 通知』、『警告信函』、『中獎單』等等, 在在都是要欺騙你的帳號密碼,有的則利用釣魚方式來欺騙你在某些惡意網站上面輸入你的帳號密碼, 很討厭的啦!舉例來說,我們崑山計中的 email 常常會收到系統維護的信件,要我們將帳號密碼提交給系統管理員統一控管, 這當然是假的!計中根本不會寄出這樣的信件啊!傷腦筋啦!所以要注意啊!那要如何防範呢?

  • 追蹤對談者:不要一味的相信對方,你必須要有信心的向上呈報, 不要一時心慌就中了計!
  • 不要隨意透露帳號/密碼等資訊:最好不要隨意在 Internet 上面填寫這些資料, 真的很危險的!因為在 Internet 上面,你永遠不知道對方螢幕前面坐著的是誰?

    利用程式功能的『被動』攻擊

啥?除了主動攻擊之外,還有所謂的被動攻擊喔?沒錯啊,『系金ㄟ』!那如何作被動攻擊呢? 那就得要由『惡意網站』講起了。如果你喜歡上網隨意瀏覽的話,那麼有的時候可能會連上一些廣告很多, 或者是一堆彈出式視窗的網站,這些網站有時還會很好心的『提供你很多好用的軟體自動下載與安裝』的功能, 如果該網站是你所信任的,例如 Red Hat, CentOS, Windows 官網的話,那還好, 如果是一個你也不清楚他是幹嘛的網站,那你是否要同意下載安裝該軟體?

如果你常常在注意一些網路危機處理的相關新聞時,常會發現 Windows 的瀏覽器 (IE) 有問題, 有時則是全部的瀏覽器 (Firefox, Netscap, IE...) 都會出現問題。那你會不會覺得奇怪啊, 怎麼『瀏覽器也會有問題?』這是因為很多瀏覽器會主動的答應對方 WWW 主機所提供的各項程式功能, 或者是自動安裝來自對方主機的軟體,有時瀏覽器還可能由於程式發生安全問題, 讓對方 WWW 瀏覽器得以傳送惡意程式碼給你的主機來執行,嘿嘿!中標!

那你又會想啊,那我幹嘛瀏覽那樣的惡意網站?呵呵!總是會有些粗心大意的時候啊!如果你今天不小心收到一個 email ,裡面告訴你你的銀行帳號有問題,希望你趕緊連上某個網頁去看看你的帳號是否在有問題的行列中,你會不會去? 如果今天有個網路消息說某某網頁在提供大特價商品,那你會不會去碰碰運氣? 都是可能的啊!不過,這也就很容易被對方攻擊到了。

那如何防備啊?當然建立良好的習慣最重要了:

  • 隨時更新主機上的所有軟體:如果你的瀏覽器是沒有問題的, 那對方傳遞惡意程式碼時,你的瀏覽器就不會執行,那自然安全的多啊!
  • 較小化軟體的功能:舉例來說,讓你的收信軟體不要主動的下載檔案, 讓你的瀏覽器在安裝某些軟體時,要通過你的確認後才安裝,這樣就比較容易克服一些小麻煩;
  • 不要連接到不明的主機:其實鳥哥認為這個才最難! 因為很多時候我們都用 google 在搜尋問題的解決之道啊,那你如何知道對方是否是騙人的? 所以,前面兩點防備還是很重要的!不要以為沒有連接上惡意網站就不會有問題啊!

    蠕蟲或木馬的 rootkit

rootkit 意思是說可以取得 root 權限的一群工具組 (kit),就如同前面主動攻擊程式漏洞的方法一樣, rootkit 主要也是透過主機的程式漏洞。不過, rootkit 也會透過社交工程讓使用者下載、安裝 rootkit 軟體, 結果讓 cracker 得以簡單的綁架對方主機啊!

rootkit 除了可以透過上述的方法來進行入侵之外,rootkit 還會偽裝或者是進行自我複製, 舉例來說,很多的 rootkit 本身就是蠕蟲或者是木馬間諜程式。蠕蟲會讓你的主機一直發送封包向外攻擊, 結果會讓你的網路頻寬被吃光光,例如 2001-2003 年間的 Nimda, Code Red 等等;至於木馬程式 (Trojan Horse) 則會對你的主機進行開啟後門 (開一個 port 來讓 cracker 主動的入侵),結果就是....綁架、綁架、綁架!

rootkit 其實挺不好追蹤的,因為很多時候他會主動的去修改系統觀察的指令, 包括 ls, top, netstat, ps, who, w, last, find 等等,讓你看不到某些有問題的程式, 如此一來,你的 Linux 主機就很容易被當成是跳板了!有夠危險!那如何防備呢?

  • 不要隨意安裝不明來源的檔案或者是不明網站的檔案資料;
  • 不要讓系統有太多危險的指令:例如 SUID/SGID 的程式, 這些程式很可能會造成使用者不當的使用,而使得木馬程式有機可趁!
  • 可以定時以 rkhunter 之類的軟體來追查:有個網站提供 rootkit 程式的檢查,你可以前往下載與分析你的主機: http://www.rootkit.nl/projects/rootkit_hunter.html

    DDoS 攻擊法 (Distributed Denial of Service )

這類型的攻擊中文翻譯成『分散式阻斷服務攻擊』,從字面上的意義來看,它就是透過分散在各地的僵屍電腦進行攻擊, 讓你的系統所提供的服務被阻斷而無法順利的提供服務給其他用戶的方式。 這種攻擊法也很要命,而且方法有很多,最常見的就屬 SYN Flood 攻擊法了!還記得我們在網路基礎裡面提到的,當主機接收了一個帶有 SYN 的 TCP 封包之後,就會啟用對方要求的 port 來等待連線,並且發送出回應封包 (帶有 SYN/ACK 旗標的 TCP 封包),並等待 Client 端的再次回應。

好了,在這個步驟當中我們來想一想,如果 cient 端在發送出 SYN 的封包後,卻將來自 Server 端的確認封包丟棄,那麼你的 Server 端就會一直空等,而且 Client 端可以透過軟體功能,在短短的時間內持續發送出這樣的 SYN 封包,那麼你的 Server 就會持續不斷的發送確認封包,並且開啟大量的 port 在空等~呵呵!等到全部主機的 port 都啟用完畢,那麼.....系統就掛了!

更可怕的是,通常攻擊主機的一方不會只有一部!他會透過 Internet 上面的僵屍網路 (已經成為跳板,但網站主卻沒有發現的主機) 發動全體攻擊,讓你的主機在短時間內就立刻掛點。 這種 DDoS 的攻擊手法比較類似『玉石俱焚』的手段, 他不是入侵你的系統,而是要讓你的系統無法正常提供服務! 最常被用來作為阻斷式服務的網路服務就是 WWW 了,因為 WWW 通常得對整個 Internet 開放服務。

這種攻擊方法也是最難處理的,因為要嘛就得要系統核心有支援自動抵擋 DDoS 攻擊的機制, 要嘛你就得要自行撰寫偵測軟體來判斷!真是麻煩啊~而除非你的網站非常大, 並且『得罪不少人』,否則應該不會被 DDoS 攻擊啦! ^_^

    其他

上面提到的都是比較常見的攻擊方法,是還有一些高竿的攻擊法啦,不過那些攻擊法都需要有比較高的技術水準,例如 IP 欺騙。他可以欺騙你主機告知該封包來源是來自信任網域,而且透過封包傳送的機制, 由攻擊的一方持續的主動發送出確認封包與工作指令。如此一來,你的主機可能就會誤判該封包確實有回應, 而且是來自內部的主機。

不過我們知道網際網路是有路由的,而每部主機在每一個時段的 ACK 確認碼都不相同, 所以這個方式要達成可以登入,會比較麻煩,所以說,不太容易發生在我們這些小型主機上面啦! 不過你還是得要注意一下說:

  • 設定規則完善的防火牆:利用 Linux 內建的防火牆軟體 iptables 建立較為完善的防火牆,可以防範部分的攻擊行為;
  • 核心功能:這部份比較複雜,你必須要對系統核心有很深入的瞭解, 才有辦法設定好你的核心網路功能。
  • 登錄檔與系統監控:你可以透過分析登錄檔來瞭解系統的狀況, 另外也可以透過類似 MRTG 之類的監控軟體 來即時瞭解到系統是否有異常,這些工作都是很好的努力方向!

    小結語

要讓你的系統更安全,沒有『三兩三』是沒辦法『上梁山』的!我們也一直鼓吹, 『維護網站比架設網站還要重要』的觀念!因為『一人得道雞犬升天』,同樣的道理:『一人中標全員掛點』, 不要以為你的主機沒有啥重要資料,被入侵或被植入木馬也沒有關係, 因為我們的伺服器通常會對內部來源的主機規範的較為寬鬆,如果你的主機在公司內部, 但是不小心被入侵的話,那麼貴公司的伺服器是否就會暴露在危險的環境當中了?

另外,在蠕蟲很『發達』的年代,我們也會發現只要區域網路裡面有一部主機中標,整個區域網路就會無法使用網路了, 因為頻寬已經被蠕蟲塞爆!如果老闆發現他今天沒有辦法收信了,但無法收信的原因並非伺服器掛點, 而是因為內部人員的某部個人電腦中了蠕蟲,而那部主機中蠕蟲的原因只是因為該使用者不小心去看了一下色情網站, 你覺得老闆會高興的跟該員工一起看色情網站還是 fire 掉該人員?

所以啊,主機防護還是很重要的!不要小看了!提供幾個方向給大家思考看看吧:

  1. 建立完善的登入密碼規則限制;
  2. 完善的主機權限設定;
  3. 設定自動升級與修補軟體漏洞、及移除危險軟體;
  4. 在每項系統服務的設定當中,強化安全設定的項目;
  5. 利用 iptables, TCP_Wrappers 強化網路防火牆;
  6. 利用主機監控軟體如 MRTG 與 logwatch 來分析主機狀況與登錄檔;

7.1.3 主機能作的保護: 軟體更新、減少網路服務、啟動 SELinux

根據本章前面的分析,現在你知道封包的流向以及主機基本需要進行的防護了。不過你或許還是有疑慮,那就是, 既然我都已經有了防火牆,那麼權限的控管啦、密碼的嚴密性啦、伺服器軟體的更新啦、SELinux 啦等等的, 是否就沒有這麼重要呢?畢竟它是封包進入的第一關卡!這關把關嚴格,後續可以稍微寬鬆嗎?其實...你錯了! 對於開放某些服務的伺服器來說,你的防火牆『根本跟屁一樣,是沒有用的!』怎麼說呢?

    軟體更新的重要性

讓我們瞧一瞧圖 7.1-1 的流程好了,假設你需要對全世界開放 WWW ,那麼提供 WWW 服務的 httpd 這隻程式就得要執行,並且,你的防火牆得要打開 port 80 讓全世界都可以連接到你的 port 80 ,這樣才是一部合理的 WWW 伺服器嘛!問題來啦,如果 httpd 這隻程式有資安方面的問題時,請問防火牆有沒有效用?當然沒有!因為防火牆原本就得要開放 port 80 啊!此時防火牆對你的 WWW 一點防護也沒有。那怎辦?

沒啥好說的,就是軟體持續更新到最新就對了!因為自由軟體就是有這個好處,當你的程式有問題時, 開發商會在最短的時間內取得志工提供的修補程式 (patch) ,並將該程式碼補充到軟體更新資料庫中, 讓一般用戶可以直接透過網路來自動更新。因此,要克服這個伺服器軟體的問題,更新系統軟體就對了。

但是你得要注意,你的系統能否更新軟體與系統的版本有關!舉例來說,2003 年左右發佈的 Red Hat 9 目前已經沒有支援了, 如果你還是執意要安裝 Red Hat 9 這套系統,那麼很抱歉,你得要手動將系統內的軟體透過 make 動作來重新編譯到最新版, 因此,很麻煩~同樣的, Fedora 最新版雖然有提供網路自動更新,但是 Fedora 每一個版本的維護期間較短, 你可能需要常常大幅度的變更你的版本,這對伺服器的設定也不妥當。此時一個企業版本的 Linux distributions 就很重要啦! 舉例來說,鳥站的主機截至目前為止 (2011/07) 還是使用 CentOS 4.x ,因為這個版本目前還是持續維護中。 這對伺服器來說,是相當重要的!穩定與安全比什麼都重要!

想要瞭解軟體的安全通報,可以參考如下的網站資料喔!

    認識系統服務的重要性

再回到圖 7.1-1 當中,同時思考一下第二章網路基礎裡面談到的網路連線是雙向這件事, 我們會得到一個答案,那就是在圖 7.1-1 內的第二個步驟中,如果能夠減少伺服器上面的監聽埠口, 此時因為伺服器端沒有可供連線的埠口,用戶端當然也就無法連線到伺服器端嘛!那麼如何限制伺服器開啟的埠口呢? 第二章就談到過了,關閉埠口的方式是透過關閉網路服務。沒錯啊!所以囉,此時能夠減少網路服務就減少,可以避免很多不必要的麻煩。

    權限與 SELinux 的輔助

根據網路上面多年來的觀察,很多朋友在發生權限不足方面的問題後,都會直接將某個目錄直接修訂成為 chmod -R 777 /some/path/。 如果這部主機只是測試用的沒有上網提供服務,那還好。如果有上網提供某些服務時,那可就傷腦筋了!因為目錄的 wx 權限設定一起後, 代表該身份可以進行新增與刪除的動作。偏偏你又給 777 (rwxrwxrwx) ,代表所有的人都可以在該目錄下進行新增與刪除! 萬一不小心某支程式被攻擊而被取得操作權,想想看,你的系統不就可能被寫入某些可怕的東西了嗎? 所以不要隨便設定權限啊!

那如果由於當初規劃的帳號身份與群組設定的太雜亂,導致無法使用單純的三種身份的三種權限來設定你的系統時,那該如何是好? 沒關係的,可以透過 ACL 這個好用的東西! ACL 可以針對單一帳號或單一群組進行特定的權限設定,相當好用喔! 他可以輔助傳統 Unix 的權限設定方面的困擾哩。詳情請參考基礎篇的內容呦!

那如何避免使用者亂用系統,亂設定權限呢?這個時候就得要透過 SELinux 來控制了。SELinux 可以在程序與檔案之間再加入一道細部的權限控制,因此,即使程序與檔案的權限符合了操作動作,但如果程序與檔案的 SELinux 類型 (type) 不吻合時,那麼該程序就無法讀取該檔案喔! 此外,我們的 CentOS 也針對了某些常用的網路服務制訂了許多的檔案使用規則 (rule),如果這些規則沒有啟用, 那麼即使權限、SELinux 類型都對了,該網路服務的功能還是無法順利的運作喔!


根據這樣的分析,我們可以知道,隨時更新系統軟體、限制連線埠口以及透過啟動 SELinux 來限制網路服務的權限,經過這三個簡單的步驟,你的系統將可以獲得相當大的保護!當然啦, 後續的防火牆以及系統登錄檔分析工作仍是需要進行的。本章後續將依據這三點來深入介紹。

7.2 網路自動升級軟體

在現在的網際網路上面,cracker 實在是太多了!這些閒人會利用已經存在的系統漏洞,來進行偵測、入侵你的主機。 因此,除了未來架設防火牆之外,最重要的 Linux 日常管理工作,莫過於軟體的升級了! 不過,如果使用者還得要自己每天觀察網路安全通報,並主動去查詢各大 distribution 針對這些漏洞來提供升級軟體包, 那真是太不人性化了!因此,目前就有很多線上直接更新的機制出現了!有了這些線上直接更新軟體的手段與方法, 我們系統管理員在管理主機系統上面,可就輕鬆的多囉!

7.2.1 如何進行軟體升級

通常鳥哥安裝好 Linux 之後,會先開啟系統預設的防火牆機制,然後第一件事情就是進行全系統更新啦! 不論是哪一套 Linux 鳥哥都是這樣做的,因為要避免軟體資安的問題嘛!好了,那麼 Linux 上面的軟體該如何進行更新與升級呢? 還記得你是如何安裝軟體的嗎?不就是 rpm, tarball 與 dpkg 嗎? 所以囉,你的軟體如果想要升級,那就得依據當時你安裝該軟體的方式來進行升級啊!而每種方式都有其適用性:

  • RPM
    這是目前最常見於 Linux distribution 當中的軟體管理方式,包括 CentOS / Fedora / SuSE / Red Hat / Mandriva 等等,都是使用這個方式來管理的;

  • Tarball
    利用軟體的官方網站所釋出的原始碼在您的系統上面編譯與安裝, 一般來說,由於軟體是直接在自己的機器上面編譯的,所以效能會比較好一些。 不過,升級的時候就比較麻煩,因為又得要下載新的原始碼並且重新編譯一次。 這種安裝模式常見於某些特殊軟體 (沒有包含在 distribution 當中),或者是 Gentoo 這個強調效能的 distribution;

  • dpkg
    是 debian 這個 distribution 所使用的軟體管理方式,與 RPM 很類似,都是透過預先編譯的處理,可以讓 end user 直接使用來升級與安裝。

舉例來說,如果你的系統是 CentOS ,我們知道他使用的是 RPM 類型的軟體管理模式,那如果你想要安裝 B2D 的軟體怎辦?要注意, B2D 是使用 debian 的 dpkg 來管理軟體的,兩者並不相同啊!要互相安裝太難了! 所以說,要升級的話,得先瞭解到你系統上的軟體安裝與管理的方法才行。

不過,有個特殊案例,那就是舊版本的 Linux (例如 Red Hat 9) 的軟體升級該如何是好? 由於舊版本的軟體支援度本來就比較差,商業公司或者是社群也沒有這麼多心力放在舊版本的支援上, 所以,你這個時候可以選擇: (1)升級到較新的版本,例如 CentOS 6.x,或者是 (2)利用 Tarball 來自行升級核心與軟體。不過,比較建議升級到新版本啦,因為要自行以手動方式由 Tarball 安裝到最新的版本,實在是很費時費力,而且還得要常常查閱官方網站所推出的最新消息, 漏過一則都可能發生無法預期的狀況。

我們都曉得在 Windows 的環境下,他有提供一個 Live update 的項目可以自動的線上升級, 甚至很多的防毒軟體與防木馬軟體也都有推出即時的線上更新,如此一來可以讓您的軟體維持在最新版的狀況, 真是好啊!咦!那我們的 Linux 是否有這樣的功能?如果有的話,那麼系統自動進行軟體升級, 不就可以輕鬆又快樂了?沒錯!確實是這樣的!所以就讓我們來談一談 Linux 的線上升級機制吧!

在 Linux 最常見的軟體安裝方式: RPM / Tarball / dpkg 當中,Tarball 由於取得的是原始碼, 所以要用 Tarball 來作線上自動更新是不太可能進行的,所以僅能用 RPM 或 dpkg 這兩種軟體管理的方式來進行線上更新了。

但 RPM 與 dpkg 不是有所謂的相依屬性嗎?這倒不需要擔心吶!因為我們的 RPM 與 dpkg 軟體檔案都有一些軟體的基本資訊, 並同時記錄了軟體的相依屬性 (記得使用 rpm -q 的查詢嗎),所以當分析這些基本資訊並使用一些機制將這些相依資訊記錄下來後, 再透過一些額外的網路功能,就能夠自動的分析你的系統與修補軟體之間的差異, 並可進一步幫你分析所需要升級與相依屬性的軟體,就可達成自動升級的理想啦!

由於各家 distributions 在管理系統上都有自己獨特的想法,所以在分析 RPM 或 dpkg 軟體與方式上面就有所不同, 也就有底下這些不同的線上升級機制啦:

  • yum
    CentOS 與 Fedora 所常用的自動升級機制,透過 FTP 或 WWW 來進行線上升級以及線上直接安裝軟體;

  • apt
    最早由 debian 這個 distribution 所發展,現在 B2D 也是使用 apt ,同時由於 apt 的可移植性, 所以只要你的 RPM 可以使用 apt 來管理的話,就可以自行建立 apt 伺服器來提供其他使用者進行線上安裝與升級。

  • you
    所謂的 Yast Online Update (YOU) 是由 SuSE 所自行開發出來的線上安裝升級方式, 經過註冊取得一組帳號密碼後,就能夠使用 you 的機制來進行線上升級。不過如果是免費的版本, 則僅有 60 天的試用期!

  • urpmi
    這個則是 Mandriva 所提供的線上升級機制!

講了這些升級機制並且與 distribution 作了對應,你就該瞭解到:『每個 distribution 可以使用的線上升級機制都不相同』的啊!所以請參考你的 distribution 所提供的文件來進行線上升級的設定喔!否則就得要自行手動下載安裝了! @_@

鳥哥這裡都是使用 CentOS 這個 Red Hat 相容的 distributions 來介紹的,因此,底下僅介紹了 yum 而已。 不過,yum 已經能夠適用於 CentOS, Red Hat Enterprise Linux, Fedora 等等,也應該是挺夠用的了! 另外,基礎篇裡面已經談過 rpm 與 yum 的用法,所以在這裡僅是加強介紹與更新有關的用法而已喔!

7.2.2 CentOS 的 yum 軟體更新、映射站使用的原理

我們曾經在基礎篇裡面談過 yum 了,基本上他的原理是,我們的 CentOS 會跑到 yum 伺服器上頭,下載了官方網站釋出的 RPM 表頭清單資料,該資料除了記載每個 RPM 軟體的相依性之外,也說明了 RPM 檔案所放置的容器 (repository) 所在。因此透過分析這些資料,我們的 CentOS 就能夠直接使用 yum 去下載與安裝所需要的軟體了! 詳細圖示與流程有點像這樣:

使用 yum 下載清單表頭與取得容器相關資料示意圖
圖 7.2-1、使用 yum 下載清單表頭與取得容器相關資料示意圖
  1. 先由設定檔判斷 yum server 所在 IP 位址;
  2. 連接到 yum server 後,先下載新的 RPM 檔案的表頭資料;
  3. 分析比較使用者所欲安裝/升級的檔案,並提供使用者確認;
  4. 下載使用者選擇的檔案到系統中的 /var/cache/yum ,並進行實際安裝;

由於你所下載的清單當中已經含有所有官方網站所釋出的 RPM 檔案的表頭相依屬性的關係, 所以如果你想要安裝的軟體包含某些尚未安裝的相依軟體時,我們的 yum 會順便幫你下載所需要的其他軟體,預先安裝後, 再安裝你所實際需要的軟體!從分析、下載到安裝,全部一口氣搞定!很簡單的啦!

不過,恐怕還是有問題。如果全世界使用 CentOS 的朋友通通連線到同一部 Yum 伺服器去下載所需要的 RPM 檔案,哇! 那頻寬不就很容易被塞爆!那怎辦?沒關係,有所謂的映射站啊! CentOS 在世界各地都有映射站,這些映射站會將官網的 yum 伺服器的資料複製一份,同時在映射站上面也提供同樣的 yum 功能,因此,你可以在任何一部 yum 伺服器的映射站上面下載與安裝軟體。底下是 CentOS 官網上面列出的亞洲地區映射站一覽表:

現在的 yum 又很聰明,它會自動的去分析離你的主機最近的那部映射站,然後直接使用該部映射主機作為你的 yum 來源, 因此,『理論上』你不需要更動任何設定,在台灣,你的 CentOS 就會使用台灣地區的 yum 伺服器囉!就這麼簡單! 所以,接下來就讓我們直接來談談怎麼使用 yum 吧!

Tips 鳥哥 yum 的原理與相關使用,我們在基礎篇裡面已經分門別類的介紹過了,因此底下僅就比較重要的部分介紹一下囉!

7.2.3 yum 的使用: 安裝, 軟體群組, 全系統更新

yum 可不止能夠線上自動升級而已,他還可以作查詢、軟體群組的安裝、整體版本的升級等等,好用的哩! 先來談論一下 yum 這個指令的用法吧:

[root@www ~]# yum [option] [查詢的工作項目] [相關參數]
選項與參數:
option:主要的參數,包括有:
   -y :當 yum 詢問使用者的意見時,主動回答 yes 而不需要由鍵盤輸入;

[查詢的工作項目]:由於不同的使用條件,而有一些選擇的項目,包括:
   install :指定安裝的軟體名稱,所以後面需接『 軟體名稱 』
   update  :進行整體升級的行為;當然也可以接某個軟體,僅升級一個軟體;
   remove  :移除某個軟體,後面需接軟體名稱;
   search  :搜尋某個軟體或者是重要關鍵字;
   list    :列出目前 yum 所管理的所有的軟體名稱與版本,有點類似 rpm -qa;
   info    :同上,不過有點類似 rpm -qai 的執行結果;
   clean   :下載的檔案被放到 /var/cache/yum ,可使用 clean 將他移除,
             可清除的項目:packages | headers | metadata | cache 等;

在[查詢的工作項目]部分還可以具有整個群組軟體的安裝方式,如下所示:
   grouplist   :列出所有可使用的『軟體群組』,例如 Development Tools 之類的;
   groupinfo   :後面接 group_name,則可瞭解該 group 內含的所有軟體名;
   groupinstall:這個好用!可以安裝一整組的軟體群組,相當的不錯用!
                 更常與 --installroot=/some/path 共用來安裝新系統
   groupremove :移除某個軟體群組;

# 範例一:搜尋 CentOS 官網提供的軟體名稱是否有與 RAID 有關的?
[root@www ~]# yum search raid
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile  <==這裡就是在測試最快的映射站
 * base: ftp.isu.edu.tw                     <==共有四個容器內容
 * extras: ftp.isu.edu.tw                   <==每個容器都在 ftp.isu.edu.tw 上
 * updates: ftp.isu.edu.tw
base                           | 3.7 kB     00:00  <==下載軟體的表頭清單中
extras                         |  951 B     00:00
updates                        | 3.5 kB     00:00
=================== Matched: raid =================<==找到的結果如下
dmraid.i686 : dmraid (Device-mapper RAID tool and library)
....(中間省略)....
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID
....(底下省略)....

# 範例二:上述輸出結果中, mdadm 的功能為何?
[root@www ~]# yum info mdadm
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.twaren.net
 * extras: ftp.twaren.net
 * updates: ftp.twaren.net
Installed Packages  <==這裡說明這是已經安裝的軟體!
Name       : mdadm
Arch       : x86_64
Version    : 3.1.3
Release    : 1.el6
Size       : 667 k
Repo       : installed
From repo  : anaconda-CentOS-201106060106.x86_64
Summary    : The mdadm program controls Linux md devices (software RAID
URL        : http://www.kernel.org/pub/linux/utils/raid/mdadm/
License    : GPLv2+
Description: The mdadm program is used to create, manage, and monitor
....(底下省略)....
# 由上述底線的 Summary 關鍵字,知道這軟體在達成軟體磁碟陣列功能!!

yum 真是個很好用的東西,它可以直接查詢是否有某些特殊的軟體名稱。舉例來說,你可以利用底下的兩個方式取得軟體名稱:

  • yum search "一些關鍵字"
  • yum list (可列出所有的軟體檔名)

然後再以正規表示法取得關鍵字,或者是『 yum info "軟體名稱" 』就能夠知道該軟體的用途,最後再決定要不要安裝啊!上面的範例一就是在找出磁碟陣列的管理軟體。 如果確定要安裝時,那就參考參考底下的流程吧!

    利用 yum 進行安裝
# 範例三:安裝某個軟體吧!以 mdadm 這個軟體名為例:
[root@www ~]# yum install mdadm
....(前面省略)....
Setting up Install Process
Package mdadm-3.1.3-1.el6.x86_64 already installed and latest version
Nothing to do

[root@www ~]# yum install mdadma
Setting up Install Process
No package mdadma available.
Nothing to do

仔細的看上述的兩個指令,第二個指令鳥哥故意寫錯字,讓軟體名稱由 mdadm 變成 mdadma 了!模擬同學如果打錯字時所輸出的訊息。由上述的訊息你可以知道,同樣結果是『Nothing to do』,但是 yum 會告訴你該軟體是『已安裝 (installed and lastest version)』還是『沒有該軟體 (No package mdadma available)』。作這個範例是希望朋友們能夠仔細的看輸出的訊息啦!好啦!我們還是來安裝一個不曾裝過的, 就拿 javacc 這套軟體來裝看看好了!

[root@www ~]# yum list javacc*
Available Packages
javacc.x86_64            4.1-0.5.el6      base
javacc-demo.x86_64       4.1-0.5.el6      base
javacc-manual.x86_64     4.1-0.5.el6      base
# 共有三套軟體,分別是 javacc, javacc-demo, javacc-manual ,版本為 4.1-0.5.el6,
# 軟體是放置到名稱為 base 的容器當中存放的。

[root@www ~]# yum install javacc
....(前面省略)....
Setting up Install Process
Resolving Dependencies
--> Running transaction check  <==開始檢查有沒有相依屬性的軟體問題
---> Package javacc.x86_64 0:4.1-0.5.el6 set to be updated
....(中間省略)....

=========================================================================
 Package                     Arch     Version           Repository  Size
=========================================================================
Installing:
 javacc                      x86_64   4.1-0.5.el6       base       895 k
Installing for dependencies:
 java-1.5.0-gcj              x86_64   1.5.0.0-29.1.el6  base       139 k
 java_cup                    x86_64   1:0.10k-5.el6     base       197 k
 sinjdoc                     x86_64   0.5-9.1.el6       base       705 k

Transaction Summary
=========================================================================
Install       4 Package(s)  <==安裝軟體彙整,共安裝 4 個,升級 0 個軟體
Upgrade       0 Package(s)

Total download size: 1.9 M
Installed size: 5.6 M
Is this ok [y/N]: y  <==讓你確認要下載否!
Downloading Packages:
(1/4): java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64.rpm      | 139 kB     00:00
(2/4): java_cup-0.10k-5.el6.x86_64.rpm                 | 197 kB     00:00
(3/4): javacc-4.1-0.5.el6.x86_64.rpm                   | 895 kB     00:00
(4/4): sinjdoc-0.5-9.1.el6.x86_64.rpm                  | 705 kB     00:00
-------------------------------------------------------------------------
Total                                         3.1 MB/s | 1.9 MB     00:00
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64             1/4
  Installing     : 1:java_cup-0.10k-5.el6.x86_64                      2/4
  Installing     : sinjdoc-0.5-9.1.el6.x86_64                         3/4
  Installing     : javacc-4.1-0.5.el6.x86_64                          4/4

Installed:            <==主要需要安裝的
  javacc.x86_64 0:4.1-0.5.el6

Dependency Installed: <==為解決相依性額外裝的
  java-1.5.0-gcj.x86_64 0:1.5.0.0-29.1.el6   java_cup.x86_64 1:0.10k-5.el6
  sinjdoc.x86_64 0:0.5-9.1.el6

Complete!

瞧!經過 yum 我們可以很輕鬆的就安裝好一個軟體,並且這個軟體已經主動的幫我們做好相依屬性的克服了, 真是方便到爆!另外,CentOS 6.x 預設的情況下,yum 下載的資料除了每個容器的表頭清單檔案之外,所有下載的 RPM 檔案都會在安裝完畢之後予以刪除! 這樣你的系統就不會有容量被下載的資料塞爆的問題。但如果你想要下載的 RPM 檔案繼續保留在 /var/cache/yum 當中,就得要修改 /etc/yum.conf 設定檔了!

[root@www ~]# vim /etc/yum.conf   <==看看就好,不要真的作!
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
....(底下省略)....

上述的特殊字體地方將 0 改成 1 ,這樣就能夠讓你的 RPM 檔案保存下來。不過,除非你有好多部主機要更新, 你想利用一台先 yum 升級且下載,然後將所有的 RPM 檔案收集起來給內網的機器升級 (rpm -Fvh *.rpm) 之外, 上面的 vim 修改動作不建議修改!因為你的 /var 恐怕會被塞爆啊!再次提醒!

    yum 安裝軟體群組

什麼是『軟體群組』呢?由於 RPM 軟體將一個大專案分成好幾個小計畫來執行,每個小計畫都可以獨立安裝, 這樣的好處是可以讓使用者與軟體發展者安裝不同的環境!舉例來說,在桌面系統中 (Desktop),一般用戶應該不會跑去發展軟體吧? 所以針對桌上型電腦,軟體群組又分為 "Desktop Platform" 與開發者 "Desktop Platform Development" 兩部份, 每個軟體群組內又含有多個不同的 RPM 軟體檔案!這樣做的用途是方便使用者安裝一整套的專案啦!

那麼系統有多少軟體群組呢?又該如何觀察某個軟體群組有擁有的 RPM 檔案呢?我們就利用 Desktop Platform 這個專案來說明一下囉:

# 範例四:查詢系統有的軟體群組有多少個?
[root@www ~]# LANG=C yum grouplist
Installed Groups:             <==這個是已安裝的軟體群組
   Additional Development
   Arabic Support
   Armenian Support
   Base
....(中間省略)....
Available Groups:             <==這個是尚可安裝的軟體群組
   Afrikaans Support
   Albanian Support
   Amazigh Support
....(中間省略)....
   Desktop Platform
   Desktop Platform Development
....(後面省略)....

# 範例五:那麼 Desktop Platform 內含多少個 RPM 軟體呢?
[root@www ~]# yum groupinfo "Desktop Platform"
Group: 桌面環境平台
 Description: 受支援的 CentOS Linux 桌面平台函式庫。
 Mandatory Packages: <==主要的會被安裝的軟體有這些
   atk
....(中間省略)....
 Optional Packages:  <==額外可選擇的軟體是這些
   qt-mysql
....(底下省略)....
# 如果你確定要安裝這個軟體群組的話,那就這樣做:

[root@www ~]# yum groupinstall "Desktop Platform"
# 因為這裡在介紹伺服器的環境,所以上面的動作鳥哥是按下 n 來拒絕安裝的!

利用這個『 yum groupinstall "軟體群組名" 』可以讓你一口氣安裝很多的軟體, 而不必擔心某個軟體忘記裝了!實在是很不錯啦~而且利用 groupinfo 的功能你也可以發現一些不錯的軟體資料, 如此一來,你就可以更方便的管理你的 Linux 系統了,很不錯吧!

    全系統更新

我們都知道使用『yum update』就可以進行軟體的更新。不過你曉得嗎? yum update 也可以直接進行同一版本的升級喔!舉例來說,你可以從 6.0 升級到 6.1 版本哩!而且中間過程完全無痛呦! 就跟一般軟體升級而已,並沒有不同呦!夠愉快吧!

不過,如果你是想要從較舊版的 CentOS 5.x 升級到 6.x 的話,那麼可能就得要多費些功夫了。為啥不要重灌比較快呢?因為你可能已經有些資料設定好,所以不想變更嘛! 但老實說,不同版本 (ex> 5.x --> 6.x) 間的升級最好還是不要嘗試啦!重新安裝可能是最好的狀況。 底下列出酷學園的前輩提供的升級方式,以及 CentOS 官網直接提供的升級方式給你參考參考:

例題:
請設定一下工作排程,讓你的 CentOS 可以每天自動更新系統
答:
可以使用『 crontab -e 』來動作,也可以編輯『 vim /etc/crontab 』來動作, 由於這個更新是系統方面的,所以鳥哥習慣使用 vim /etc/crontab 來進行指令的說明。 其實內容很簡單:
40 5 * * * root yum -y update && yum clean packages
這樣就可以自動更新了, 時間訂在每天的凌晨 5:40 。

7.2.4 挑選特定的映射站:修改 yum 設定檔與清除 yum 快取

雖然 yum 是你的主機能夠連線上 Internet 就可以直接使用的,不過,由於 CentOS 的映射站台可能會選錯, 舉例來說,我們在台灣,但是 CentOS 的映射站台卻選擇到了大陸北京或者是日本去,有沒有可能發生啊! 有啊!鳥哥教學方面就常常發生這樣的問題,要知道,我們連線到大陸或日本的速度是非常慢的呢!那怎辦? 當然就是手動的修改一下 yum 的設定檔就好囉!

在台灣,鳥哥熟悉的 CentOS 映射站台主要有崑山科大、高速網路中心與義守大學。 在學術網路之外,鳥哥近來比較偏好高速網路中心,似乎更新的速度比較快,而且連接台灣學術網路也非常快速哩! 因此,鳥哥底下建議台灣的朋友使用高速網路中心的 ftp 主機資源來作為 yum 伺服器來源喔!不過,因為鳥哥的機器很多都在崑山科大, 所以在學術網路上,使用的反而是崑山科大的 FTP 囉。目前高速網路中心對於 CentOS 所提供的相關網址如下:

如果你連接到上述的網址後,就會發現裡面有一堆連結,那些連結就是這個 yum 伺服器所提供的容器了! 所以高速網路中心也提供了 addons, centosplus, extras, fasttrack, os, updates 等容器,最好認的容器就是 os (系統預設的軟體) 與 updates (軟體升級版本) 囉!由於鳥哥在我的測試用主機是利用 x86_64 的版本, 因此那個 os 再點進去就會得到如下的可提供安裝的網址:

為什麼在上述的網址內呢?有什麼特色!最重要的特色就是那個『 repodata 』的目錄!該目錄就是分析 RPM 軟體後所產生的軟體屬性相依資料放置處!因此,當你要找容器所在網址時, 最重要的就是該網址底下一定要有個名為 repodata 的目錄存在!那就是容器的網址了! 其他的容器正確網址,就請各位看倌自行尋找一下喔!現在讓我們修改設定檔吧!

[root@www ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

如上所示,鳥哥僅列出 base 這個容器的原始內容而已,其他的容器內容請自行查閱囉!上面的資料需要注意的是:

  • [base]
    代表容器的名字!中刮號一定要存在,裡面的名稱則可以隨意取。但是不能有兩個相同的容器名稱,否則 yum 會不曉得該到哪裡去找容器相關軟體清單檔案。

  • name
    只是說明一下這個容器的意義而已,重要性不高!

  • mirrorlist=
    列出這個容器可以使用的映射站台,如果不想使用,可以註解到這行。由於等一下我們是直接設定映射站, 因此這行待會兒確實是需要註解掉的喔!

  • baseurl=
    這個最重要,因為後面接的就是容器的實際網址! mirrorlist 是由 yum 程式自行去捉映射站台, baseurl 則是指定固定的一個容器網址!我們剛剛找到的網址放到這裡來啦!

  • enable=1
    就是讓這個容器被啟動。如果不想啟動可以使用 enable=0 喔!

  • gpgcheck=1
    還記得 RPM 的數位簽章嗎?這就是指定是否需要查閱 RPM 檔案內的數位簽章!

  • gpgkey=:就是數位簽章的公鑰檔所在位置!使用預設值即可

瞭解這個設定檔之後,接下來讓我們修改整個檔案的內容,讓我們這部主機可以直接使用高速網路中心的資源吧! 修改的方式鳥哥僅列出 base 這個容器項目而已,其他的項目請您自行依照上述的作法來處理即可!

[root@www ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.twaren.net/Linux/CentOS/6/os/x86_64/   <==就屬它最重要!
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
# 底下其他的容器項目,請自行到高速網路中心去查詢後自己處理!

[root@www ~]# yum clean all  <==改過設定檔,最好清除既有清單

接下來當然就是給他測試一下囉!如何測試呢?再次使用 yum 即可啊!

# 範例:列出目前 yum server 所使用的容器有哪些?
[root@www ~]# yum repolist all
repo id        repo name                status
base           CentOS-6 - Base          enabled: 6,019
c6-media       CentOS-6 - Media         disabled
centosplus     CentOS-6 - Plus          disabled
contrib        CentOS-6 - Contrib       disabled
debug          CentOS-6 - Debuginfo     disabled
extras         CentOS-6 - Extras        enabled:     0
updates        CentOS-6 - Updates       enabled: 1,042
repolist: 7,061
# 在 status 上寫 enabled 才是有啟動的!由於 /etc/yum.repos.d/
# 有多個設定檔,所以你會發現還有其他的容器存在。


  • 修改容器產生的問題與解決之道

由於我們是修改系統預設的設定檔,事實上,我們應該要在 /etc/yum.repos.d/ 底下新建一個檔案, 該副檔名必須是 .repo 才行!但因為我們使用的是指定特定的映射站台,而不是其他軟體開發生提供的容器, 因此才修改系統預設設定檔。但是可能由於使用的容器版本有新舊之分,你得要知道, yum 會先下載容器的清單到本機的 /var/cache/yum 裡面去!那我們修改了網址卻沒有修改容器名稱 (中刮號內的文字), 可能就會造成本機的清單與 yum 伺服器的清單不同步,此時就會出現無法更新的問題了!

那怎麼辦啊?很簡單,就清除掉本機上面的舊資料即可!需要手動處理嗎?不需要的, 透過 yum 的 clean 項目來處理即可!

[root@www ~]# yum clean [packages|headers|all] 
選項與參數:
 packages:將已下載的軟體檔案刪除
 headers :將下載的軟體檔頭刪除
 all     :將所有容器資料都刪除!

# 範例:刪除已下載過的所有容器的相關資料 (含軟體本身與清單)
[root@www ~]# yum clean all
例題:
有一個網址: http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/ ,裡面包含了台灣的國家高速網路中心所發展的自由軟體。 請依據該網址提供的資料,做成系統可以自動網路安裝的 yum 格式。
答:
由於 http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/ 裡面就有 repodata/ 目錄,因此,這個網址可以直接做成 yum 的容器設定檔。 你可以這麼做的:
[root@www ~]# vim /etc/yum.repos.d/drbl.repo
[drbl]
name=This is DRBL site
baseurl=http://free.nchc.org.tw/drbl-core/i386/RPMS.drbl-stable/
enable=1
gpgcheck=0

[root@www ~]# yum search drbl
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
============================== Matched: drbl ==============================
clonezilla.i386 : Opensource Clone System (ocs), clonezilla
drbl.i386 : DRBL (Diskless Remote Boot in Linux) package.
drbl-chntpw.i386 : Offline NT password and registry editor
....(底下省略)....

[root@www ~]# yum repolist all
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id        repo name                status
base           CentOS-6 - Base          enabled: 6,019
c6-media       CentOS-6 - Media         disabled
centosplus     CentOS-6 - Plus          disabled
contrib        CentOS-6 - Contrib       disabled
debug          CentOS-6 - Debuginfo     disabled
drbl           This is DRBL site        enabled:    36 <==新的在此!
extras         CentOS-6 - Extras        enabled:     0
updates        CentOS-6 - Updates       enabled: 1,042
repolist: 7,097
drbl 這個新增的容器裡面,擁有 36 個軟體喔!這樣夠清楚嗎?

7.3 限制連線埠口 (port)

為什麼我們的主機會回應網路上面的一些要求封包呢?例如我們設定了一部 WWW 主機後,當有來自 Internet 的 WWW 要求時,我們的主機就會予以回應,這是因為我們的主機有啟用了 WWW 的監聽埠口啊!所以,當我們啟用了一個 daemon 時,就可能會造成主機的埠口在進行監聽的動作,此時該 daemon 就是已經對網路上面提供服務了!萬一這個 daemon 程式有漏洞,因為他提供了 Internet 的服務,所以就容易被 Internet 上面的 cracker 所攻擊了!所以說,仔細的檢查自己系統上面的埠口到底開了多少個,並且予以嚴格的管理,才能夠降低被攻擊的可能性啊!

7.3.1 什麼是 port

快講到爛掉了!當妳啟動一個網路服務,這個服務會依據 TCP/IP 的相關通訊協定啟動一個埠口在進行監聽, 那就是 TCP/UDP 封包的 port (埠口) 了。我們從第二章也知道網路連線是雙向的,伺服器端得要啟動一個監聽的埠口, 用戶端得要隨機啟動一個埠口來接收回應的資料才行。那麼伺服器端的服務是否需要啟動在固定的埠口? 用戶端的埠口是否又是固定的呢?我們將第二章中與 port 有關的資料給她彙整一下先:

  • 伺服器端啟動的監聽埠口所對應的服務是固定的
    例如 WWW 服務開啟在 port 80 ,FTP 服務開啟在 port 21,email 傳送開啟在 port 25 等等,都是通訊協定上面的規範!

  • 用戶端啟動程式時,隨機啟動一個大於 1024以上的埠口
    用戶端啟動的 port 是隨機產生的,主要是開啟在大於 1024 以上的埠口。這個 port 也是由某些軟體所產生的, 例如瀏覽器、Filezilla 這個 FTP 用戶端程式等等。

  • 一部伺服器可以同時提供多種服務
    所謂的『監聽』是某個服務程式會一直常駐在記憶體當中,所以該程式啟動的 port 就會一直存在。 只要伺服器軟體啟動的埠口不同,那就不會造成衝突。當用戶端連接到此伺服器時,透過不同的埠口,就可以取得不同的服務資料囉。 所以,一部主機上面當然可以同時啟動很多不同的服務啊!

  • 共 65536 個 port
    由第二章的 TCP/UDP 表頭資料中,就知道 port 佔用 16 個位元,因此一般主機會有 65536 個 port,而這些 port 又分成兩個部分,以 port 1024 作區隔:

    • 只有 root 才能啟動的保留的 port
      在小於 1024 的埠口,都是需要以 root 的身份才能啟動的,這些 port 主要是用於一些常見的通訊服務,在 Linux 系統下,常見的協定與 port 的對應是記錄在 /etc/services 裡面的。

    • 大於 1024 用於 client 端的 port
      在大於 1024 以上的 port 主要是作為 client 端的軟體啟動的 port 。

  • 是否需要三向交握
    建立可靠的連線服務需要使用到 TCP 協定,也就需要所謂的三向交握了,如果是非連線導向的服務,例如 DNS 與視訊系統, 那只要使用 UDP 協定即可。

  • 通訊協定可以啟用在非正規的 port
    我們知道瀏覽器預設會連接到 WWW 主機的 port 80,那麼你的 WWW 是否可以啟動在非 80 的其他埠口? 當然可以啊!你可以透過 WWW 軟體的設定功能將該軟體使用的 port 啟動在非正規的埠口, 只是如此一來,您的用戶端要連接到你的主機時,就得要在瀏覽器的地方額外指定你所啟用的非正規的埠口才行。 這個啟動在非正規的埠口功能,常常被用在一些所謂的地下網站啦!^_^。另外, 某些軟體預設就啟動在大於 1024 以上的埠口,如 MySQL 資料庫軟體就啟動在 3306。

  • 所謂的 port 的安全性
    事實上,沒有所謂的 port 的安全性!因為『Port 的啟用是由服務軟體所造成的』, 也就是說,真正影響網路安全的並不是 port ,而是啟動 port 的那個軟體 (程式)! 或許你偶而會聽到:『沒有修補過漏洞的 bind 8.x 版,很容易被黑客所入侵,請盡快升級到 bind 9.x 以後版本』,所以囉,對安全真正有危害的是『某些不安全的服務』 而不是『開了哪些 port 』才是!因此,沒有必要的服務就將他關閉吧! 尤其某些網路服務還會啟動一些 port 哩!另外,那些已啟動的軟體也需要持續的保持更新喔!

7.3.2 埠口的觀察: netstat, nmap

好了,我們現在知道這個 port 是什麼鬼東西了,再來就是要來瞭解一下,我們的主機到底是開了多少的 port 呢?由於 port 的啟動與服務有關,那麼『服務』跟『 port 』對應的檔案是哪一個?再提醒一次呦!是『 /etc/services 』啦!而常用來觀察 port 的則有底下兩個程式:

  • netstat:在本機上面以自己的程式監測自己的 port;
  • nmap:透過網路的偵測軟體輔助,可偵測非本機上的其他網路主機,但有違法之虞。

見他的大頭王!怎麼使用 nmap 會違法?由於 nmap 的功能太強大了,所以很多 cracker 會直接以他來偵測別人的主機,這個時候就可能造成違法啦!只要你使用 nmap 的時候不要去偵測別人的電腦主機,那麼就不會有問題啦!底下我們分別來說一說這兩個寶貝吧!



  • netstat

在做為伺服器的 Linux 系統中,開啟的網路服務越少越好! 因為較少的服務可以較容易除錯 (debug) 與瞭解安全漏洞,並可避免不必要的入侵管道! 所以,這個時候請瞭解一下您的系統當中有沒有哪些服務被開啟了呢? 要瞭解自己的系統當中的服務項目,最簡便的方法就是使用 netstat 了!這個東西不但簡單,而且功能也是很不錯的。 這個指令的使用方法在 第五章常用網路功能指令介紹當中提過了, 底下我們僅提供如何使用這個工具的方法囉!

  • 列出在監聽的網路服務:
    [root@www ~]# netstat -tunl
    ctive Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address    Foreign Address    State
    tcp        0      0 0.0.0.0:111      0.0.0.0:*          LISTEN
    tcp        0      0 0.0.0.0:22       0.0.0.0:*          LISTEN
    tcp        0      0 127.0.0.1:25     0.0.0.0:*          LISTEN
    ....(底下省略)....
    
    上面說明了我的主機至少有啟動 port 111, 22, 25 等,而且觀察各連線介面,可發現 25 為 TCP 埠口,但只針對 lo 內部迴圈測試網路提供服務,網際網路是連不到該埠口的。至於 port 22 則有提供網際網路的連線功能。

  • 列出已連線的網路連線狀態:
    [root@www ~]# netstat -tun
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address       Foreign Address     State
    tcp        0     52 192.168.1.100:22    192.168.1.101:2162  ESTABLISHED
    
    從上面的資料來看,我的本地端伺服器 (Local Address, 192.168.1.100) 目前僅有一條已建立的連線,那就是與 192.168.1.101 那部主機連接的連線,並且連線方線是由對方連接到我主機的 port 22 來取用我伺服器的服務吶!

  • 刪除已建立或在監聽當中的連線:

    如果想要將已經建立,或者是正在監聽當中的網路服務關閉的話,最簡單的方法當然就是找出該連線的 PID, 然後將他 kill 掉即可啊!例如下面的範例:
    [root@www ~]# netstat -tunp
    Active Internet connections (w/o servers)
    Proto Recv-Q Send-Q Local Address    Foreign Address     State       PID/P name
    tcp        0     52 192.168.1.100:22 192.168.1.101:2162  ESTABLISHED 1342/0
    
    如上面的範例,我們可以找出來該連線是由 sshd 這個程式來啟用的,並且他的 PID 是 1342, 希望你不要心急的用 killall 這個指令,否則容易刪錯人 (因為你的主機裡面可能會有多個 sshd 存在), 應該要使用 kill 這個指令才對喔!
    [root@www ~]# kill -9 1342
    

  • nmap

如果你要偵測的設備並沒有可讓你登入的作業系統時,那該怎麼辦?舉例來說,你想要瞭解一下公司的網路印表機是否有開放某些協定時, 那該如何處理啊?現在你知道 netstat 可以用來查閱本機上面的許多監聽中的通訊協定, 那例如網路印表機這樣的非本機的設備,要如何查詢啊?呵呵!用 nmap 就對了!

nmap (註1)的軟體說明之名稱為:『Network exploration tool and security / port scanner』,顧名思義, 這個東西是被系統管理員用來管理系統安全性查核的工具!他的具體描述當中也提到了, nmap 可以經由程式內部自行定義的幾個 port 對應的指紋資料,來查出該 port 的服務為何,所以我們也可以藉此瞭解我們主機的 port 到底是幹嘛用的!在 CentOS 裡頭是有提供 nmap 的, 如果你沒有安裝,那麼就使用 yum 去安裝他吧!

[root@www ~]# nmap [掃瞄類型] [掃瞄參數] [hosts 位址與範圍]
選項與參數:
[掃瞄類型]:主要的掃瞄類型有底下幾種:
    -sT:掃瞄 TCP 封包已建立的連線 connect() !
    -sS:掃瞄 TCP 封包帶有 SYN 標籤的資料
    -sP:以 ping 的方式進行掃瞄
    -sU:以 UDP 的封包格式進行掃瞄
    -sO:以 IP 的協定 (protocol) 進行主機的掃瞄
[掃瞄參數]:主要的掃瞄參數有幾種:
    -PT:使用 TCP 裡頭的 ping 的方式來進行掃瞄,可以獲知目前有幾部電腦存活(較常用)
    -PI:使用實際的 ping (帶有 ICMP 封包的) 來進行掃瞄
    -p :這個是 port range ,例如 1024-, 80-1023, 30000-60000 等等的使用方式
[Hosts 位址與範圍]:這個有趣多了,有幾種類似的類型
    192.168.1.100  :直接寫入 HOST IP 而已,僅檢查一部;
    192.168.1.0/24 :為 C Class 的型態,
    192.168.*.*  :嘿嘿!則變為 B Class 的型態了!掃瞄的範圍變廣了!
    192.168.1.0-50,60-100,103,200 :這種是變形的主機範圍啦!很好用吧!

# 範例一:使用預設參數掃瞄本機所啟用的 port (只會掃瞄 TCP)
[root@www ~]# yum install nmap
[root@www ~]# nmap localhost
PORT    STATE SERVICE
22/tcp  open  ssh
25/tcp  open  smtp
111/tcp open  rpcbind
# 在預設的情況下,nmap 僅會掃瞄 TCP 的協定喔!

nmap 的用法很簡單吶!就直接在指令後面接上 IP 或者是主機名稱即可。不過,在預設的情況下 nmap 僅會幫你分析 TCP 這個通訊協定而已,像上面這個例子的輸出結果。但優點是順道也將開啟該埠口的服務也列出來了, 真是好! ^_^!那如果想要同時分析 TCP/UDP 這兩個常見的通訊協定呢?可以這樣做:

# 範例二:同時掃瞄本機的 TCP/UDP 埠口
[root@www ~]# nmap -sTU localhost
PORT    STATE SERVICE
22/tcp  open  ssh
25/tcp  open  smtp
111/tcp open  rpcbind
111/udp open  rpcbind  <==會多出 UDP 的通訊協定埠口!

嘿嘿!與前面的範例比較一下,你會發現這次多了幾個 UDP 的埠口,這樣分析好多了!然後, 如果你想要瞭解一下到底有幾部主機活在你的網路當中時,則可以這樣做:

# 範例三:透過 ICMP 封包的檢測,分析區網內有幾部主機是啟動的
[root@www ~]# nmap -sP 192.168.1.0/24
Starting Nmap 5.21 ( http://nmap.org ) at 2011-07-20 17:05 CST
Nmap scan report for www.centos.vbird (192.168.1.100)
Host is up.
Nmap scan report for 192.168.1.101 <==這三行講的是 192.168.101 的範例!
Host is up (0.00024s latency).
MAC Address: 00:1B:FC:58:9A:BB (Asustek Computer) 
Nmap scan report for 192.168.1.254
Host is up (0.00026s latency).
MAC Address: 00:0C:6E:85:D5:69 (Asustek Computer)
Nmap done: 256 IP addresses (3 hosts up) scanned in 3.81 seconds

看到否?鳥哥的環境當中有三部主機活著吶 (Host is up)!並且該 IP 所對應的 MAC 也會被記錄下來, 很不錯吧!如果你還想要將各個主機的啟動的 port 作一番偵測的話,那就得要使用:

[root@www ~]# nmap 192.168.1.0/24

之後你就會看到一堆 port number 被輸出到螢幕上囉~如果想要隨時記錄整個網段的主機是否不小心開放了某些服務, 嘿嘿!利用 nmap 配合資料流重導向 (>, >> 等) 來輸出成為檔案, 那隨時可以掌握住您區域網路內每部主機的服務啟動狀況啊! ^_^

請特別留意,這個 nmap 的功能相當的強大,也是因為如此,所以很多剛在練習的黑客會使用這個軟體來偵測別人的電腦。 這個時候請您特別留意,目前很多的人已經都有『特別的方式』來進行登錄的工作!例如以 TCP_Wrappers (/etc/hosts.allow, /etc/hosts.deny) 的功能來記錄曾經偵測過該 port 的 IP! 這個軟體用來『偵測自己機器的安全性』是很不錯的一個工具,但是如果用來偵測別人的主機, 可是會『吃上官司』的!特別留意!!

7.3.3 埠口與服務的啟動/關閉及開機時狀態設定

從第二章的資料我們就知道,其實 port 是由執行某些軟體之後被軟體啟動的。所以要關閉某些 port 時,那就直接將某個程式給他關閉就是了!關閉的方法你當然可以使用 kill,不過這畢竟不是正統的解決之道,因為 kill 這個指令通常具有強制關閉某些程式的功能,但我們想要正常的關閉該程式啊! 所以,就利用系統給我們的 script 來關閉就好了啊。 在此同時,我們就得再來稍微複習一下,一般傳統的服務有哪幾種類型?


  • stand alone 與 super daemon

我們在基礎學習篇內談到,在一般正常的 Linux 系統環境下,服務的啟動與管理主要有兩種方式:

  • Stand alone
    顧名思義,stand alone 就是直接執行該服務的執行檔,讓該執行檔直接載入到記憶體當中運作, 用這種方式來啟動可以讓該服務具有較快速回應的優點。一般來說,這種服務的啟動 script 都會放置到 /etc/init.d/ 這個目錄底下,所以你通常可以使用:『 /etc/init.d/sshd restart 』之類的方式來重新啟動這種服務;

  • Super daemon
    用一個超級服務作為總管,來統一管理某些特殊的服務。在 CentOS 6.x 裡面使用的則是 xinetd 這個 super daemon 啊!這種方式啟動的網路服務雖然在回應上速度會比較慢, 不過,可以透過 super daemon 額外提供一些控管,例如控制何時啟動、何時可以進行連線、 那個 IP 可以連進來、是否允許同時連線等等。通常個別服務的設定檔放置在 /etc/xinetd.d/ 當中,但設定完畢後需要重新以『 /etc/init.d/xinetd restart 』重新來啟動才行!

關於更詳細的服務說明,請參考基礎篇的認識服務一文, 鳥哥在這裡不再贅述。好,那麼如果我想要將我系統上面的 port 111 關掉的話, 那應該如何關閉呢?最簡單的作法就是先找出那個 port 111 的啟動程式喔!

[root@www ~]# netstat -tnlp | grep 111
tcp        0      0 0.0.0.0:111    0.0.0.0:*       LISTEN  990/rpcbind
tcp        0      0 :::111         :::*            LISTEN  990/rpcbind
# 原來用的是 rpcbind 這個服務程式!

[root@www ~]# which rpcbind
/sbin/rpcbind
# 找到檔案後,再以 rpm 處理處理

[root@www ~]# rpm -qf /sbin/rpcbind
rpcbind-0.2.0-8.el6.x86_64
# 找到了!就是這個軟體!所以將他關閉的方法可能就是:

[root@www ~]# rpm -qc rpcbind | grep init
/etc/rc.d/init.d/rpcbind
[root@www ~]# /etc/init.d/rpcbind stop

透過上面的這個分析的流程,你可以利用系統提供的很多方便的工具來達成某個服務的關閉! 為啥這麼麻煩?不是利用 kill -9 990 就可以刪掉該服務了嗎? 是沒錯啦!不過,你知道該服務是做啥用的嗎?你知道將他關閉之後,你的系統會出什麼問題嗎? 如果不知道的話,那麼利用上面的流程不就可以找出該服務軟體,再利用 rpm 查詢功能, 不就能夠知道該服務的作用了?所以說,這個方式還是對您會有幫助的啦! 底下請您試著將您 CentOS 或者是其他版本的 Linux 的 Telnet 打開試看看。

例題:
我們知道系統的 Telnet 服務通常是以 super daemon 來控管的,請您啟動您系統的 telnet 試看看。
答:
  1. 要啟動 telnet 首先必須要已經安裝了 telnet 的伺服器才行,所以請先以 rpm 查詢看看是否有安裝 telnet-server 呢? 『rpm -qa | grep telnet-server』如果沒有安裝的話,請利用原版光碟來安裝,或者使用『yum install telnet-server』 安裝一下先;
  2. 由於是 super daemon 控管,所以請編輯 /etc/xinetd.d/telnet 這個檔案,將其中的『disable = yes』改成 『disable = no』之後以『/etc/init.d/xinetd restart』重新啟動 super daemon 吧!
  3. 利用 netstat -tnlp 察看是否有啟動 port 23 呢?


  • 預設啟動的服務

剛剛上頭的作法僅是『立即將該服務啟動或關閉』喔!並不會影響到下次開機時,這個服務是否預設啟動的情況。 如果你想要在開機的時候就啟動或不啟動某項服務時,那就得要瞭解一下基礎學習篇裡面談到的開機流程管理的內容啦!在 Unix like 的系統當中我們都是透過 run level 來設定某些執行等級需要啟動的服務,以 Red Hat 系統來說,這些 run level 啟動的資料都是放置在 /etc/rc.d/rc[0-6].d/ 裡面的,那如何管理該目錄下的 script 呢?手動處理嗎?會瘋掉的吶!所以你必須要熟悉 chkconfigRed Hat 系統的 ntsysv 這幾個指令才行!

Tips 鳥哥 這幾個指令不熟嗎?這個時候鳥哥不得不說了:『有 man 堪用直需用,莫待無 man 空自猜』趕緊給他 man 下去啦!
例題:
(1)如何查閱 rpcbind 這個程式一開機就執行? (2)如果開機就執行,如何將他改為開機時不要啟動? (3)如何立即關閉這個 rpcbind 服務?
答:
  1. 可以透過『 chkconfig --list | grep rpcbind 』與『 runlevel 』確認一下你的環境與 rpcbind 是否啟動?
  2. 如果有啟動,可透過『 chkconfig --level 35 rpcbind off 』來設定開機時不要啟動;
  3. 可以透過『 /etc/init.d/rpcbind stop 』來立即關閉他!

聰明的你一定會問說:『鳥哥,你的意思是只要將系統所有的服務都關閉,那系統就會安全囉?』 當然....不是!因為『很多的系統服務是必須要存在的,否則系統將會出問題』 舉例來說,那個保持系統可以具有工作排程的 crond 服務就一定要存在,而那個記錄系統狀況的 rsyslogd 也當然要存在~否則怎知道系統出了啥問題?所以囉,除非你知道每個服務的目的是啥,否則不要隨便關閉該服務。 底下鳥哥列出幾個常見的必須要存在的系統服務給大家參考參考先!這些服務請不要關閉啊!

服務名稱服務內容
acpid新版的電源管理模組,通常建議開啟,不過,某些筆記型電腦可能不支援此項服務,那就得關閉
atd在管理單一預約命令執行的服務,應該要啟動的
crond在管理工作排程的重要服務,請務必要啟動啊!
haldaemon作系統硬體變更偵測的服務,與 USB 設備關係很大
iptablesLinux 內建的防火牆軟體,這個也可以啟動啦!
network這個重要了吧?要網路就要有他啊!
postfix系統內部郵件傳遞服務,不要隨便關閉他!
rsyslog系統的登錄檔記錄,很重要的,務必啟動啊!
sshd這是系統預設會啟動的,可以讓你在遠端以文字型態的終端機登入喔!
xinetd就是那個 super daemon 嘛!所以也要啟動啦!

上面列出的是主機需要的重點服務,請您不要關閉他!除非你知道作了之後會有什麼後果。舉例來說,你如果不需要管理電源, 那麼將 acpid 關閉也沒有關係啊!如果你不需要提供遠端連線功能,那麼 sshd 也可以關閉啊!那其他你不知道的服務怎辦? 沒關係,只要不是網路服務,你都可以保留他!如果是網路服務呢?那...鳥哥建議你不知道的服務就先關閉他! 以後我們談到每個相關的服務時,再一個一個打開即可。底下我們就來做作看關閉網路服務這個部分!

7.3.4 安全性考量-關閉網路服務埠口

我們的 Linux distribution 很好心的幫使用者想到很多了,所以在一安裝完畢之後, 系統會開啟一堆有的沒有的網路服務,例如那個 rpcbind 之類的咚咚,這些東西你或許知道或許不知道,不過他就是有開啟~ 但我們的主機明明就是用來做為伺服器的,所以這些本來預計要給 client 使用的服務其實有點『多此一舉』的感覺~ 所以啦,請你將他關閉吧!底下我們舉個簡單的例子來處理,將你的網路服務關閉就好,其他在系統內部的服務,就暫時保留吧!

例題:
找出目前系統上面正在運作中的服務,並且找到相對應的啟動腳本 (在 /etc/init.d 內的檔名之意)。
答:
要找出服務,就利用 netstat -tunlp 即可找到!以鳥哥從第一章安裝的示範機為例,鳥哥目前啟動的網路服務有底下這些:
[root@www ~]# netstat -tlunp
Active Internet connections (only servers)
Proto  Local Address        State       PID/Program name
tcp    0.0.0.0:22           LISTEN      1176/sshd
tcp    127.0.0.1:25         LISTEN      1252/master
tcp    0.0.0.0:37753        LISTEN      1008/rpc.statd
tcp    :::22                LISTEN      1176/sshd
tcp    :::23                LISTEN      1851/xinetd
tcp    ::1:25               LISTEN      1252/master
tcp    :::38149             LISTEN      1008/rpc.statd
tcp    0.0.0.0:111          LISTEN      1873/rpcbind
tcp  0 :::111               LISTEN      1873/rpcbind
udp  0 0.0.0.0:111                      1873/rpcbind
udp  0 0.0.0.0:776                      1873/rpcbind
udp  0 :::111                           1873/rpcbind
udp  0 :::776                           1873/rpcbind
udp    0.0.0.0:760                      1008/rpc.statd
udp    0.0.0.0:52525                    1008/rpc.statd
udp    :::52343                         1008/rpc.statd
# 上述的輸出鳥哥有稍微簡化一些喔,所以有些欄位不見了。
# 這個重點只是要展現出最後一個欄位而已啦!
看起來總共有 sshd, master, rpc.statd, xinetd, rpcbind 等這幾個服務,對照前一小節的資料內容來看, master (port 25), sshd 不能關掉,那麼其他的就予以關閉啊!透過前兩個小節的介紹,使用 which 與 rpm 搜尋吧!舉例來說, rpc.statd 的啟動腳本在:『rpm -qc $(rpm -qf $(which rpc.statd) ) | grep init』這樣找,結果是在『/etc/rc.d/init.d/nfslock』這裡! 因此最終的結果如下:
rpc.statd /etc/rc.d/init.d/nfs
          /etc/rc.d/init.d/nfslock
          /etc/rc.d/init.d/rpcgssd
          /etc/rc.d/init.d/rpcidmapd
          /etc/rc.d/init.d/rpcsvcgssd
xinetd    /etc/rc.d/init.d/xinetd
rpcbind   /etc/rc.d/init.d/rpcbind
接下來就是將該服務關閉,並且設定為開機不啟動吧!
[root@www ~]# vim bin/closedaemon.sh
for daemon in nfs nfslock rpcgssd rpcidmapd rpcsvcgssd xinetd rpcbind
do
	chkconfig $daemon off
	/etc/init.d/$daemon stop
done
[root@www ~]# sh bin/closedaemon.sh

做完上面的例子之後,你再次下達 netstat -tlunp 之後,會得到僅剩 port 25, 22 而已! 如此一來,絕大部分伺服器用不到的服務就被你關閉,而且即使重新開機也不會被啟動的啦! ^_^

7.4 SELinux 管理原則

SELinux 使用所謂的委任式存取控制 (Mandatory Access Control, MAC) ,他可以針對特定的程序與特定的檔案資源來進行權限的控管! 也就是說,即使你是 root ,那麼在使用不同的程序時,你所能取得的權限並不一定是 root ,而得要看當時該程序的設定而定。 如此一來,我們針對控制的『主體』變成了『程序』而不是『使用者』喔!因此,這個權限的管理模式就特別適合網路服務的『程序』了! 因為,即使你的程序使用 root 的身份去啟動,如果這個程序被攻擊而被取得操作權,那該程序能作的事情還是有限的, 因為被 SELinux 限制住了能進行的工作了嘛!

舉例來說, WWW 伺服器軟體的達成程序為 httpd 這支程式, 而預設情況下, httpd 僅能在 /var/www/ 這個目錄底下存取檔案,如果 httpd 這個程序想要到其他目錄去存取資料時,除了規則設定要開放外,目標目錄也得要設定成 httpd 可讀取的模式 (type) 才行喔!限制非常多! 所以,即使不小心 httpd 被 cracker 取得了控制權,他也無權瀏覽 /etc/shadow 等重要的設定檔喔!

7.4.1 SELinux 的運作模式

再次的重複說明一下,SELinux 是透過 MAC 的方式來控管程序,他控制的主體是程序, 而目標則是該程序能否讀取的『檔案資源』!所以先來說明一下這些咚咚的相關性啦!

  • 主體 (Subject):
    SELinux 主要想要管理的就是程序,因此你可以將『主體』跟本章談到的 process 劃上等號;

  • 目標 (Object):
    主體程序能否存取的『目標資源』一般就是檔案系統。因此這個目標項目可以等檔案系統劃上等號;

  • 政策 (Policy):
    由於程序與檔案數量龐大,因此 SELinux 會依據某些服務來制訂基本的存取安全性政策。這些政策內還會有詳細的規則 (rule) 來指定不同的服務開放某些資源的存取與否。在目前的 CentOS 6.x 裡面僅有提供兩個主要的政策如下,一般來說,使用預設的 target 政策即可。

    • targeted:針對網路服務限制較多,針對本機限制較少,是預設的政策;
    • mls:完整的 SELinux 限制,限制方面較為嚴格。

  • 安全性本文 (security context):
    我們剛剛談到了主體、目標與政策面,但是主體能不能存取目標除了要符合政策指定之外,主體與目標的安全性本文必須一致才能夠順利存取。 這個安全性本文 (security context) 有點類似檔案系統的 rwx 啦!安全性本文的內容與設定是非常重要的! 如果設定錯誤,你的某些服務(主體程序)就無法存取檔案系統(目標資源),當然就會一直出現『權限不符』的錯誤訊息了!
SELinux 運作的各元件之相關性
圖 7.4-1、SELinux 運作的各元件之相關性(本圖參考小州老師的上課講義)

上圖的重點在『主體』如何取得『目標』的資源存取權限! 由上圖我們可以發現,(1)主體程序必須要通過 SELinux 政策內的規則放行後,就可以與目標資源進行安全性本文的比對, (2)若比對失敗則無法存取目標,若比對成功則可以開始存取目標。問題是,最終能否存取目標還是與檔案系統的 rwx 權限設定有關喔!如此一來,加入了 SELinux 之後,出現權限不符的情況時,你就得要一步一步的分析可能的問題了!


  • 安全性本文 (Security Context)

CentOS 6.x 的 target 政策已經幫我們制訂好非常多的規則了,因此你只要知道如何開啟/關閉某項規則的放行與否即可。 那個安全性本文比較麻煩!因為你可能需要自行設定檔案的安全性本文呢!為何需要自行設定啊? 舉例來說,你不也常常進行檔案的 rwx 的重新設定嗎?這個安全性本文你就將他想成 SELinux 內必備的 rwx 就是了!這樣比較好理解啦。

安全性本文存在於主體程序中與目標檔案資源中。程序在記憶體內,所以安全性本文可以存入是沒問題。 那檔案的安全性本文是記錄在哪裡呢?事實上,安全性本文是放置到檔案的 inode 內的,因此主體程序想要讀取目標檔案資源時,同樣需要讀取 inode , 這 inode 內就可以比對安全性本文以及 rwx 等權限值是否正確,而給予適當的讀取權限依據。

那麼安全性本文到底是什麼樣的存在呢?我們先來看看 /root 底下的檔案的安全性本文好了。 觀察安全性本文可使用『 ls -Z 』去觀察如下:(注意:你必須已經啟動了 SELinux 才行!若尚未啟動,這部份請稍微看過一遍即可。底下會介紹如何啟動 SELinux 喔!)

[root@www ~]# ls -Z
-rw-------. root  root  system_u:object_r:admin_home_t:s0     anaconda-ks.cfg
drwxr-xr-x. root  root  unconfined_u:object_r:admin_home_t:s0 bin
-rw-r--r--. root  root  system_u:object_r:admin_home_t:s0     install.log
-rw-r--r--. root  root  system_u:object_r:admin_home_t:s0     install.log.syslog
# 上述特殊字體的部分,就是安全性本文的內容!

如上所示,安全性本文主要用冒號分為三個欄位 (最後一個欄位先略過不看),這三個欄位的意義為:

Identify:role:type
身份識別:角色:類型
  • 身份識別 (Identify): 相當於帳號方面的身份識別!主要的身份識別則有底下三種常見的類型:

    • root:表示 root 的帳號身份,如同上面的表格顯示的是 root 家目錄下的資料啊!
    • system_u:表示系統程序方面的識別,通常就是程序囉;
    • user_u:代表的是一般使用者帳號相關的身份。

  • 角色 (Role): 透過角色欄位,我們可以知道這個資料是屬於程序、檔案資源還是代表使用者。一般的角色有:

    • object_r:代表的是檔案或目錄等檔案資源,這應該是最常見的囉;
    • system_r:代表的就是程序啦!不過,一般使用者也會被指定成為 system_r 喔!

  • 類型 (Type): 在預設的 targeted 政策中, Identify 與 Role 欄位基本上是不重要的!重要的在於這個類型 (type) 欄位! 基本上,一個主體程序能不能讀取到這個檔案資源,與類型欄位有關!而類型欄位在檔案與程序的定義不太相同,分別是:

    • type:在檔案資源 (Object) 上面稱為類型 (Type);
    • domain:在主體程序 (Subject) 則稱為領域 (domain) 了!

    domain 需要與 type 搭配,則該程序才能夠順利的讀取檔案資源啦!


  • 程序與檔案 SELinux type 欄位的相關性

那麼這三個欄位如何利用呢?首先我們來瞧瞧主體程序在這三個欄位的意義為何!透過身份識別與角色欄位的定義, 我們可以約略知道某個程序所代表的意義喔!基本上,這些對應資料在 targeted 政策下的對應如下:

身份識別角色該對應在 targeted 的意義
rootsystem_r代表供 root 帳號登入時所取得的權限
system_usystem_r由於為系統帳號,因此是非交談式的系統運作程序
user_usystem_r一般可登入使用者的程序囉!

但就如上所述,其實最重要的欄位是類型欄位,主體與目標之間是否具有可以讀寫的權限,與程序的 domain 及檔案的 type 有關!這兩者的關係我們可以使用達成 WWW 伺服器功能的 httpd 這支程式與 /var/www/html 這個網頁放置的目錄來說明。 首先,看看這兩個咚咚的安全性本文內容先:

[root@www ~]# yum install httpd
[root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html
-rwxr-xr-x. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
# 兩者的角色欄位都是 object_r ,代表都是檔案!而 httpd 屬於 httpd_exec_t 類型,
# /var/www/html 則屬於 httpd_sys_content_t 這個類型!

httpd 屬於 httpd_exec_t 這個可以執行的類型,而 /var/www/html 則屬於 httpd_sys_content_t 這個可以讓 httpd 領域 (domain) 讀取的類型。文字看起來不太容易瞭解吧!我們使用圖示來說明這兩者的關係!

主體程序取得的 domain 與目標檔案資源的 type 相互關係
圖 7.4-2、主體程序取得的 domain 與目標檔案資源的 type 相互關係

上圖的意義我們可以這樣看的:

  1. 首先,我們觸發一個可執行的目標檔案,那就是具有 httpd_exec_t 這個類型的 /usr/sbin/httpd
  2. 該檔案的類型會讓這個檔案所造成的主體程序 (Subject) 具有 httpd 這個領域 (domain), 我們的政策針對這個領域已經制定了許多規則,其中包括這個領域可以讀取的目標資源類型;
  3. 由於 httpd domain 被設定為可以讀取 httpd_sys_content_t 這個類型的目標檔案 (Object), 因此你的網頁放置到 /var/www/html/ 目錄下,就能夠被 httpd 那支程序所讀取了;
  4. 但最終能不能讀到正確的資料,還得要看 rwx 是否符合 Linux 權限的規範!

上述的流程告訴我們幾個重點,第一個是政策內需要制訂詳細的 domain/type 相關性;第二個是若檔案的 type 設定錯誤, 那麼即使權限設定為 rwx 全開的 777 ,該主體程序也無法讀取目標檔案資源的啦!不過如此一來, 也就可以避免使用者將他的家目錄設定為 777 時所造成的權限困擾。

7.4.2 SELinux 的啟動、關閉與觀察

並非所有的 Linux distributions 都支援 SELinux 的,所以你必須要先觀察一下你的系統版本為何! 鳥哥這裡介紹的 CentOS 6.x 本身就有支援 SELinux 啦!所以你不需要自行編譯 SELinux 到你的 Linux 核心中! 目前 SELinux 支援三種模式,分別如下:

  • enforcing:強制模式,代表 SELinux 運作中,且已經正確的開始限制 domain/type 了;
  • permissive:寬容模式:代表 SELinux 運作中,不過僅會有警告訊息並不會實際限制 domain/type 的存取。這種模式可以運來作為 SELinux 的 debug 之用;
  • disabled:關閉,SELinux 並沒有實際運作。

那你怎麼知道目前的 SELinux 模式呢?就透過 getenforce 吧!

[root@www ~]# getenforce
Enforcing  <==諾!就顯示出目前的模式為 Enforcing 囉!

另外,我們又如何知道 SELinux 的政策 (Policy) 為何呢?這時可以來觀察設定檔啦:

[root@www ~]# vim /etc/selinux/config
SELINUX=enforcing     <==調整 enforcing|disabled|permissive
SELINUXTYPE=targeted  <==目前僅有 targeted 與 mls


  • SELinux 的啟動與關閉

上面是預設的政策與啟動的模式!你要注意的是,如果改變了政策則需要重新開機;如果由 enforcing 或 permissive 改成 disabled ,或由 disabled 改成其他兩個,那也必須要重新開機。這是因為 SELinux 是整合到核心裡面去的, 你只可以在 SELinux 運作下切換成為強制 (enforcing) 或寬容 (permissive) 模式,不能夠直接關閉 SELinux 的! 如果剛剛你發現 getenforce 出現 disabled 時,請到上述檔案修改成為 enforcing 然後重新開機吧!

不過你要注意的是,如果從 disable 轉到啟動 SELinux 的模式時, 由於系統必須要針對檔案寫入安全性本文的資訊,因此開機過程會花費不少時間在等待重新寫入 SELinux 安全性本文 (有時也稱為 SELinux Label) ,而且在寫完之後還得要再次的重新開機一次喔!你必須要等待粉長一段時間! 等到下次開機成功後,再使用 getenforce 來觀察看看有否成功的啟動到 Enforcing 的模式囉!

如果你已經在 Enforcing 的模式,但是可能由於一些設定的問題導致 SELinux 讓某些服務無法正常的運作, 此時你可以將 Enforcing 的模式改為寬容 (permissive) 的模式,讓 SELinux 只會警告無法順利連線的訊息, 而不是直接抵擋主體程序的讀取權限。讓 SELinux 模式在 enforcing 與 permissive 之間切換的方法為:

[root@www ~]# setenforce [0|1]
選項與參數:
0 :轉成 permissive 寬容模式;
1 :轉成 Enforcing 強制模式

# 範例一:將 SELinux 在 Enforcing 與 permissive 之間切換與觀察
[root@www ~]# setenforce 0
[root@www ~]# getenforce
Permissive
[root@www ~]# setenforce 1
[root@www ~]# getenforce
Enforcing

不過請注意, setenforce 無法在 Disabled 的模式底下進行模式的切換喔!

Tips 鳥哥 在某些特殊的情況底下,你從 Disabled 切換成 Enforcing 之後,竟然有一堆服務無法順利啟動,都會跟你說在 /lib/xxx 裡面的資料沒有權限讀取,所以啟動失敗。這大多是由於在重新寫入 SELinux type (Relable) 出錯之故,使用 Permissive 就沒有這個錯誤。那如何處理呢?最簡單的方法就是在 Permissive 的狀態下,使用『 restorecon -Rv / 』重新還原所有 SELinux 的類型,就能夠處理這個錯誤!

7.4.3 SELinux type 的修改

既然 SELinux 的類型欄位 (type) 這麼重要,那如何修改與變更這個欄位,當然就是最重要的一件事囉。 首先,我們來看看如果複製一個檔案到不同的目錄去,會發生什麼狀況吧!

# 範例:將 /etc/hosts 複製到 root 家目錄,並觀察相關的 SELinux 類型變化
[root@www ~]# cp /etc/hosts /root
[root@www ~]# ls -dZ /etc/hosts /root/hosts /root
-rw-r--r--. root root system_u:object_r:net_conf_t:s0  /etc/hosts
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/hosts

# 範例:將 /root/hosts 移動到 /tmp 下,並觀察相關的 SELinux 類型變化
[root@www ~]# mv /root/hosts /tmp
[root@www ~]# ls -dZ /tmp /tmp/hosts
drwxrwxrwt. root root system_u:object_r:tmp_t:s0       /tmp
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /tmp/hosts

看到沒有?當你單純的複製時,SELinux 的 type 欄位是會繼承目標目錄的,所以 /root/hosts 的類型就會變成 admin_home_t 這個類型了。但是如果是移動呢?那麼連同 SELinux 的類型也會被移動過去,因此 /tmp/hosts 會依舊保持 admin_home_t 而不會變成 /tmp 的 tmp_t 這個類型呦!要注意!要注意!那麼,如何將 /tmp/hosts 變更成為最原始的 net_conf_t 這個類型呢?那就得要使用 chcon 囉!


  • chcon
[root@www ~]# chcon [-R] [-t type] [-u user] [-r role] 檔案
[root@www ~]# chcon [-R] --reference=範例檔 檔案
選項與參數:
-R  :連同該目錄下的次目錄也同時修改;
-t  :後面接安全性本文的類型欄位!例如 httpd_sys_content_t ;
-u  :後面接身份識別,例如 system_u;
-r  :後面街角色,例如 system_r;
--reference=範例檔:拿某個檔案當範例來修改後續接的檔案的類型!

# 範例:將剛剛的 /tmp/hosts 類型改為 etc_t 的類型
[root@www ~]# chcon -t net_conf_t /tmp/hosts
[root@www ~]# ll -Z /tmp/hosts
-rw-r--r--. root root unconfined_u:object_r:net_conf_t:s0 /tmp/hosts

# 範例:以 /var/spool/mail/ 為依據,將 /tmp/hosts 修改成該類型
[root@www ~]# ll -dZ /var/spool/mail
drwxrwxr-x. root mail system_u:object_r:mail_spool_t:s0 /var/spool/mail
[root@www ~]# chcon --reference=/var/spool/mail /tmp/hosts
[root@www ~]# ll -Z /tmp/hosts
-rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /tmp/hosts

chcon 的修改方式中,我們必須要知道最終我們的 SELinux type 是啥類型後,才能夠變更成功。 如果你想要作的是『復原成原有的 SELinux type』呢?那可以參考底下的指令來進行呦!


  • restorecon
[root@www ~]# restorecon [-Rv] 檔案或目錄
選項與參數:
-R  :連同次目錄一起修改;
-v  :將過程顯示到螢幕上

# 範例:將剛剛 /tmp/hosts 移動至 /root 並以預設的安全性本文改正過來
[root@www ~]# mv /tmp/hosts /root
[root@www ~]# ll -Z /root/hosts
-rw-r--r--. root root system_u:object_r:mail_spool_t:s0 /root/hosts
[root@www ~]# restorecon -Rv /root
restorecon reset /root/hosts context system_u:object_r:mail_spool_t:s0->
system_u:object_r:admin_home_t:s0
# 上面這兩行其實是同一行喔!表示將 hosts 由 mail_spool_t 改為 admin_home_t


  • 預設目錄的安全性本文查詢與修改

透過上面這幾個練習,你就會知道啦,SELinux type 恐怕會在檔案的複製/移動時產生一些變化,因此需要善用 chcon, restorecon 等指令來進行修訂。那你應該還是會想到一件事,那就是, restorecon 怎麼會知道每個目錄記載的預設 SELinux type 類型呢?這是因為系統有記錄嘛!記錄在 /etc/selinux/targeted/contexts,但是該目錄內有很多不同的資料, 要使用文字編輯器去查閱很麻煩,此時,我們可以透過 semanage 這個指令的功能來查詢與修改喔!

[root@www ~]# semanage {login|user|port|interface|fcontext|translation} -l
[root@www ~]# semanage fcontext -{a|d|m} [-frst] file_spec
選項與參數:
fcontext :主要用在安全性本文方面的用途, -l 為查詢的意思;
-a :增加的意思,你可以增加一些目錄的預設安全性本文類型設定;
-m :修改的意思;
-d :刪除的意思。

# 範例:查詢一下 /var/www/ 的預設安全性本文設定為何!
[root@www ~]# yum install policycoreutils-python
[root@www ~]# semanage fcontext -l | grep '/var/www'
SELinux fcontext           類型            Context
/var/www(/.*)?             all files     system_u:object_r:httpd_sys_content_t:s0
/var/www(/.*)?/logs(/.*)?  all files     system_u:object_r:httpd_log_t:s0
....(後面省略)....

從上面的說明,我們知道其實 semanage 可以處理非常多的任務,不過,在這個小節我們主要想瞭解的是每個目錄的預設安全性本文。 如上面範例所示,我們可以查詢的到每個目錄的安全性本文啦!而目錄的設定可以使用正規表示法去指定一個範圍。那麼如果我們想要增加某些自訂的目錄的安全性本文呢? 舉例來說,我想要制訂 /srv/vbird 成為 public_content_t 的類型時,應該如何指定呢?

# 範例:利用 semanage 設定 /srv/vbird 目錄的預設安全性本文為 public_content_t
[root@www ~]# mkdir /srv/vbird
[root@www ~]# ll -Zd /srv/vbird
drwxr-xr-x. root root unconfined_u:object_r:var_t:s0   /srv/vbird
# 如上所示,預設的情況應該是 var_t 這個咚咚的!

[root@www ~]# semanage fcontext -l | grep '/srv'
/srv                  directory    system_u:object_r:var_t:s0 <==看這裡
/srv/.*               all files    system_u:object_r:var_t:s0
....(底下省略)....
# 上面則是預設的 /srv 底下的安全性本文資料,不過,並沒有指定到 /srv/vbird 啦

[root@www ~]# semanage fcontext -a -t public_content_t "/srv/vbird(/.*)?"
[root@www ~]# semanage fcontext -l | grep '/srv/vbird'
/srv/vbird(/.*)?          all files  system_u:object_r:public_content_t:s0

[root@www ~]# cat /etc/selinux/targeted/contexts/files/file_contexts.local
# This file is auto-generated by libsemanage
# Please use the semanage command to make changes
/srv/vbird(/.*)?    system_u:object_r:public_content_t:s0
# 其實就是寫入這個檔案的囉! ^_^

[root@www ~]# restorecon -Rv /srv/vbird* <==嘗試恢復預設值
[root@www ~]# ll -Zd /srv/vbird
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /srv/vbird
# 有預設值,以後用 restorecon 來修改比較簡單!

semanage 的功能很多,不過鳥哥主要用到的僅有 fcontext 這個項目的動作而已。如上所示, 你可以使用 semanage 來查詢所有的目錄預設值,也能夠使用他來增加預設值的設定!如果您學會這些基礎的工具, 那麼 SELinux 對你來說,也不是什麼太難的咚咚囉!

7.4.4 SELinux 政策內的規則布林值修訂

前面講到,要通過 SELinux 的驗證之後才能開始檔案權限 rwx 的判斷,而 SELinux 的判斷主要是 (1)政策內的規則比對與 (2)程序與檔案的 SELinux type 要符合才能夠放行。前一個小節談的是 SELinux 的 type ,這個小節就是要談一下政策內的規則囉, 包括如何查詢與修改相關的規則放行與否囉。


  • 政策查閱

CentOS 6.x 預設使使用 targeted 政策,那麼這個政策提供多少相關的規則呢?此時可以透過 seinfo 來查詢喔!

[root@www ~]# yum install setools-console
[root@www ~]# seinfo [-Atrub]
選項與參數:
-A  :列出 SELinux 的狀態、規則布林值、身份識別、角色、類別等所有資訊
-t  :列出 SELinux 的所有類別 (type) 種類
-r  :列出 SELinux 的所有角色 (role) 種類
-u  :列出 SELinux 的所有身份識別 (user) 種類
-b  :列出所有規則的種類 (布林值)

# 範例一:列出 SELinux 在此政策下的統計狀態
[root@www ~]# seinfo
tatistics for policy file: /etc/selinux/targeted/policy/policy.24
Policy Version & Type: v.24 (binary, mls)  <==列出政策所在檔與版本

   Classes:            77    Permissions:       229
   Sensitivities:       1    Categories:       1024
   Types:            3076    Attributes:        251
   Users:               9    Roles:              13
   Booleans:          173    Cond. Expr.:       208
   Allow:          271307    Neverallow:          0
   Auditallow:         44    Dontaudit:      163738
   Type_trans:      10941    Type_change:        38
   Type_member:        44    Role allow:         20
   Role_trans:        241    Range_trans:      2590
....(底下省略)....
# 從上面我們可以看到這個政策是 targeted ,此政策的 SELinux type 有 3076 個;
# 而針對網路服務的規則 (Booleans) 共制訂了 173 條規則!

# 範例二:列出與 httpd 有關的規則 (booleans) 有哪些?
[root@www ~]# seinfo -b | grep httpd
Conditional Booleans: 173
   allow_httpd_mod_auth_pam
   httpd_setrlimit
   httpd_enable_ftp_server
....(底下省略)....
# 你可以看到,有非常多的與 httpd 有關的規則訂定呢!

從上面我們可以看到與 httpd 有關的布林值,同樣的,如果你想要找到有 httpd 字樣的安全性本文類別時, 就可以使用『 seinfo -t | grep httpd 』來查詢了!如果查詢到相關的類別或者是布林值後,想要知道詳細的規則時, 就得要使用 sesearch 這個指令了!

[root@www ~]# sesearch [--all] [-s 主體類別] [-t 目標類別] [-b 布林值]
選項與參數:
--all  :列出該類別或布林值的所有相關資訊
-t  :後面還要接類別,例如 -t httpd_t
-b  :後面還要接布林值的規則,例如 -b httpd_enable_ftp_server

# 範例一:找出目標檔案資源類別為 httpd_sys_content_t 的有關資訊
[root@www ~]# sesearch --all -t httpd_sys_content_t
Found 683 semantic av rules:
   allow avahi_t file_type : filesystem getattr ;
   allow corosync_t file_type : filesystem getattr ;
   allow munin_system_plugin_t file_type : filesystem getattr ;
....(底下省略)....
# 『 allow  主體程序安全性本文類別  目標檔案安全性本文類別 』
# 如上,說明這個類別可以被那個主題程序的類別所讀取,以及目標檔案資源的格式。

你可以很輕易的查詢到某個主體程序 (subject) 可以讀取的目標檔案資源 (Object)。 那如果是布林值呢?裡面又規範了什麼?讓我們來看看先:

# 範例三:我知道有個布林值為 httpd_enable_homedirs ,請問該布林值規範多少規則?
[root@www ~]# sesearch -b httpd_enable_homedirs --all
Found 43 semantic av rules:
   allow httpd_user_script_t user_home_dir_t : dir { getattr search open } ;
   allow httpd_sys_script_t user_home_dir_t : dir { ioctl read getattr  } ;
....(後面省略)....

從這個布林值的設定我們可以看到裡面規範了非常多的主體程序與目標檔案資源的放行與否! 所以你知道了,實際規範這些規則的,就是布林值的項目啦!那也就是我們之前所說的一堆規則是也! 你的主體程序能否對某些目標檔案進行存取,與這個布林值非常有關係喔!因為布林值可以將規則設定為啟動 (1) 或者是關閉 (0) 啦!


  • 布林值的查詢與修改

上面我們透過 sesearch 知道了,其實 Subject 與 Object 能否有存取的權限,是與布林值有關的, 那麼系統有多少布林值可以透過 seinfo -b 來查詢,但,每個布林值是啟動的還是關閉的呢?這就來查詢看看吧:

[root@www ~]# getsebool [-a] [布林值條款]
選項與參數:
-a  :列出目前系統上面的所有布林值條款設定為開啟或關閉值

# 範例一:查詢本系統內所有的布林值設定狀況
[root@www ~]# getsebool -a
abrt_anon_write --> off
allow_console_login --> on
allow_cvs_read_shadow --> off
....(底下省略)....
# 您瞧!這就告訴你目前的布林值狀態囉!

那麼如果查詢到某個布林值,並且以 sesearch 知道該布林值的用途後,想要關閉或啟動他,又該如何處置?

[root@www ~]# setsebool [-P] 布林值=[0|1]
選項與參數:
-P  :直接將設定值寫入設定檔,該設定資料未來會生效的!

# 範例一:查詢 httpd_enable_homedirs 是否為 on,若不為 on 請啟動他!
[root@www ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> off  <==結果是 off ,依題意給他啟動!

[root@www ~]# setsebool -P httpd_enable_homedirs=1
[root@www ~]# getsebool httpd_enable_homedirs
httpd_enable_homedirs --> on

這個 setsebool 最好記得一定要加上 -P 的選項!因為這樣才能將此設定寫入設定檔! 這是非常棒的工具組!你一定要知道如何使用 getsebool 與 setsebool 才行!

7.4.5 SELinux 登錄檔記錄所需服務

上述的指令功能當中,尤其是 setsebool, chcon, restorecon 等,都是為了當你的某些網路服務無法正常提供相關功能時, 才需要進行修改的一些指令動作。但是,我們怎麼知道哪個時候才需要進行這些指令的修改啊?我們怎麼知道系統因為 SELinux 的問題導致網路服務不對勁啊?如果都要靠用戶端連線失敗才來哭訴,那也太沒有效率了!所以,我們的 CentOS 6.x 有提供幾支偵測的服務在登錄 SELinux 產生的錯誤喔!那就是 auditd 與 setroubleshootd。


  • setroubleshoot --> 錯誤訊息寫入 /var/log/messages

幾乎所有 SELinux 相關的程式都會以 se 為開頭,這個服務也是以 se 為開頭!而 troubleshoot 大家都知道是錯誤克服, 因此這個 setroubleshoot 自然就得要啟動他啦!這個服務會將關於 SELinux 的錯誤訊息與克服方法記錄到 /var/log/messages 與 /var/log/setroubleshoot/* 裡頭,所以你一定得要啟動這個服務才好。啟動這個服務之前當然就是得要安裝它啦! 這玩意兒總共需要兩個軟體,分別是 setroublshoot 與 setroubleshoot-server,如果你沒有安裝,請自行使用 yum 安裝吧!

此外,原本的 SELinux 資訊本來是以兩個服務來記錄的,分別是 auditd 與 setroubleshootd。既然是同樣的資訊, 因此 CentOS 6.x 將兩者整合在 auditd 當中啦!所以,並沒有 setroubleshootd 的服務存在了喔!因此, 當你安裝好了 setroubleshoot-server 之後,請記得要重新啟動 auditd,否則 setroubleshootd 的功能不會被啟動的。

[root@www ~]# yum install setroubleshoot setroubleshoot-server
[root@www ~]# /etc/init.d/auditd restart <==整合到 auditd 當中了!
Tips 鳥哥 事實上,CentOS 6.x 對 setroubleshootd 的運作方式是: (1)先由 auditd 去呼叫 audispd 服務, (2)然後 audispd 服務去啟動 sedispatch 程式, (3)sedispatch 再將原本的 auditd 訊息轉成 setroubleshootd 的訊息,進一步儲存下來的!

那麼如果有發生錯誤時,訊息像什麼呢?我們使用 httpd 這支程式產生的錯誤來說明好了。假設你需要啟動 WWW 伺服器, 我們的 WWW 是由 httpd 這支服務提供的,因此你必須要安裝且啟動它才行:

[root@www ~]# /etc/init.d/httpd start
[root@www ~]# netstat -tlnp | grep http
tcp     0   0 :::80   :::*              LISTEN      2218/httpd
# 看到沒?有啟動 port 80 了!這是重點!

這個時候我們的 WWW 伺服器就安裝妥當了。我們的首頁其實是放置到 /var/www/html 目錄下的,且檔名必須要是 index.html。 那如果我使用底下的模式來進行首頁的處理時,可能就會產生 SELinux 的問題了!我們就來模擬一下出問題的狀況吧!

[root@www ~]# echo "My first selinux check" > index.html
[root@www ~]# ll index.html
-rw-r--r--. 1 root root 23 2011-07-20 18:16 index.html  <==權限沒問題
[root@www ~]# mv index.html /var/www/html

此時我們就可以打開瀏覽器,然後在瀏覽器上面輸入 Linux 自己的 IP 來查察看,看能不能連上自己的 WWW 首頁。 因為我們這次安裝並沒有圖形介面,所以使用 links 來查察 http://localhost/index.html 看看!你會得到如下的訊息:

[root@www ~]# links http://localhost/index.html -dump
                                   Forbidden

   You don't have permission to access /index.html on this server.

   --------------------------------------------------------------------------

    Apache/2.2.15 (CentOS) Server at localhost Port 80

畫面最明顯的地方就是告訴你,你並沒有權限可以存取 index.html 的!見鬼了!明明權限是對的喔!那怎辦? 沒關係,就透過 setroubleshoot 的功能去檢查看看。此時請分析一下 /var/log/messages 的內容吧!有點像這樣:

[root@www ~]# cat /var/log/messages | grep setroubleshoot
Jul 21 14:53:20 www setroubleshoot: SELinux is preventing /usr/sbin/httpd 
"getattr" access to /var/www/html/index.html. For complete SELinux messages. 
run sealert -l 6c927892-2469-4fcc-8568-949da0b4cf8d

上面的錯誤訊息可是同一行喔!大綱說的是『SElinux 被用來避免 httpd 讀取到錯誤的安全性本文, 想要查閱完整的資料,請執行 sealert -l ...』沒錯!你注意到了!重點就是 sealert -l 啦! 上面提供的資訊並不完整,想要更完整的說明得要靠 sealert 配合偵測到的錯誤代碼來處理。 實際處理後會像這樣:

[root@www ~]# sealert -l 6c927892-2469-4fcc-8568-949da0b4cf8d
Summary:

SELinux is preventing /usr/sbin/httpd "getattr" access to
/var/www/html/index.html.   <==剛剛在 messages 裡面看到的資訊!

Detailed Description:       <==接下來是詳細的狀況解析!要看喔!

SELinux denied access requested by httpd. /var/www/html/index.html may 
be a mislabeled. /var/www/html/index.html default SELinux type is 
httpd_sys_content_t, but its current type is admin_home_t. Changing 
this file back to the default type, may fix your problem.
....(中間省略)....

Allowing Access:  <==超重要的項目!要看要看!

You can restore the default system context to this file by executing the
restorecon command. restorecon '/var/www/html/index.html', if this file 
is a directory, you can recursively restore using restorecon -R
'/var/www/html/index.html'.

Fix Command:

/sbin/restorecon '/var/www/html/index.html'  <==知道如何解決了嗎?

Additional Information:  <==還有一些額外的資訊!
....(底下省略)....

[root@www ~]# restorecon -Rv '/var/www/html/index.html'
restorecon reset /var/www/html/index.html context unconfined_u:object_r:
admin_home_t:s0->system_u:object_r:httpd_sys_content_t:s0

重點就是上面特殊字體顯示的地方!你只要照著『Allowing Access』裡面的提示去進行處理, 就能夠完成你的 SELinux 類型設定了!比對剛剛我們上個小節提到的 restoreconchcon 你就能夠知道, setroubleshoot 提供的訊息有多有效了吧!不管出了啥 SELinux 的問題,絕大部分在 setroubleshoot 的服務中就會告訴你解決之道!所以,很多東西都不用背的!


  • 用 email 或在指令列上面直接提供 setroubleshoot 錯誤訊息

如果每次測試都得要到 /var/log/messages 去分析,那真是挺麻煩的啊!沒關係,我們可以透過 email 或 console 的方式來將資訊產生!也就是說,我們可以讓 setroubleshoot 主動的發送產生的資訊到我們指定的 email,這樣可以方便我們即時的分析喔!怎麼辦到?就修改 setroubleshoot 的設定檔即可。你可以查閱 /etc/setroubleshoot/setroubleshoot.cfg 這個檔案的內容,我們只需要修改的地方如下:

[root@www ~]# vim /etc/setroubleshoot/setroubleshoot.cfg
[email]
# 大約在 81 行左右,這行要存在才行!
recipients_filepath = /var/lib/setroubleshoot/email_alert_recipients

# 大約在 147 行左右,將原本的 False 修改成 True 先!
console = True

[root@www ~]# vim /var/lib/setroubleshoot/email_alert_recipients
root@localhost
your@email.address

[root@www ~]# /etc/init.d/auditd restart

之後你就可以透過分析你的 email 來取得 SELinux 的錯誤訊息囉!非常的簡單吧!只是要注意,上述的填寫 email 的檔案中, 不能只寫帳號,你要連同 @localhost 都寫上,這樣本機上面的 root 才能收到信件喔!就這麼簡單哩! ^_^


  • SELinux 錯誤克服的總結

我們來簡單的做個總結吧!因為你的網路連線要通過 SELinux 才的權限判定後才能夠繼續 rwx 的權限比對。而 SELinux 的比對主要又分為: (1)需要通過政策的各項規則比對後 (2)才能夠進行 SELinux type 安全性本文的比對,這兩項工作都得要正確才行。而後續的 SELinux 修改主要是透過 chcon, restorecon, setsebool 等指令來處理的。但是如何處理呢?可以透過分析 /var/log/messages 內提供的 setroubleshoot 的資訊來處置!這樣就很輕鬆的可以管理你的 SELinux 囉!

但是如果因為某些原因,舉例來說 CentOS 沒有規範到的 setroubleshoot 資訊時,可能你還是無法瞭解到事情到底是哪裡出錯。 那此時我們會這樣建議:

  1. 在服務與 rwx 權限都沒有問題,卻無法成功的使用網路服務時;
  2. 先使用 setenforce 0 設定為寬容模式;
  3. 再次使用該網路服務,如果這樣就能用,表示 SELinux 出問題,請往下繼續處理。如果這樣還不能用,那問題就不是在 SELinux 上面!請再找其他解決方法,底下的動作不適合你;
  4. 分析 /var/log/messages 內的資訊,找到 sealert -l 相關的資訊並且執行;
  5. 找到 Allow Access 的關鍵字,照裡面的動作來進行 SELinux 的錯誤克服;
  6. 處理完畢重新 setenforce 1 ,再次測試網路服務吧!

這樣就能夠很輕鬆的管理你的 SELinux 啦!不需要想太多!分析登錄檔就對啦!

Tips 鳥哥 當鳥哥第一次修改這個 SELinux 的部分時,在 sealert 的部分一直出現錯誤,資訊為: query_alert error (1003)... 後來經過更新軟體後,又發現無法以 UTF8 進行文字解碼的問題!實在傷腦筋~最後還是修改了 /etc/sysconfig/i18n 將裡面的資料設定為: LANG=en_US 並且重新開機,才順利恢復 sealert 的資訊說明!真的是很怪異!

7.5 被攻擊後的主機修復工作

如果你的主機被攻擊而被取得操縱權的話,而你也由於瞭解到主機監控的需要,所以在最短的時間內發現此一事件, 那麼該如何針對這個被入侵的主機來修復?那如果你要修復的話,你這個網管人員還需要哪些額外的技能? 底下我們就來談一談。

7.5.1 網管人員應具備的技能

從本章第一小節的分析當中,你會發現網管還真的是挺累的,他需要對作業系統有一定程度的熟悉, 對於程序的運作與權限概念則需要更瞭解,否則就麻煩了!那除了作業系統的基本概念之外, 咱們網管還需要啥特殊技巧呢?當然需要啊!其實一部主機最常發生問題的狀況, 都是由『內部的網路誤用所產生的』,所以啊,你只管好主機而已是『沒有辦法杜絕問題』的啦! 底下就來談談你還需要啥技巧呢?

  • 瞭解什麼是需要保護的內容:

    我的天吶,還要知道什麼是需要保護的呀?沒錯,就是如此!由剛剛我們知道的主機入侵方法當中, 不難瞭解,只要有人坐在你的主機前面,那麼任何事都有可能會發生!因此,如果你的主機相當的重要, 請『不要讓任何人靠近!』你可以參考一下湯姆克魯斯在『不可能的任務』裡面要竊取一部電腦內的資料的困難度! ^_^""

    • 硬體:能鎖就鎖吧!
    • 軟體:還包含最重要的資料呢!

  • 預防黑客 (Black hats) 的入侵:

    這可不是開玩笑的,什麼是黑客呀!這是因為原本在西部電影當中,壞人都是戴黑色帽子的, 所以之前的人們就稱網路攻擊者為 Black hats 啦!在預防這方面的攻擊者時,除了嚴格管制網路的登入之外, 還需要特別控制原本你的主機中的人物!就我們小網站來說,不要以為好朋友就隨便他啦! 他說要指定密碼是跟他的帳號相同比較好記,你就答應他!等到人家用他的密碼登入你的主機,並破壞你的主機, 那可就得不償失了!如果是大企業的話,那麼員工使用網路時,也要分等級的呢! ^_^

  • 主機環境安全化:

    沒什麼好講的,除了多關心,還是多關心!仔細的分析登錄檔,常常上網看看最新的安全通告,這都是最基礎的! 還包含了以最快的速度更新有問題的軟體!因為,越快更新你的軟體,就越快可以杜絕黑客的入侵!

  • 防火牆規則的訂定:

    這部份比較麻煩一些啦!因為你必需要不斷的測試測試再測試!以取得最佳化的網路安全設定! 怎麼說呢?要曉得的是,如果你的防火牆規則訂定得太多的時候, 那麼一個資料封包就要經過越多的關卡才能完整的通過防火牆,以進入到主機內部!嘿嘿! 這可是相當的花費時間的!會造成主機的效能不彰!特別留意這一點呢!

  • 即時維護你的主機:

    就像剛剛說的,你必需要隨時維護你的主機,因為,防火牆不是一經設定之後就不用在再他了! 因為,再嚴密的防火牆,也會有漏洞的!這些漏洞包括防火規則設定不良、利用較新的偵測入侵技術、 利用你的舊軟體的服務漏洞等等!所以,必需要即時維護你的主機呀!這方面除了分析 log files 之外,也可以藉由即時偵測來進行這個工作!例如 PortSentry 就是蠻不錯的一套軟體呢!

  • 良好的教育訓練課程:

    不是所有的人都是電腦網路高手,尤其雖然現在資訊爆炸但是仍然有很多的機會會遇到電腦白癡呀! 這個時候,要曉得的是,我們對於內部網域通常沒有太多的規範,那如果他用內部的電腦去做壞事怎麼辦? 有時候還是無心的~挖哩~所以說,需要特別的教育訓練課程呀!這也是公司需要網管的主因之一!

  • 完善的備份計畫:

    天有不測風雲,人有旦夕禍福呀!什麼人都不知道什麼時候會有大地震、我們也都不知道什麼時候會突然的硬碟掛掉去~ 所以說,完善的備份計畫是相當重要的!此外,大概沒有人會說他的主機是 100% 的安全吧! 那如果你的系統被入侵,造成資料的損毀時,你要如何復原你的主機啊?呵呵!一個良好的網站管理人員, 無時無刻都會進行重要資料的備份的!很重要啊!這一部份請參考一下基礎學習篇Linux 主機備份的內容吧! 我們在後面的遠端連線伺服器章節內也會提到一個很棒的 rsync 工具,你可以瞧瞧!

7.5.2 主機受攻擊後復原工作流程

所謂『百密一疏』啊,人不是神,總會有考慮不週的情況,萬一你的主機就因為這『一疏』導致被入侵了, 那該怎麼辦?由上面的說明當中,我們知道『木馬』是很嚴重的,因為他會在你的系統下開個後門 (Back door) 讓攻擊者可以登入你的主機,而且還會竄改你 Linux 上面的程式,讓你找不到該木馬程式!怎麼辦?

很多朋友都習慣『反正只要將 root 的密碼改回來就好了』 這樣的觀點,事實上,那樣一部主機還是有被做為中繼站的危險啊!所以, 萬一你的主機被入侵了,最好的方法還是『重新安裝Linux 』會比較乾淨

那該如何重新安裝呢?很多朋友一再地安裝,卻一再地被入侵~為什麼呢?因為他沒有『記取教訓』啊!呵呵! 底下我們就來談一談,一部被入侵的主機應該如何修復比較好?

  1. 立即拔除網路線:

    既然發現被入侵了,那麼第一件事情就是拿掉網路功能!拿掉網路功能最簡單的作法自然就是拔掉網路線了! 事實上,拿掉網路線最主要的功能除了保護自己之外,還可以保護同網域的其他主機。怎麼說呢?舉個 2003 年 8 月發病的疾風病毒好了,他會感染同網域之內的其他主機喔!所以,拔除網路線之後,遠端的攻擊者立即就無法進入你的 Linux 主機,而且你還可以保護網域內的其他相關主機啊!

  2. 分析登錄檔資訊,搜尋可能的入侵途徑:

    被入侵之後,決不是只要重新安裝就好,還需要額外分析 『為什麼我的主機這一次會被入侵,對方是如何入侵的?』, 如果你能夠找出問題點,那麼不但你的 Linux 功力立刻增強了,主機也會越來越安全喔! 而如果你不知道如何找出被入侵的可能途徑,那麼重新安裝後,下次還是可能被以同樣的方法入侵啊! 粉麻煩的啦!好了,那該如何找出入侵的途徑呢?

    • 分析登錄檔:低級的 cracker 通常僅是利用工具軟體來入侵你的系統,所以我們可以藉由分析一些主要的登錄檔來找出對方的 IP 以及可能有問題的漏洞。可以分析 /var/log/messages, /var/log/secure 還有利用 last 指令來找出上次登入者的資訊。

    • 檢查主機開放的服務:很多 Linux 使用者常常不曉得自己的系統上面開了多少的服務?我們說過,每個服務都有其漏洞或者是不應該啟用的增強型或者是測試型功能, 所以,找出你系統上面的服務,並且檢查一下每個服務是否有漏洞,或者是在設定上面有了缺失,然後一個一個的整理吧!

    • 查詢 Internet 上面的安全通報: 透過安全通報來瞭解一下最新的漏洞資訊,說不定你的問題就在上面!

  3. 重要資料備份:

    主機被入侵後,顯得問題相當的嚴重,為什麼呢?因為主機上面有相當重要的資料啊!如果主機上面沒有重要的資料, 那麼直接重新安裝就好了!所以,被入侵之後,檢查完了入侵途徑,再來就是要備份重要的資料了。 好了,問個問題,什麼是『重要資料』?who, ps, ls 等等指令是重要資料嗎?還是 httpd.conf 等設定檔是重要資料?又或者是 /etc/passwd, /etc/shadow 才是重要資料?

    呵呵!基本上,重要的資料應該是『非 Linux 系統上面原有的資料』,例如 /etc/passwd, /etc/shadow, WWW 網頁的資料, /home 裡面的使用者重要檔案等等,至於 /etc/*, /usr/, /var 等目錄下的資料,就不見得需要備份了。 注意:不要備份一些 binary 執行檔,因為 Linux 系統安裝完畢後本來就有這些檔案,此外, 這些檔案也很有可能『已經被竄改過了』,那備份這些資料,反而造成下次系統還是不乾淨!

  4. 重新全新安裝:

    備份完了資料,再來就是重新安裝 Linux 系統了。而在這次的安裝中, 你最好選擇適合你自己的安裝軟體即可,不要全部軟體都給他安裝上去啊!挺危險的!

  5. 軟體的漏洞修補:

    記得啊,重新安裝完畢之後,請立即更新你的系統軟體,否則還是會被入侵的啦!鳥哥喜歡先在其他比較乾淨的環境下將 Internet 上面的漏洞修補軟體下載下來,然後燒錄起來,然後拿到自己的剛剛安裝完成的系統上面,mount CD 之後全部給他更新,更新之後,並且設定了相關的防火牆機制,同時進行下一步驟『 關閉或移除不需要的服務』後,我才將網路線插上主機的網路卡上! 因為鳥哥不敢確定在安裝完畢後,連上 Internet 去更新軟體的這段時間,會不會又受到入侵攻擊說....

  6. 關閉或移除不需要的服務:

    這個重要性不需要再講了吧?!啟用越少的服務,系統當然可以被入侵的可能性就比較低。

  7. 資料回復與恢復服務設定:

    剛剛備份的資料要趕緊的複製回來系統,同時將系統的服務再次的重新開放,請注意, 這些服務的設定最好能夠再次的確認一下,避免一些不恰當的設定參數在裡頭喔!

  8. 連上 Internet:

    所有的工作都進行的差不多了,那麼才將剛剛拿掉的網路線接上來吧!恢復主機的運作了!

經過這一連串的動作後,你的主機應該會恢復到比較乾淨的環境,此時還不能掉以輕心, 最好還是參考防火牆的設定,並且多方面的參考 Internet 上面一些老手的經驗,好讓你的主機可以更安全一些!

重點回顧

  • 要管制登入伺服器的來源主機,得要瞭解網路封包的特性,這主要包括 TCP/IP 的封包協定, 以及重要的 Socket Pair ,亦即來源與目標的 IP 與 port 等。在 TCP 封包方面,則還得瞭解 SYN/ACK 等封包狀態;
  • 網路封包要進入我們 Linux 本機,至少需要通過 (1)防火牆 (2)服務本身的管理 (3)SELinux (4)取得檔案的 rwx 權限等步驟;
  • 主機的基本保護之一,就是擁有正確的權限設定。而複雜的權限設定可以利用 ACL 或者是 SELinux 來輔助;
  • 關閉 SELinux 可在 /etc/selinux/config 檔案內設定,亦可在核心功能中加入 selinux=0 的項目;
  • rootkit 為一種取得 root 的工具組,你可以利用 rkhunter 來查詢你主機是否被植入 rootkit;
  • 網管人員應該注意在員工的教育訓練還有主機的完善備份方案上面;
  • 一些所謂的黑客軟體,幾乎都是透過你的 Linux 上面的軟體漏洞來攻擊 Linux 主機的;
  • 軟體升級是預防被入侵的最有效方法之一;
  • 良好的登錄檔分析習慣可以在短時間內發現系統的漏洞,並加以修復。

課後練習

  • 我老是發現我的系統怪怪的,似乎有點停頓的模樣,懷疑可能是 CPU 負荷太大,所以要去檢查一下系統相關的資訊。請問,我該以什麼指令去檢查我的系統相關的資訊?
    可以使用 top, sar, free, ps -aux, uptime, last 等功能去查詢系統的相關資訊喔!然後再以 kill 之類的指令刪除;
  • 我懷疑我的系統上面有過多的具有 SUID 的檔案存在,導致一般使用者可以隨意的取得 root 的權限,請問,我要如何找出這些具有 SUID 權限的檔案?
    因為 SUID 是 4000 這個權限的模樣,所以我可以這樣做:
    find / -perm +4000
  • 我由國內一些 ftp 網站上下載了 Red Hat 公司釋出的軟體,我想安裝他,但又不知道該軟體檔案是否被修改過! 請問我該如何確定這個軟體的可用性?
    利用最簡易的 MD5 編碼來測試一下,例如『 md5sum 軟體名稱』,再比對與原始軟體釋出的 MD5 數據是否相同!?
  • 如果我發現使用『 setfacl -m u:dmtsai:rwx /path/to/file 』時,系統卻顯示『setfacl: Operation not supported』, 你認為是哪裡出問題?
    這是由於你的 filesystem 沒有啟用 ACL 支援,或者是系統的核心不支援。 請先使用 mount -o remount,acl /mount_point 測試看能否支援 ACL ,若不支援時,則可能是由於核心版本太舊了。
  • 如果要設定 dmtsai 可以使用 /home/project 這個目錄 (假設 /home 已經支援 ACL),在該目錄內 dmtsai 可以擁有完整的權限。請問該如何設定該目錄?
    除了使用 setfacl -m u:dmtsai:rwx /home/project 之外,還需要設定 setfacl -m m:rwx /home/project , 因為 ACL 在目錄方面,必須透過使用者權限及 mask 的邏輯運算後才能生效!
  • SELinux 是否為防火牆?
    SELinux 並非防火牆,他是用來作為更細部權限設定的一個核心模組。
  • 良好的密碼規劃是防備主機的第一要務,請問 Linux 系統當中,關於密碼相關的檔案與規則設定在哪些檔案裡面?
    密碼的設定規則在 /etc/login.defs 裡面!至於密碼檔案在 /etc/shadow 內!
  • 簡易說明,當一部主機被入侵之後,應該如何處理?
    找出問題、重新安裝、漏洞修補、資料還原!請參考本章最後一節的說明。

參考資料與延伸閱讀

修改歷史:
  • 2002/08/12:第一次完成日期!
  • 2003/08/23:重新編排與增加重點回顧、課後練習
  • 2006/08/31:將舊的文章移動到此處
  • 2006/09/06:增加 SELinux 的簡單說明,增加 ACL 的控制項目!
  • 2010/09/06:將舊的基於 CentOS 4.x 撰寫的文章移動至此處
  • 2010/09/09:因為單純使用 CentOS ,因此取消了 apt 的更新功能囉!
  • 2010/09/21:將舊的 限制連線埠口網路升級軟體 挪動到新的目錄去了!
  • 2010/09/21:還有許多資料包括(1)重點回顧/(2)課後練習/(3)延伸閱讀的部分都還沒有彙整好。只是先公告這一版而已。
  • 2011/07/20:將基於 CentOS 5.x 的文章移動到此處
  • 2011/07/21:SELinux 還真是怪異啊!修改成 CentOS 6.x 的模樣啦!
2002/08/12以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計