第 176 期 以 Paros 掃描 Web 程式漏洞─自由軟體鑄造場電子報─智邦公益電子報
enews.url.com.tw · February 07,2012報主的話
報主的話: 更多自由軟體相關新聞及文章,請按此閱讀或訂閱。 |
[技術專欄] 以 Paros 掃描 Web 程式漏洞
老薯條 (http://vulscan.wynetech.com.tw)/文 2011-07-08
前言
隨著電子商務的興起,各式各樣的商務網站 (Web) 如雨後春筍般百花齊放,相關的安全問題也日漸增多。Web 的安全威脅型態與其它安全威脅最大的不同,在於 Web 的安全威脅,通常是因程式設計師的疏失或經驗不足所造成(如 XSS,SQL INJECTION 等漏洞),與一般作業系統只要安裝修正程式(如利用 Microsoft 系統的自動更新)即可修補系統漏洞有很大的差別。以程式設計師的角度,解決程式的漏洞最為有效的方式,是利用檢視程式碼 (Code Review) 會議,重新檢視每一行程式碼,以人工方式找出有問題的程式。但此種方式所花費的人力與物力浩大,有點不切實際,因此通常會使用自動化掃描工具,幫助程式設計師檢查是否有相關漏洞。然而,一套商業化的弱點掃描工具往往所費不貲,也絕非一般中小企業所能負擔的起。在本文中,筆者將介紹一套專門用於掃描 Web 程式漏洞的自動化工具 (Paros),來幫助讀者掃描網站程式漏洞。
Web 程式基本概念
一說到 Web,我想大部份的讀者腦海裡第一個浮現的念頭一定是 HTML。其實 HTML 語言,最早是被用來統一描述文件的表示方式(利用< >來描述文字表示方式,如<b></b>即代表以粗體顯示,所以又稱為標籤語言)。在此種應用之下,HTML 就像一般的文字檔,只要您使用瀏覽器來瀏覽 HTML 檔案,即會根據該 HTML 內標籤的意義來顯示文字。此種網頁我們稱之為「靜態網頁」,靜態網頁就像公佈欄一樣,僅可張貼訊息而無法與使用者有任何互動。而至電子商務時代,此種方式已無法符合所需,於是與資訊庫功能結合的「動態網頁」(這也是 Web 安全問題的根源)應運而生。動態網頁運作流程如下圖所示:
▲ 圖1
使用者將「參數」(如上圖中的帳號及密碼)傳遞至網頁伺服器上後,與相對應的網頁程式互動,再由網頁程式根據參數至資料庫擷取相關資訊,動態組成 HTML 內容再回傳至使用者的瀏覽器上。
動態網頁大大地擴展 Web 的應用,使得電子商務變得可行。但也因此衍生出不少安全的漏洞。在說明相關 Web 漏洞前,將說明 Web 的幾個重要觀念如下段。
參數的傳遞
動態網頁需藉由使用者傳遞參數(如登入作業,使用者需傳遞帳號/密碼等資訊來驗證)的內容來執行相關的動作,Web 參數的傳遞定義了下列兩種的傳遞方式。
GET:
此種方式是將參數接在 URL 後,直接傳遞給網頁程式,如下例:
▲ 圖2
POST:
利用 HTML 中的<FORM>來將相關的參數傳遞給網頁程式,如下例為傳遞 userid 與 passwd 參數至 index.php
<form method="POST" action="index.php"> #網頁程式位置
<table border=1>
<tr>
<td>帳號:</td>
<td><input type="text" name="userid”></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="text" name="passwd”></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="送出"></td>
</tr>
</table>
</form>
Session 與 Cookies
HTTP 是一種無狀態 (stateless) 的連接方式,所謂的無狀態 (stateless) 連接,即表示每次 HTTP 連接都不會記得上一次連接的狀態。那要如何實作一個 Web 應用程式的認證(如會員登入)?有過程式設計經驗的讀者,應該了解在一般的應用程式上,這並不是大問題,因為一般的程式,入口只有一個,在執行時,應用程式一定要先執行登入功能(如下圖中的 Login.frm),通過認證後方可往下執行相關功能。
▲ 圖3
可是很不幸的 Web 程式具有「超連結」的特性。執行 Web 程式時,它未必需要先執行 Login.php 才能去執行其它程式。它可隨意執行網站伺服器上的任意程式(如上圖中的 Web 程式流程 http://<網站IP>/子功能一.php),而不一定要先執行 Login.php 登入認證後才可執行其它程式。因此,每支網頁程式中都需使用檢查認證的程式,來驗證使用者是否有登入。但是,問題來了,如前所述,HTTP 是一種無狀態 (stateless) 的連接方式,即使使用者已通過認證,當重新連接新的網頁程式(如子功能一.php),檢查認證的程式該如何來確認使用者已登入了?這也是 cookies 其中一種重要的運用,cookies 是一種由網站伺服器傳遞給使用者的小檔案,當使用者通過認證後可由伺服器丟一個認證 cookies 至使用者的電腦上,而後檢查認證的程式可利用檢查使用者電腦是否存有認證 cookies,來判別使用者是否已登入認證。Session 也是類似的作用,只不過 Session 是儲存在網站伺服器端,而 cookies 則是儲存在使用者的電腦上。
OWASP TOP 10(年度 10 大 Web 安全漏洞)
OWASP 是一個專門研究 Web 軟體安全的社群,他們每年均會提出最有威脅的 Web 安全漏洞來提醒使用者,以下簡單的說明 OWASP 於 2010 年所提出的 Web 安全漏洞。
Injection(注入攻擊)
由於程式設計師出於疏失或經驗不足而未對於使用者輸入的參數值進行檢驗,以致於惡意使用者可利用惡意的輸入值(如惡意 SQL 指令串或惡意的 script 碼),讓系統自動執行惡意的指令而對系統造成危害。此類攻擊以 SQL injection,command injection 為代表,其中以 SQL injection 最具代表也最具危害性。接下來即說明 SQL injection 的攻擊方式,假設有一個驗證是否為會員的登入程式,如下圖示(假設會員表格 (table) 名稱為 account 並以 login 表示帳號參數,passwd 表示密碼參數):
▲ 圖4
假如程式設計師並未對輸入欄位進行驗證,他的程式碼可能僅是如下的程式碼:
Select * from account where login=’+LOGIN +”’ and passwd=’”+PASSWD+”’”
其中 LOGIN 為使用者所輸入的帳號參數,而 PASSWD 為使用者所輸入的密碼參數。在正常的情況下,當使用者輸入正常的帳號及密碼後,即組成正常的 SQL 查詢字串如下:
Select * FROM account where login=’使用者帳號’ AND passwd=’使用者密碼’
如果有查詢到資訊,即表示為合法使用者(因為該筆記錄在 account 中有存在),否則即不允許登入,但如果有惡意的使用者輸入如上圖的帳號,所組成的 SQL 查詢字串即如下所示:
Select * FROM account where login=’john’ - - passwd=’’
(在 SQL 語法中 - - 表示註解,即後續的指令均不需執行,上述的 SQL 指令即代表只要帳號符合即可通過驗證(即無需輸入密碼即可成功的登入))。上述的例子僅為 SQL Injection 的基本型,其危害程度取決於攻擊者對於 SQL 的了解程度而定。
Cross Site Scripting(XSS,跨網站腳本攻擊)
跨網站腳本攻擊的原因跟 SQL injection 一樣,同樣是因為程式沒有檢驗使用者輸入的參數內容所造成。不過與 SQL injection 最大的不同在於,SQL injection 會對資料庫所在的主機造成重大危害,但 XSS 攻擊主要會造成瀏覽者安全上的危害,往往不會對於主機造成危害,也因此常被管理者所忽略,而使得此種攻擊有越來越普遍的趨勢。XSS 攻擊流程如下:
<1>攻擊者將含有 XSS 漏洞的網頁,置於受害的網站伺服器上 。
<2>當不知情的使用者瀏覽此網頁時(如瀏覽某則留言),即會啟動 XSS 攻擊碼而將無辜的第三者相關資訊回傳到駭客的電腦上。
Broken Authentication and Session Management(鑑別與連線管理漏洞)
此漏洞是指網站自行開發的身份證驗證與連線 (session) 管理具有安全性的缺失,例如一個網站身份驗證流程如下:
<1>當使用者登入成功後,會將一個(含有帳號及密碼甚至權限等相關資訊的 cookies,丟至使用者的電腦端上)。
<2>網站再存取該使用者的授權 cookies 來判別使用者的身份。
在上述流程中,如果 cookies 並未加密,惡意的使用者只要取得此 cookies 即可得知其它使用者相關的機密資訊。或者加密的演算法不夠嚴謹,一旦被破解,也會造成使用者的機密資料外流,甚至可冒充其它的使用者(提升權限至管理者)。
Insecure Direct Object References(不安全的物件參考)
如果一個經驗不足的程式設計師,想要實做一支能動態顯示檔案內容的程式,會直覺想到直接把要顯示的檔案當做參數傳進去,如下連結所示:
http://xxx.xxx.xxx.xxx/show.php?file=xxx.txt
而後在接到參數值後,再直接開檔顯示即可。可是如果一個有心人傳進去的參數為:
http://xxx.xxx.xxx.xxx/show.php?file=../../etc/passwd
其中 ".." 為回到上一層,此種參數即可能將系統中的 /etc/ 目錄下的 passwd 檔案顯示出來。
Cross Site Request Forgery(CSRF,跨網站冒名請求)
從某種角度來看,CSRF 可視為廣義的跨網站攻擊 (XSS) ,但 CSRF 通常是在使用者已登入系統服務下發動攻擊。例如:
在討論區中的某段留言塞進一段可直接登出 (logout) 的惡意程式碼,當使用者登入後,在瀏覽相關留言時,只要瀏覽到這段留言,即會觸發該段惡意程式碼,而直接將使用者登出。此即為 CSRF 攻擊。
Security Misconfiguration(不安全的組態設定)
此漏洞較偏向管理面的問題,如未更改預設的帳號及密碼或未定時的更新系統的安全修正程式等等。
Failure to Restrict URL Access(未適當限制的 URL 存取)
一般網站通常會分成前端程式及後端管理程式。基於安全的考量 ,後端管理程式不應該直接被 Internet 上的使用者查詢,而應該限制僅有某些管理者可查詢及存取。如果網站未限制,而使 Internet 上的其它使用者也可正常的查詢,即可能造成潛在的安全漏洞。
Unvalidated Redirects and Forwards(未驗證的網頁重新導向)
有些網站提供網頁重新導向至其它的網站,惡意的攻擊者可利此種特性,將惡意網址插入到重新導向的參數中,讓使用者連接到惡意的網站上。
Insecure Cryptographic Storage(不安全的加密儲存)
網站並未對機密的資料做加密處理或使用不嚴謹的加密演算法,而導致攻擊者在取得相關的機密資料後,可以很輕易的取得相關資訊。
Insufficient Transport Layer Protection(不安全的傳輸防護)
由於 HTTP 連線均是採用明碼的方式連線,攻擊者在任何一個節點均可能利用 Sniffer(竊聽)方式取得來往資料。如果網站採用 HTTP 連線方式,來往的封包均以明碼方式傳輸,攻擊者即可輕易的取得相關機敏資訊。
安裝 Paros
Paros 是一套以 Java 語言開發而成的網站應用程式資訊安全掃瞄工具 (web application security assessment tool),以 proxy 的形式,介於瀏覽器與待測網站之間,攔截雙方 HTTP 通訊協定,並從中注入相關的測試封包,來完成 Web 的安全檢查。請讀者至 Paros 網站上取得最新版本安裝(在安裝之前要確定您的電腦已安裝 JAVA 的環境)。
此工具有提供相關的介面來操作,使用上僅需下列幾個步驟即可完成。
1.啟動 Paros(讀者可在命令介面上執行 netstat 查看是否有成功啟動,如有 8080 埠(Paros 預設服務的埠)正在運作即表示啟動成功,如下圖示)。
▲圖5 Paros 運行在 8080 埠
2.調整瀏覽器,以 IE8 為例(設定瀏覽器欲使用 proxy,點選【工具】→【網際網路選項】→【連線】→【區域網路設定】如下圖示)。
▲圖6 設定瀏覽器使用 8080 埠的 proxy
3.利用瀏覽器瀏覽欲偵測的網站(此時在 Paros 上的<site>區域上即會出現所瀏覽網站的 URL)。
4.利用<spider>功能將該網站的所有 URL 資訊捉進來。
▲ 圖7
5.利用 "scan all" 來掃描所有的 URL 網頁,掃描完成後即會產生掃描報表。
6.利用 REPORT 功能查看掃描結果報表(如下圖示)
▲ 圖8
至此,讀者即可參考相關掃描報表來修正 Web 程式的漏洞。
[源碼快訊] 維基百科台灣社群夏聚暨寫作教學營-邀你一起貢獻知識
維基社群 2011-07-06
維基百科台灣社群 2011 年夏聚活動即將在 7 月 24 日,假萬能科技大學台北教學中心舉行。有鑑於許多樂於貢獻知識的朋友,經常因為對於編撰維基百科條目的規則不太熟悉,遲遲不敢踏出寫作的第一步,本次聚會特別規劃寫作教學活動。有在線上活躍的編者進行詳細的教學,還可以與其他熱心分享知識的朋友一同完成你在維基百科上的第一個作品!活動全程免費,歡迎有興趣的朋友立即線上報名,我們期待你的出現!
【活動資訊】
◎ 時間:2011 年 7 月 24 日(日) 9:30~15:30
◎ 地點:萬能科技大學台北教學中心(台北市懷寧街 39 號 3 樓 近台北車站)
◎ 線上報名:http://0rz.tw/reqL7(7 月 17 日截止)
◎ 活動日程表:http://bit.ly/kGfY5J
◎ 主辦單位:維基百科台灣社群夏聚籌備團隊
◎ 協辦單位:中研院-資創中心-自由軟體鑄造場 (Open Source Software Foundry, OSSF)
[技術專欄] CentOS 基礎設定(中)
Weithenn (http://www.weithenn.org/)/文 2011-07-11
前言
在上一篇文章 CentOS 基礎設定(上) ,我們已經建立及設定好管理者用來遠端登入主機的一般使用者帳號,以及設定 CentOS 主機網路資訊,並測試能否與網際網路上主機連通。透過修改 SELinux 安全增強機制至寬容模式來了解 SELinux 的保護阻擋機制,以便為日後完全開啟 SELinux 安全增強機制鋪路。最後則是關掉預設的權限,不允許 root 管理者帳號遠端登入,以避免被網路上隨處可得的密碼暴力測試工具攻擊的機會
本文中將會先簡單介紹 CentOS Linux 的 7 種啟動模式等級 (RunLevel),解說每個啟動模式等級所分別代表的意義。再來則是設定使用者登入系統後的操作介面 Shell 以及編輯器 VIM 的環境參數設定,以便幫助您在操作 CentOS 作業系統及編輯檔案時能更加得心應手。設定操作介面及編輯器後,則是探討當每台主機同時擁有多個管理者的情況時,該如何記錄每個管理者登入主機後的操作情況。我們將會透過設定 sudo 來限制及記錄管理者提升到管理權限 root 的使用狀況。最後則會設定 CentOS 作業系統的套件管理工具 YUM 將套件的下載來源指向到台灣本地鏡像網站,以便縮短相關軟體套件的下載時間。
實作環境
* CentOS 5.5 32bit (Kernel 2.6.18-194.el5)
* vim-7.0.237
* sudo-1.7.2p1-5.el5
* yum-3.2.22-26.el5.centos
RunLevel 啟動模式等級
談到 CentOS Linux 的 RunLevel 啟動模式等級,便要先了解一下整個 CentOS 開機過程。透過下列的開機流程說明,便會了解到在 RunLevel 啟動模式,為何能夠掌控系統後半段開機階段的相關服務啟動及關閉。下列開機流程是以安裝於 x86 硬體上的 CentOS 進行說明:
1. 硬體伺服器 BIOS (INT 13H / EFI) 開機時會檢查連接於系統上的主硬碟 MBR / GPT 來載入開機管理程式(例如 GRUB、LILO等)。
2. 初始階段開機管理程式會載入記憶體並從 /boot 掛載點內啟動下一階段開機管理程式,舉例來說,GRUB 開機管理程式便是載入 /boot/grub/grub.conf 設定檔內容中的 initrd-2.6.18-194.el5.img 映像檔。
3. 這個階段中會將系統核心,以及必需的系統模組載入至記憶體內並且掛載於 root 分割區,此時也同步釋放未使用到的記憶體。請注意此時 root 分割區為唯讀狀態。
4. 當核心載入完畢,執行完硬體偵測及相關驅動程式載入後,接著便會將開機過程的控制權轉交給系統第一隻執行程式 /sbin/init 來準備設定使用者環境。
5. /sbin/init 程式將透過 /etc/inittab 設定檔來為系統載入適當的 RunLevel 相關設定,例如網路設定、相關服務啟動等,並且將 /etc/fstab 設定檔內所條列的掛載點,一一掛載至檔案系統。相關服務啟動完成,檔案系統掛載完畢,至此系統開機完成。
RunLevel (SysV init) 啟動模式等級可以分為 7 種等級分別是 0 ~ 6,而這 7 個數字所分別代表的意義如下:
* 0 (halt):系統關機,若您將 RunLevel 設為此模式,則會發現當開機程式完成後系統就直接關機。
* 1 (Single user mode):單人模式,通常在系統發生問題需要維護時才會進入此一模式。
* 2 (Multiuser without NFS):多人模式但沒有 NFS 網路功能,通常用於多人多工但不需要網路功能時,才會進入此模式。
* 3 (Full multiuser mode):多人文字模式,此模式為不需要進入視窗模式,並且具備完整網路功能的管理者所使用的模式。
* 4 (unused):尚未使用,使用者可以自行定義。
* 5 (X11):多人圖形模式,此模式為習慣使用視窗模式,並且具備完整網路功能的管理者所使用的模式。
* 6 (reboot):重新啟動,若您將 RunLevel 設為此模式則會發現當開機程式完成後,系統就直接重新啟動。
當您在安裝 CentOS 時若是由文字模式進行安裝過程,則系統預設使用的 RunLevel 便為 3。也就是文字模式 (Text mode)。若安裝過程選擇圖形模式進行安裝,則系統預設使用的 RunLevel 便為 5 也就是圖形模式 (GUI mode)。若您希望變更系統預設使用的 RunLevel 啟動模式等級,可以透過修改 “/etc/inittab” 設定檔內容來達成。下列操作步驟為將 RunLevel 3 修改為 RunLevel 5:
那要如何得知目前所在的 RunLevel 啟動模式等級中,哪些服務是啟用的,哪些是關閉的呢?並且又該如何啟用某個服務或關閉某個服務呢?要達成上述目的有三個指令可以達成分別是 chkconfig、ntsysv、system-config-services 詳細差異及說明如下:
* chkconfig:此指令可以條列出指定的服務在每個 RunLevel 中的啟用或關閉狀態,您可以使用指令來將服務在某個 RunLevel 進行啟用及關閉的狀態,或者搭配參數 on / off 來一次將該服務在 RunLevel 2 ~ 5 進行啟用及關閉的狀態。
* ntsysv:此指令會開啟互動視窗,您只要將該服務勾選或取消勾選便是將該服務進行啟用及關閉,而該服務的啟用及關閉只會影響您目前所處的 RunLevel 啟動模式等級,例如您在文字模式 (RunLevel 3) 將 smartd 服務關閉則表示該服務只在 RunLevel 3 時不啟動,但在圖形模式 (RunLevel 5) 時該服務仍然會啟動。
* system-config-services:請注意此指令僅能在圖形模式下執行,透過圖形管理介面您可以輕鬆對該服務進行啟動 (Start)、停止 (Stop)、重新啟動 (Restart),若是勾選該服務則表示該服務在 RunLevel 5 為啟用狀態。
下列操作為透過 chkconfig 指令,當系統啟動於 RunLevel 3 啟動模式,查詢系統將會自動啟動哪些服務。還有如何透過 chkconfig 指令查詢及針對單一服務進行 RunLevel 啟動模式等級的啟用及關閉。最後則是啟動 ntsysv 的互動設定視窗及 system-config-services 圖形管理介面。
▲圖3 設定 smartd 服務於 RunLevel 3、5 啟用並查看狀態
▲圖5 system-config-services 圖形管理介面
常常會有 Linux 初學者詢問,若希望有程式或動作想要在系統開機時,如何自動啟動某些服務或執行某個動作,那該如何達成呢?您可以將相關執行動作寫入至 /etc/rc.local 設定檔內即可。或許您會有疑問為何寫入此檔案的內容會在開機時自動執行,您可以查看 RunLevel 3、5 的執行資料夾裡面有 S99local 的連結檔案,其內容便是連結指向至 /etc/rc.local 檔案,而在 RunLevel 資料夾中 S 開頭表示啟動 (Satrted) 而 K 表示關閉 (Killed),而數字 99 為啟動順序(數字愈小愈先啟動),這也就是為何寫入 /etc/rc.local 檔案中的內容會在開機時被執行的原因。
▲圖6 查看 RunLevel 3、5 資料夾 S99local 檔案內容
設定 tcsh Shell 操作環境
對於許多 Linux 的使用者來說習慣的 Shell 應該是系統預設使用的 bash (Bourne-Again Shell),CentOS 預設支援的 Shell 除了有 bash 之外還支援 sh (Bourne Shell)、csh (C Shell)、tcsh (TENEX C Shell)、ksh (Korn Shell) 等 Shell。筆者個人習慣於 tcsh Shell 操作環境來管理機器,基本上使用哪種 Shell 全憑個人使用習慣也就是順手即可。下列的相關設定值及環境參數將以筆者習慣的 tcsh Shell 來進行舉例說明。
使用 tcsh Shell 在不設定任何參數的情況下,便可以擁有按下【Tab】鍵,即自動補齊檔名及搜尋上一次輸入指令的功能。所謂【Tab】鍵補齊檔名功能是什麼意思呢?舉個例子來說,假如我們想要查看主機的日期及時間資訊時,會鍵入 date 指令,當輸入 da 之後便按下【Tab】鍵,此時作業系統會尋找系統中 da 開頭的相關指令,由於系統中 da 開頭的指令只有二個分別是 date 及 dateconfig。因此當按下【Tab】鍵進行補齊檔名功能時便會先自動補齊為 date 指令。
tcsh Shell 的補齊檔名功能不僅僅能使用於指令方面,對於檔案及目錄也具有相同的功能。以搜尋上一次輸入指令的功能為例,分別輸入了 ls 某個目錄內容及 cd 到某個目錄內,當您想要再次執行時只要打 ls 再按【上方向鍵】則 tcsh Shell 會自動找出最近執行過開頭為 ls 的指令,這樣的功能對於操作作業系統來說非常方便。
除了預設的功能之外我們可以設定 tcsh Shell 的環境變數來加強操作的便利性,以剛才測試補齊檔名功能執行的 date 指令來說,其實該指令的完整路徑為 /bin/date,但是為何當我們輸入 date 指令按下 Enter 鍵後便可順利執行該指令?這是因為預設的 tcsh Shell 環境設定檔中已經將作業系統經常會使用到的指令路徑載入環境變數中(參數 PATH),因此我們才可以在不用鍵入絕對路徑的情況下直接執行相關指令。
以使用 tcsh Shell 為例當使用者登入 CentOS 主機後,該使用者帳號會依序載入 /etc 資料夾下的二個通用環境設定檔,分別是 csh.cshrc 及 csh.login,接著則是載入個人家目錄下的 .cshrc 及 .login 個人環境設定檔。而當管理者設定的通用環境設定檔與個人環境設定檔內容發生衝突時系統會以套用個人環境設定檔為最後結果(最後套用的設定值為準)。再設定以前先確定該使用者帳號所使用的 Shell 您的 Shell 環境設定檔才能正確進行套用,以下為筆者個人習慣設定於個人家目錄下 .cshrc 的個人環境設定檔內容:
▲圖7 查詢使用者帳號所使用的 Shell 及 tcsh Shell 個人環境設定檔內容
設定 VIM 編輯器操作環境
VI (Visual Interface) 為 Unix-Like 預設內建的檔案編輯器,然而此編輯器對於 Linux 初學者來說比較容易感覺到使用不易。CentOS 作業系統預設會安裝較容易使用而且功能更為強大的檔案編輯器 VIM (Vi Imitation) ,建議 Linux 初學者可以使用此編輯器進行檔案編修,相信可以較為順手。與 tcsh Shell 相同的觀念,VIM 檔案編輯器預設功能雖然已經很強大,但是您仍可以依需求加上相關參數設定使得 VIM 編輯器更為強大更為貼近您的使用需求。以下為筆者個人習慣設定的 VIM 參數設定值:
設定 sudo 帳號管理機制
在 CentOS 作業系統當中 root 使用者帳號被稱為超級使用者帳號,此帳號為整個作業系統中權限最大的管理帳號,權限大到可以直接將作業系統自我毀滅。由於 root 超級使用者帳號權限如此之大,因此筆者在此強烈建議您應該使用一般使用者帳號登入主機進行操作,待需要執行的動作需要提升權限時才切換為管理帳號進行操作,以免因為一時疏忽或者不慎手誤,造成系統或服務損壞。
當您所管理的 CentOS 主機同時擁有多個管理者進行管理時,您該如何確定是其中哪個管理者使用了 root 管理帳號對系統做了什麼事情?例如當您想要得知是哪個管理者在哪個時間切換為 root 管理帳號並且對系統執行了哪些指令,傳統的切換方式 su – 就不符合這樣的需求了,有鑑於此我們可以透過設定 sudo 來達成這樣的查核需求。
Sudo 套件就是為了彌補作業系統中內建的身份切換指令 su 不足所發展出來的軟體套件,透過設定此套件後我們可以建立相關的使用者權限群組,並且給予不同權限的指令來達到控管使用者權限的目的,同時配合相關參數設定我們可以隨時查閱哪位使用者執行過 sudo 指令來提升權限,並且能查出該使用者對於系統在權限提升之後執行了哪些動作,以便進行事後的追查。
首先請先使用 rpm 及 which 指令來查詢系統中是否已經安裝 sudo 套件(預設情況下會安裝此套件)以及相關指令是否存在,確認目前系統中有安裝此套件時請接著使用 visudo 指令來修改 sudo 設定檔內容。建議您不要使用 VI 或 VIM 編輯器來修改 sudo 設定檔,原因除了 visudo 指令會自行尋找 sudo 設定檔 (/etc/sudoers) 並且進入編輯模式之外,當我們修改完成後若設定檔內容中有發生語法或斷行等錯誤時,系統會在顯示警告訊息提醒我們哪裡發生語法錯誤。
在此次實作中我們會修改 sudo 設定檔內容為將 wheel 群組那行的註解符號拿掉,並且加上 Log 記錄檔的內容 (/var/log/sudo.log),當此 sudo 設定檔設定完畢後,後續只要有人執行 sudo 指令提升權限至管理者身份時便會觸發到剛才設定檔中的 Log 設定,此時系統會自動產生 Log 檔案並將相關資訊寫入其中。相關操作如下所示:
▲圖10 修改 sudo 設定檔內容及加上查核記錄設定
上述 sudo 設定檔內容中表示只要屬於 wheel 群組內的使用者帳號,便可以使用 sudo 指令來暫時提升權限為管理者帳號進行操作。當使用者第一次執行 sudo 指令時系統會再次詢問該使用者密碼,當成功通過密碼驗證 (Authentication) 之後便會暫時切換授權 (Authorization) 身份為管理者帳號 root 來執行其指令,並且在 5 分鐘之內若該使用者再次執行 sudo 指令時,系統便不會再次詢問使用者密碼。
接下來我們著手來測試剛才設定的 sudo 記錄檔機制是否正常運作,請您另外開啟一個 SSH Client 視窗並使用一般使用者帳號遠端登入 CentOS 主機。例如使用 weithenn 這個一般使用者帳號(請確定該使用者帳號已加入 wheel 群組)登入系統並嘗試執行 vipw 指令試圖修改使用者帳號設定檔內容,相信會得到權限被拒絕 (Permission denied) 的錯誤訊息回應。此時您可以使用 sudo 指令搭配剛才的 vipw 指令再次執行即可修改使用者帳號設定檔內容。
▲圖11 配合 sudo 指令修改使用者帳號設定檔
當上述指令執行完畢後您可以接著查看 sudo 記錄檔便會看到相關的記錄內容,從 sudo 記錄檔內容中我們可以確定 sudo 記錄檔機制目前正確運作中。從 sudo 記錄檔中可以清楚得知是在什麼時間點 (Jun 7 17:30:22)、哪個系統使用者帳號 (weithenn)、在哪一台主機上 (centos5)、從遠端登入此台主機 (pts/3)、在系統中哪個路徑 (/home/user/weithenn)、切換成什麼身份 (root)、執行什麼指令 (/usr/sbin/vipw)。
▲圖12 查看 sudo 記錄檔內容
確定 sudo 指令及記錄檔均正確運作後筆者習慣將 root 管理者帳號的密碼給封鎖起來,因此屆時這台主機的管理者們進行主機管理時,便會習慣使用自己的一般使用者帳號登入並配合 sudo 指令,在需要的時候才提升為管理者權限進行管理,不致一登入主機後便習慣使用 su – 來切換成為 root 管理者帳號逃避查核機制。要封鎖 root 管理者密碼請先將權限提升為 root 後,執行 vipw 指令修改 /etc/shadow 檔案,將第二個欄位(密碼欄位)內容修改為 * 即可。
YUM 套件管理工具
絕大部份的開放原始碼軟體皆採用 Tarball 的形式進行發布,而在 Linux 上為了解決使用 Tarball 必須要解壓縮、檢測 (./configure)、編譯 (make)、安裝 (make install) 等繁鎖步驟,因此發展出 RPM (The RPM Package Manager) 來簡化整個安裝流程。雖然 RPM 安裝機制簡化了整個安裝流程但卻無法解決套件相依性及套件相衝突的問題,舉例來說您可能安裝 A RPM 時系統顯示您必須要先安裝 B RPM(套件相依性),而當您下載及安裝 B RPM 時又說需要安裝 C RPM(套件相依性),當您好不容易又下載及安裝 C RPM 時卻出現此 RPM 跟 A RPM 互相衝突,碰到這種情況時在以往您只能手動排除這種套件衝突的狀況了。
YUM (Yellow dog Updater Modified) 套件管理工具便是解決上述 RPM 套件相依性及相衝突的問題而發展出來的套件管理解決方案。此套件管理工具能從指定的套件伺服器上自動下載相對應的 RPM 套件包至系統進行安裝,並且當出現套件相依性時能自動下載及安裝相關聯的 RPM 套件,同時會盡量避免發生套件衝突的情況。YUM 能夠有效簡化軟體套件安裝流程並解決惱人的套件相依性及相衝突的問題,使得軟體套件在安裝、移除、升級程序上變得非常容易。
預設 YUM 下載套件的來源伺服器為國外網站,我們可以透過修改 YUM 設定檔 (/etc/yum.repos.d/CentOS-Base.repo) 將下載套件的鏡像網站指定至台灣境內各所大學或機構。目前台灣可以使用的鏡像網站約有 8 個(如下所示),請您依個人網路狀況選擇較適合您的網路環境進行設定以便加快套件下載速度,或者參考 CentOS 鏡像網站清單選擇位於您國家內的鏡像網站:
* 元智大學:http://ftp.cse.yzu.edu.tw/pub/CentOS/
* 靜宜大學:http://ftp.cs.pu.edu.tw/Linux/CentOS/
* 中山大學:http://ftp.nsysu.edu.tw/CentOS/
* 義守大學:http://ftp.isu.edu.tw/pub/Linux/CentOS/
* 樹德科技大學:http://ftp.stu.edu.tw/Linux/CentOS/
* 台中縣教網中心:http://ftp.tcc.edu.tw/Linux/CentOS/
* Hinet IDC:http://mirror01.idc.hinet.net/CentOS/
* 國家高速網路與計算中心:http://ftp.twaren.net/Linux/CentOS/
下列操作步驟為將 YUM 設定檔中鏡像網站由預設的國外修改為國內的元智大學:
▲圖14 修改 YUM 設定檔指向至國內的元智大學
上述設定完成後您便可以開始使用 YUM 配合相關指令管理套件,但是在開始以前筆者建議您先手動更新 CentOS 的主機時間,以免後續管理相關套件時因為本機系統時間與 YUM 鏡像網站時間差異過大造成不可預期的錯誤。在後續文章中會說明如何設定 CentOS 主機自動與網際網路上的主機定時校對系統時間。
▲圖15 與網際網路 NTP 時間伺服器進行時間同步並同步至 BIOS 內
下列條列出使用 YUM 套件管理工具時常常會使用到的指令及相關參數意義:
* yum check-update:套件更新檢查,將目前系統上安裝的套件與 YUM 鏡像網站進行檢查比對後列出需要更新套件的清單。
* yum update:套件更新,檢查及比對系統需要套件更新的清單後詢問您是否要更新套件,您可以配合參數 –y 對所有詢問一律回答 yes 來允許所有套件更新。
* yum install <套件名稱>:安裝套件,執行從 YUM 鏡像網站下載指定套件並進行安裝,收集相關資訊後會詢問您是否確定要安裝,您可以配合參數 –y 對所有詢問一律回答 yes 來安裝指定套件及其相依性套件。
* yum remove <套件名稱>:移除套件,移除您指定的套件名稱,收集相關資訊後會詢問您是否確定要移除該套件,您可以配合參數 –y 對所有詢問一律回答 yes 來移除指定的套件及相依性套件。
* yum clean all:清除暫存資料,清除使用 YUM 套件管理工具下載 RPM 進行安裝時的暫存檔案。
* yum search <套件名稱或關鍵字>:搜尋套件,您可使用已經知道的套件名稱或者有關於套件的關鍵字來進行搜尋的動作。
* yum list:顯示可安裝套件清單,顯示您指定的 YUM 鏡像網站中所支援安裝的所有套件名稱。
* yum info <套件名稱>:套件資訊,顯示您指定的套件其詳細資訊,例如適用平台、套件版本、套件大小、套件功能描述、套件授權資訊、套件官方網址等資訊。
* yum grouplist:顯示可安裝的套件群組清單,顯示您指定的 YUM 鏡像網站中所支援安裝的所有套件群組名稱。
* yum groupinstall <套件群組名稱>:安裝套件群組,執行從 YUM 鏡像網站下載指定套件群組中相關套件並進行安裝,收集套件群組相關資訊後會詢問您是否確定要安裝,您可以配合參數 –y對所有詢問一律回答 yes 來安裝指定套件及其相依性套件。
* yum groupremove <套件群組名稱>:移除套件群組,移除您指定的套件群組,並且在系統收集相關資訊後,會詢問是否確定要移除該套件群組中所有套件,您可以配合參數 –y 對所有詢問一律回答 yes 來移除指定的套件群組。
* yum groupinfo <套件群組名稱>:查詢套件群組資訊,查詢指定的套件群組資訊及功能描述,並且將顯示此套件群組中預設會安裝的套件清單 (Default Packages)、強制安裝的套件清單 (Mandatory Packages)、選擇安裝的套件清單 (Optional Packages)。
由於 YUM 套件管理工具實際上也是幫助我們對 RPM 套件包進行管理的工作,其實底層的安裝、移除、升級等動作仍是使用 RPM 套件,因此我們仍可以使用 rpm 指令來幫助我們了解及管理套件,例如我們使用 YUM 套件管理工具為 CentOS 主機安裝 VNC Server 套件後我們可以使用 rpm 指令來了解剛才安裝的 VNC Server 套件、設定檔及服務啟動檔在哪裡。
▲圖16 利用 rpm 指令查詢套件版本、設定檔、服務啟動檔
結語
本文首先討論 RunLevel 啟動模式等級使讀者可以概略了解一下整個 CentOS 開機過程,相信對於後續的主機管理是有幫助的,接著說明及設定使用者登入 CentOS 主機後第一件事 Shell,筆者以設定 tcsh Shell 為例進行實作,將 Shell 環境設定好相信對於管理主機上會更加得心應手。再來則是設定 VIM 檔案編輯器設定讓您日後編輯相關設定檔更加順手。
接著我們討論到利用 sudo 套件來限制及記錄管理者所做的操作,像是誰透過 sudo 指令把權限提升為 root 管理者帳號,並且對 CentOS 主機在什麼時間點執行了什麼指令或動作,以便後續的稽核動作得以執行。並且將 root 管理者密碼封鎖以避免有管理者貪一時之便直接使用 su – 指令轉換為 root 管理者帳號權限,最後則是說明如何將 YUM 套件管理工具的套件下載鏡像網站由預設值的國外修改為國內鏡像網站以便節省套件下載時間,同時也說明常用的 yum 及 rpm 指令及其說明。
在下一篇文章中也就是 CentOS 基礎設定的最後一篇我們將會討論,當主機上線運作如何定期將系統的相關記錄例如安全性記錄、磁碟空間使用狀況、登入資訊等定期寄送給管理人員,以及探討如何對遠端登入服務 SSH 做基本的安全性設定,還有主機該如何定時自動與網際網路上的時間伺服器進行時間校對。最後則是了解系統啟動哪些服務、開啟哪些相對應的 Port 以及關閉系統上不必要的服務,最後則是安裝 RPMforge 來增加可安裝的套件數量。
[源碼專案] 坐二望一的 Linux 發行版本-Linux Mint
翁卓立/文 2011-07-06
簡介
Linux 從 1991 年正式發表至今,已經有大約二十年的發展歷史,並且逐漸成為各種計算機平台或手持裝置主流的作業系統。在這二十年之中,曾經在地球上出現過的 Linux 發行版本,其數量也有多達數十種之眾。其中有在 Linux 發展初期便已經存在的 Slackware 等版本,也有在近幾年才開始流行的新發行版本,例如 Ubuntu 等發行版本。許多人都知道,Ubuntu 這個後起之秀目前是世界上最多人使用、佔有率最高的發行版本,但如果要問排行第二的發行版本為何,大多數人多半都會猜 Fedora、Red Hat、Debian 等發行版本。畢竟這些發行版本都有一定的歷史,自然擁有較高的知名度。但根據 DistroWatch 網站的統計資料顯示,排行第二的 Linux 發行版本,其實是 Linux Mint,而非 Fedora 等較為知名的發行版本。
官方網站:http://www.linuxmint.com/
下載網址:http://ftp.oss.tw/pub/Mint/LinuxMint-ISO/stable/11/linuxmint-11-gnome-dvd-32bit.iso (866.9MB)
Linux Mint 主要使用自由軟體,除了一些特定的硬體驅動程式與廣為使用的應用程式為版權軟體以外(例如 Adobe Flash 外掛程式與 RAR 壓縮程式等等),收錄的大多數軟體都是自由軟體或開放原始碼軟體。Linux Mint 本身並不會特別限制自己所使用的軟體是否為開放原始碼軟體,也不會刻意強調所使用的軟體是自由軟體,但基本上 Linux Mint 會以收錄自由軟體為主,這是 Linux Mint 與其他大多數 Linux 發行版本較為不同之處。
▲ 圖1 Linux Mint 的操作畫面
Linux Mint 發展歷史
Linux Mint 最早的版本出現在 2006 年,當時的版本代號為 Ada,其版本編號被設定為 1.0 版。雖然是 1.0 版,但此版本被視為是 Beta 版本,且此專案在當時並沒有引起太多人的重視。有趣的是,1.0 版從未推出正式穩定版本,這可能也是軟體開發史上少見的特殊案例(採用正式版本編號,但從未發行正式版本)。Linux Mint 1.0 版基於 Kubuntu 6.06 版,預設採用 KDE 桌面管理程式。隨後基於 Ubuntu 6.10 所建立的 2.0 版 Barbara 在幾個月之後推出,並採用 GNOME 作為預設的桌面管理環境。此時,Linux Mint 引起一些 Linux 社群的注意,開始有人加以討論此一發行版本。由於 Linux Mint 相當重視社群使用者的反應,因此在 2006 年至 2008 年之間連續推出五個後續版本,分別是 2.1 版的 Bea、2.2 版的 Bianca、3.0 版的 Cassandra、3.1 版的 Celena 與 4.0 版的 Daryna。
在 Linux Mint 發行版本之中另有一個特別之處,也就是套件資料庫與軟體程式庫 (Codebase) 可能有不同的來源。例如在早期的版本,套件資料庫使用的是 Ubuntu 的 APT 套件伺服器,軟體程式庫也來自於 Ubuntu。但在後來的版本,套件資料庫仍然使用 APT 的伺服器,而軟體程式庫則沿用上一版的 Linux Mint。例如 4.0 版 (Daryna) 的軟體程式庫基於 3.1 版 (Celena),第五版 (Elyssa) 則基於 4.0 版 (Daryna) 等。大致而言,每一個 Linux Mint 版本都會使用上一版本的軟體程式庫,而套件資料庫則使用當時 Ubuntu 最新版本的套件資料庫。如此一來,Linux Mint 實際上並未真正產生分支版本,所以二個不同的版本之中,其系統核心可能幾乎完全相同,也可以確保新版本完全相容於舊版本。
從 2008 年釋出的 Linux Mint 5 (Elyssa) 開始,Linux Mint 捨棄了副版本的編號方式,所以此版本的編號為 5 而非 5.0。此時,Linux Mint 也採用了與 Ubuntu 相同的釋出時程,也就是每隔六個月便推出新版本的模式。稍後 Linux Mint 6 (Felicia) 則不再使用自己的軟體程式庫,而以最新版本的 Ubuntu 作為基底,用來打造新版本的 Linux Mint。也因為 Linux Mint 從這時候開始,都是以修改 Ubuntu 的方式釋出新版本,因此新版本的釋出時間通常落在 Ubuntu 推出新版本的一個月之後,也就是每年的五月與十一月左右。2010 年開始,Linux Mint 釋出以 Debian 為基底的版本,由於此種版本是以修改 Debian 版本而來,因此並不限定只能使用 Ubuntu 版本的套件,也不會遵循 Ubuntu 的發行週期推出新版本。因為 Debian 推出新版本的時程較長,因此 Linux Mint 的 Debian 版本,也相對的拉長推出新版本的時間。
或許是為了方便使用者區分 Linux Mint 的新舊版本,Linux Mint 的版本代號會依照 A 到 Z 的順序加以取名。例如一開始的 1.0 版為 Ada,後續的主版本之中,2.0 版稱為 Barbara、3.0 為 Cassandra、4.0 為 Daryna。之後的 Linux Mint 5 至最新的 Linux Mint 11,其代號分別是 Elyssa、Felicia、Gloria、Helena、Isadora、Julia 與 Katya。依此類推,Linux Mint 下一個版本的版本代號,將會是以 L 為開頭的單字。
▲ 圖2 Linux Mint 提供了眾多不同的版本,使用了不同的桌面管理環境
Linux Mint 的特色
每一套 Linux 發行版本都有自己的優點,Linux Mint 自然也不例外。其中最廣為人知的主要優點,在於 Linux Mint 本身提供了相當良好的可用性,以及易於安裝的特性。結合這二個主要優點,讓 Linux Mint 成為相當容易使用的一套 Linux 發行版本。即使使用者並未有任何 Linux 的使用經驗,也不會在安裝或使用上產生太大困擾。Linux Mint 本身也提供了許多不同的版本,每一個版本都使用了不同的軟體程式庫,且幾乎全部基於 Ubuntu 進行開發。
前面曾經提及 Linux Mint 主要使用自由軟體或開放原始碼軟體,但並不限制自己不使用版權軟體。至於整個發行版本所使用的主要授權模式,則採用 GNU GPL 授權,所以任何人都可以自由使用、複製 Linux Mint,也可以任意散佈、使用 Linux Mint 作為學習與程式開發的系統使用。如果行有餘力,使用者亦可提供 Linux Mint 在開發方面的技術支援,共同為 Linux Mint 的未來版本盡一份心力。
與目前大多數的 Linux 發行版本相同,Linux Mint 也使用 GNOME 作為主要的桌面管理環境,並以此版本作為主要版本 (Main Edition)。但 Linux Mint 也提供了預設使用其他桌面管理環境的版本。例如 Linux Mint 的 KDE 版本便是以 KDE 作為預設的桌面管理環境,並基於 Kubuntu 進行開發(但目前也有 KDE 版本是基於 Ubuntu 進行開發)。此外,許多人習慣使用較為簡潔的桌面管理環境,例如 Xfce、LXDE 或 Fluxbox 等,在 Linux Mint 之中亦有提供相對應的版本。像是以 Xubuntu 為基底所開發的 Linux Mint Xfce 版本,以及以 Lubuntu 為基底所開發的 Linux Mint LXDE 版本,還有 Linux Mint Fluxbox 版本等。無論使用者慣用的桌面管理環境為何,基本上都能在 Linux Mint 找到相對應的版本可以使用。其中 Linux Mint 的 GNOME、KDE 與 Xfce 版本都提供了 32 位元與 64 位元的版本,但 LXDE 與 Fluxbox 版本目前則僅提供 32 位元的版本。
Linux Mint 在 2010 年 9 月釋出了 Debian 版本,並期許此版本可以與主版本(即使用 GNOME 以 Ubuntu 為基底的版本)達到儘可能相同的地步。這個版本的推出,可以讓先前慣用 Debian 發行版本的使用者有另一種 Linux Mint 的選擇。在今年 4 月,Linux Mint 則發表了以 Debian 為基底,但採用 XFCE 作為預設桌面管理環境的版本,讓使用者擁有更多的版本選擇。
而在今年 5 月底剛推出的 Linux Mint 11(代號 Katya)版本之中,也提供了許多軟體的版本更新,並以更精緻的方式進行設計,以便讓使用者的操作環境更加舒適。Linux Mint 同時提供了 Live DVD 與 Live CD 兩種版本的安裝光碟影像檔,使用者可以依照個人習慣或需求下載合適的檔案。其中 CD 版本內建的軟體數量較少,也不提供多媒體解碼程式 (Codec) 與受限軟體(即非自由軟體)。如果有使用上的需求,亦可在安裝完成後,直接使用升級功能或安裝多媒體解碼程式,將系統升級至 DVD 版本。安裝完成後,即可擁有完整的多媒體支援能力,並且擁有額外的字型、佈景主題、LibreOffice 等各種軟體的支援,讓 Linux Mint 的安裝環境變得更加完善。
Linux Mint 11 在圖形介面方面也有許多改善,例如軟體管理員的外觀變得更加美觀,並提供了較大的軟體類別圖示。新的樣版也開始在此版本的軟體管理員之中使用,此外還提供了一個新的「字型」分類。應用程式的選擇畫面加強了視覺效果與版面排列方式,同時提供了更多資訊以便幫助使用者決定是否要安裝該軟體。而以往應用程式的圖示是從 mintinstall-icons 套件中取得,但現在也可以從系統的圖示主題中取得,所以軟體管理員可以顯示更多的圖示,無論使用者是否有安裝 mintinstall-icons 套件。軟體管理員的搜尋功能以往只搜尋套件名稱,但現在也會一併搜尋軟體說明欄位。雖然這會讓搜尋過程變得更加冗長,但可以得到較為正確的資訊。如果使用者不習慣此種搜尋方式,亦可透過修改設定值的方式,要求軟體管理員僅搜尋套件名稱。
▲ 圖3 Linux Mint 11 的軟體管理員在外觀與執行方面都採用了許多新設計
除了軟體管理員之外,更新管理員也在此版本進行許多更新,並提供了更快的執行速度。以往更新管理員要先檢查網路連線速度,再更新本身的規則,才能開始尋找更新套件。但現在只需要查看更新套件,決定每一個套件的安全性等級的規則則是內嵌於更新管理員之中,不再需要另行下載。每當有新規則產生時,便意味著有新版本的更新管理員。此時更新管理員會暫時忽略其他套件的更新動作,先完成自身版本的更新動作,並且重新啟動更新管理員。這樣的處理機制可以確保使用者在每次執行最新版本的更新管理員之際,同時使用最新的規則。
此外,更新管理員在處理相依套件的問題上也採用了新的處理方式。更新管理員發現系統上的套件有更新版本存在時,會先顯示這些更新套件的訊息,但並不顯示相依套件的相關資訊。此時若進行套件的更新動作,並且發現該套件需要額外的相依套件,系統便會顯示相關訊息,並告知使用者會安裝或移除的套件清單。如此一來,即可避免先前版本可能出現的套件相依性問題,並且讓使用者更加清楚的知道此次更新對系統所產生的影響為何。
▲ 圖4 更新管理員採用新技術,可以更快完成系統更新工作
Linux Mint 本身提供了相當多元化的桌面設定工具,可以決定整個系統的使用模式。例如在開啟 Linux Mint 終端機程式時,系統預設會顯示一小段有趣的短文。但由於並非所有人都能接受這樣的設計,因此系統有必要提供開啟或關閉這些功能的選項。以終端機開啟時的短文功能為例,使用者可從桌面設定工具中找到「終端機」項目,並決定是否開啟此功能。其他如桌面顯示的圖示、視窗外觀以及操作介面,也都能利用此工具進行設定,以便將系統的操作方式調整至最佳個人化的狀態。
▲ 圖5 桌面設定工具可以決定系統的使用模式
Linux Mint 11 還有許多不同的新功能與特色,例如提供了更新的桌面佈景主題,APT 提供 download 指令以便同時下載 deb 套件檔與其相依套件等。如果希望徹底了解 Linux Mint 11 的所有功能,或許直接在系統中安裝一套 Linux Mint 11,會是比較容易快速了解 Linux Mint 的方法。
結語
何種 Linux 發行版本比較適合初學者使用,一直是網路上爭論不休的議題之一。這個問題或許很難有一個確切的答案,但可以確定的是,Linux Mint 絕對是相當適合所有人使用的 Linux 發行版本之一。或許有人認為市場上只有第一名的產品,才能受到所有人的關注,第二名之後的產品多半不會引起太多重視。但從 Ubuntu 的歷史來看,Linux Mint 也有機會在不久的將來取得領先地位。畢竟當年 Ubuntu 也是承襲了 Debian 的優點所誕生的新發行版本,在短時間之內取得市佔率第一的成績。這樣的歷史,或許也有可能在 Linux Mint 重現。
作者簡介
翁卓立,逢甲大學資訊工程學系、台灣科技大學電子所畢業,目前擔任韌體研發工作,主要使用 Embedded Linux 進行產品開發。著有「Linux 進化特區:Ubuntu 10.04 從入門到精通」等書。
[源碼密技] 用自由軟體 Plone 來架設網站(8)一內容查詢
marr/文 2011-07-12
把內容資料儲存在系統之後,接下來的主要工作,就是依照顯示需求把它們找出來。常見的查詢條件範例,包括依照欄位屬性值查詢關鍵字詞、依照工作流程狀態篩選、依照日期屬性值排序、如果資料量龐大的話,還要考慮非同步索引,結合 AJAX 技巧,設計動態回應資料的方式,以改善系統的反應效能和操作性。
Plone 使用 ZODB 物件資料庫,屬於 NoSQL 世界的一份子,它的運作方式和傳統 SQL 資料庫不同,但透過 ZCatalog 的索引工具,ZODB 的搜尋結果可以視同 SQL 世界的表格資料,方便我們進行存取或排序的操作。本文將利用之前的 mysite.eventfolder 模組,還有新的 EEA Faceted Navigation 模組作為示範,介紹 Plone 內容查詢與顯示的技巧。
選項式欄位
之前練習建置 mysite.eventfolder 模組時,曾見過 StringField 和 DateTimeField 兩種欄位類型,而 DateTimeField 搭配的 CalendarWidget 就是一種選項式欄位,專門用來選擇日期時間的資料內容。如果要在 Archetypes 表單裡自訂選項,該完成哪些步驟呢?
首先,要決定欄位屬於單值或多值,也就是「單選」或「複選」。單值的情況比較單純,通常使用 StringField 加上 SelectionWidget 就行。以新增一個 Event Type 欄位為例,其程式碼範例如圖1 所示。
▲ 圖1 單選欄位的程式碼範例
比較特別的是 vocabulary_factory 設定項,我們指定 'event.type' 作為選項的參照名稱。慣例上,vocabulary 的參照內容定義在 content/vocabularies.zcml 和 content/vocabularies.py 兩個檔案裡,因此,我們在 content/configure.zcml 引入 vocabularies.zcml 檔案,如圖2 所示。
▲ 圖2 引入 vocabularies.zcml 的設定範例
建立詞彙表
上述 vocabulary 指的是詞彙表,也就是選項式欄位的候選內容。接著,我們要建立 vocabularies.zcml 的內容,目的是註冊詞彙表元件,如圖3 所示。
▲ 圖3 vocabularies.zcml 的範例內容
在 ZCA 元件架構裡,vocabulary 是一種 utiltiy 元件,我們日後再介紹這些進階元件的原理。不過,明顯地,範例裡註冊了一個名稱為 event.type 的元件,它的程式碼則要到同目錄裡的 vocabularies.py 檔案尋找,內容如圖4 所示。
▲ 圖4 vocabularies.py 內容範例
EventType 類別 implement 介面 IVocabularyFactory,並主動回傳 items 詞彙表內容,例如:Conference、Meeting、Training 的選項值。
測試選項欄位及詞彙表
之前介紹過 buildout.cfg 檔案裡,指定 develop = src/mysite.eventfolder 的方式,除此之外,我們也可以在 develop.cfg 檔案指定開發中的程式碼。如圖5 所示。
▲ 圖5 develop.cfg 設定範例
在 [sources] 裡指定的程式碼,等同於 develop = src/mysite.eventfolder 的結果,其中的 fs 設定值,代表在檔案系統的 src 目錄尋找原始碼,它也支援 svn 格式,用來直接存取放在 Subversion 的程式碼。
接著,執行 bin/buildout -c develop.cfg 讓設定值生效,它會安裝 plone.reload 之類的開發工具。觀察執行過程的訊息,也可以確認 mysite.eventfolder 順利被載入,如圖6 所示。
▲ 圖6 執行 buildout -c develop.cfg 訊息範例
一切順利的話,新的 Event Folder 表單的編輯內容如圖7 所示。
▲ 圖7 內含 Event Type 欄位的範例畫面
假設我們已經建立許多 Event Folder 內容,這時候就需要 EEA Faceted Navigation 模組上場了。
安裝導覽查詢模組
Plone 內建 Collection 工具,提供基本的查詢服務,原則上它是靜態的查詢結果,條件由管理員事先設定,因此,侷限使用者主動決定查詢條件的機會。
EEA Faceted Navigation 模組則提供更便利的導覽查詢功能,詳盡的設定介面,不但能讓管理員指定內容的搜尋條件,透過 AJAX 工具,還能即時反應查詢的結果,或是動態篩選查詢結果。它能完全取代 Collection 的功能,並可以整合其他多媒體模組的顯示功能。
安裝 EEA Faceted Navigation 方式很簡單,仿照上述步驟,繼續編輯 develop.cfg 內容,如圖8 所示。
▲ 圖8 安裝 eea.facetednavigation 範例
和一般模組不同之處在於,eea.facetednavigation 要填寫三個 zcml 設定值。從執行 bin/buildout -c develop.cfg 的訊息,同樣能確認模組順利被載入,如圖9 所示。
▲ 圖9 eea.facetednavigation 成功被 buildout 載入
EEA Faceted Navigation 模組需要搭配 jQuery 一併啟用,如圖10 所示。
▲ 圖10 EEA Faceted Navigation 相關模組
啟用導覽查詢選項
想要啟用導覽查詢功能,必須先選擇一個用來顯示結果的目錄,以 /events 目錄為例,在 Actions 頁籤的下拉選單,可以看到新增一個 Enable faceted navigation 選項,點選它的話,就代表要啟用,同時也讓選項值變成 Disable faceted navigation。如圖11 所示。
▲ 圖11 啟用 Faceted Navigation 的選項
順利啟用後,顯示類似圖12 所示的預設畫面。
▲ 圖12 啟用 Faceted navigation 的預設畫面
點選 Faceted criteria 頁籤,會出現 Faceted Navigation 的設定畫面,分成 Basic 和 Extended 兩個顯示區域,每個顯示區域都以九宮格形式來區隔,每個方格區塊,都能新增數個 widget 項目。如圖13 所示。
▲ 圖13 Faceted Navigation 設定畫面
所謂的 widget 是指管理搜尋條件或顯示結果的單位,慣例上,中間的方格區塊用來顯示搜尋結果,四周圍的方格區塊用來顯示搜尋條件。
右上方有 Export 和 Import 按鈕,可以匯出和匯入設定檔,它們以 XML 格式儲存。
設定導覽查詢選項
每個 widget 右上方,都有三個圖示,垃圾桶代表刪除,筆代表編輯,眼睛代表顯示或隱藏,如圖14 所示。
▲ 圖14 widget 的基本管理圖示
基本的設定項目,可以點選 widget 的筆按鈕,直接進入設定的管理介面,但是,想要存取詳盡設定項目的話,則必須點選左上方的 Disable AJAX 功能,進入表格式的管理介面,如圖15 所示。
▲ 圖15
舉例來說,想要進入 /events 目錄後,顯示站內有哪些 Event 和 Event Folder 項目,方法是編輯 Portal Type 的預設值。不過,必須取消 AJAX 功能,進入表格式管理介面後,才能找到預設值欄位,如圖16 所示。
▲ 圖16 Portal Type 的預設值畫面
儲存按鈕位於管理介面的最下方,存檔後,回到目錄畫面,可以看到 Faceted Navigation 顯示效果,它只篩選 Event 和 Event Folder 兩種型別的內容,如圖17 所示。
▲ 圖17 指定 Portal Type 的篩選結果
新增 ZCatalog 索引
假設系統已經新增數個 Event Folder 項目,分別屬於 Conference、Meeting、Training 不同類別,我們可以到 ZMI 先新增 ZCatalog 的索引,請到 /mysite/portal_catalog 點選 Indexes 頁籤,如圖18 所示。
▲ 圖18 portal_catalog 的 Indexes 頁籤畫面
從新增索引的下拉選單,點選 FieldIndex,進入 FieldIndex 的設定畫面,如圖19 所示。
▲ 圖19 FieldIndex 設定畫面
我們要為 eventType 欄位進行索引,這個欄位預設有個 accessor 讀取工具,名稱就是 getEventType,因此,我們可以指定 FieldIndex 的識別碼為 getEventType。第一次新增索引後,要記得執行 Reindex 動作,勾選 getEventType 項目後,再點選 Reindex 按鈕,如圖20 所示。
▲ 圖20 執行 getEventType 的 Reindex
完成索引動作後,進入 getEventType 項目,再點選 Browse 頁籤,可以看到索引的結果,如圖21 所示。
▲ 圖21 getEventType 的索引結果
新增導覽查詢選項
以新增一個 Checkbox widget 的查詢為例,新增畫面如圖22 所示。
▲ 圖22 新增 Checkbox widget 的畫面
新增 widget 後,進入設定值的編輯畫面,Catalog index 欄位,要選擇在 portal_catalog 裡新增的 getEventType 項目,Vocabulary 欄位要選擇 event.type 項目,這是我們在 mysite.eventfolder/content/vocabularies.zcml 註冊的詞彙表名稱,如圖23 所示。
▲ 圖23 設定 Checkbox widget 的畫面
完成 widget 新增,回到目錄畫面,可以看到 Faceted Navigation 新的顯示結果,各別勾選 Event Type 選項的話,可以篩選各別的內容項目,如圖24 所示。
▲ 圖24 Event Type 的 Faceted Navigation 畫面
結論
ZCatalog 不僅可以索引內容,也可以設定排序方式,顯示資料時,它配合 metadata 工具提供預先儲存的內容,不會造成系統資料庫的負擔。不過,一旦索引發生錯誤,系統不但運作不正常,大量資料進行重新索引時,免不了要花費許多力氣。通常,進行系統資料移植或升級時,必須執行重新索引,以確保系統資料正常無誤。
另一方面,我們也練習 EEA Faceted Navigation 模組的操作,許多設定細節,暫時留給讀者自行嘗試,雖然只是牛刀一試,相信足夠觸發許多面向的應用可能,例如 EEA 網站就搭配多媒體顯示模組,將多媒體內容的搜尋結果,直接結合 AJAX 和 FLASH 加以顯示,提昇操作便利性。更多新功能,期待下回繼續探索囉。
[接案/工作] OSSF電子報招募新血並歡迎您的投稿!
OSSF電子報團隊/文 2011-07-11
OSSF電子報長期關注國內外 Open Source 軟體的發展趨勢,多年來透過持續發報來協助國內 Open Source 專案曝光、引介重要的軟體授權知識,並傳遞實用的專案開發技巧,為了給予國人更深入精準的報導資訊,我們需要有志於此的朋友一同加入!
電子報團隊招募遠距合作新血
技術編輯
如果您對於軟體寫作的各項技術瞭若指掌,或是喜愛嘗試各種不同的新方法來進行專案開發,那麼您很可能就是我們需要的人才!技術編輯負責審核 OSSF 電子報技術類相關的文章,確定投稿文章在程式碼撰寫及設定參數上的精準性,改稿方面的稿酬將依特定文章的難易進行分級,以每字 0.5~0.7 元的標準核算。
執行編輯
如果您本身的文字邏輯精晰,並對用字遣詞具精準度,能夠捉出個別文章中的錯字、漏字,或將較難理解的段落改寫為人人看得懂的通暢文句,請儘速來應徵 OSSF電子報執行編輯!編稿、校訂文章方面的稿酬,以每字 0.3~0.35 元的標準核算。
應徵方式
◎ 郵件: ossfepaper AT openfoundry.org;負責人:林誠夏。
◎ 郵件主旨撰寫格式:【應徵電子報技術編輯/執行編輯】-中文姓名。
◎ 附加簡單自傳、基本資料(學經歷、照片、聯絡方式、最快工作日期)等資訊文件。
◎ 自傳、基本資料電子檔文件請用 ODT 或 PDF 格式寄送。
OSSF電子報歡迎各界投稿
OSSF電子報歡迎各類與自由軟體相關的主題透過本報進行曝光,不論是嵌入式、資安、雲端運算等領域的技術分享;文書、多媒體、美工排版等一般應用軟體介紹;授權法律、自由軟體政策、市場趨勢觀察等,皆非常歡迎投稿給本報與其他讀者分享。
文章投稿方面的細部資訊,亦可參照右列說明頁面:http://www.openfoundry.org/tw/contribute-now
[接案/工作] 自由軟體鑄造場 誠徵活動企劃及業務推廣專員
OSSF/文 2011-05-30
【公司名稱】中央研究院 資訊科技創新研究中心 自由軟體鑄造場
【工作職務】專任研究助理 - 活動企劃及業務推廣專員。
【徵求期限】請於7/20前投遞履歷,隨到即審,合格者將安排面試時間。
【需求人數】1 名。
【工作內容】規劃自由軟體推廣活動並維運自由軟體鑄造場業務工作。
【應徵資格】
- 學歷要求:專科以上。
- 工作經驗:不拘,但以有專案管理方面經驗者為優。
【必備條件】
- 對於自由軟體推廣具備高度熱忱與興趣。
- 精準的言語溝通能力及面對公眾演講的膽識。
- 負責任、積極吸收新知的工作態度及正向思考的個性。
- 能於晚間及週末籌辦活動,並於一般工作時間進行補休。
【加分條件】
- 對於自由軟體共工開發模式及專案管理具有基礎的了解。
- 曾有自由軟體專案開發或是社群參與經驗。
- 對網站應用及自由軟體程式撰寫具實作的能力。
- 流暢的英文溝通能力並能現場口語詢答或是檢附相關英文檢定證照。
- 符合工作必備條件並領有直轄市、縣(市)主管機關核發證明之身心障礙者。
【工作待遇】
- 依國科會標準敘薪,學士起薪三萬以上、碩士起薪三萬五以上,有工作經驗者另議。
- 郵件: [removed] <!-- var prefix = 'mailto:'; var suffix = ''; var attribs = ''; var path = 'hr' + 'ef' + '='; var addy43842 = 'rockhung' + '@'; addy43842 = addy43842 + 'citi' + '.' + 'sinica' + '.' + 'edu' + '.' + 'tw'; [removed]( '' ); [removed]( addy43842 ); [removed]( '' ); //--> [removed]rockhung@citi.sinica.edu.tw [removed] <!-- [removed]( '' ); //--> [removed]這個 E-mail 地址已經被防止灌水惡意程式保護,您需要啟用 JavaScript 才能觀看 [removed] <!-- [removed]( '' ); [removed]( 'span>' ); //--> [removed];負責人:洪華超 。
- 郵件主旨撰寫格式:【應徵活動企劃及業務推廣專員】-中文姓名。
- 附加包含自傳、基本資料(學經歷、照片、聯絡方式、最快工作日期)等文件。
- 電子檔文件請用 ODT 或 PDF 格式寄送。