關於本報

自由軟體鑄造場電子報
報主:中央研究院資創中心
創刊日期:2004-06-03
發報頻率:雙週刊
訂閱人數:3,349
官網:

近期電子報


訂閱便利貼


將貼紙語法置入您的網站或部落格當中, 訪客可以輸入mail取得認證信,並按下確認連結後, 快速訂閱您的報紙。
預覽圖
訂閱自由軟體鑄造場電子報報
自由軟體鑄造場電子報
-----------------------------------------------------------------------------------------------------
Plurk FaceBook Twitter 收進你的MyShare個人書籤 MyShare
  顯示內嵌語法

自由軟體鑄造場電子報
發報時間: 2011-07-13 11:00:00 / 報主:OSSF
[公益聯播]捐款芳名錄
本期目錄
[技術專欄] 以 Paros 掃描 Web 程式漏洞
[源碼快訊] 維基百科台灣社群夏聚暨寫作教學營-邀你一起貢獻知識
[技術專欄] CentOS 基礎設定(中)
[源碼密技] 用自由軟體 Plone 來架設網站(8)一內容查詢
[源碼專案] 坐二望一的 Linux 發行版本-Linux Mint
[接案/工作] 自由軟體鑄造場 誠徵活動企劃及業務推廣專員
[接案/工作] OSSF電子報招募新血並歡迎您的投稿!
報主的話
[技術專欄] 以 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 安全問題的根源)應運而生。動態網頁運作流程如下圖所示:

[技術專欄] 以 Paros 掃描 Web 程式漏洞
▲ 圖1

使用者將「參數」(如上圖中的帳號及密碼)傳遞至網頁伺服器上後,與相對應的網頁程式互動,再由網頁程式根據參數至資料庫擷取相關資訊,動態組成 HTML 內容再回傳至使用者的瀏覽器上。

動態網頁大大地擴展 Web 的應用,使得電子商務變得可行。但也因此衍生出不少安全的漏洞。在說明相關 Web 漏洞前,將說明 Web 的幾個重要觀念如下段。

 

參數的傳遞


動態網頁需藉由使用者傳遞參數(如登入作業,使用者需傳遞帳號/密碼等資訊來驗證)的內容來執行相關的動作,Web 參數的傳遞定義了下列兩種的傳遞方式。

GET:
此種方式是將參數接在 URL 後,直接傳遞給網頁程式,如下例:

[技術專欄] 以 Paros 掃描 Web 程式漏洞
▲ 圖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),通過認證後方可往下執行相關功能。

[技術專欄] 以 Paros 掃描 Web 程式漏洞
▲ 圖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 表示密碼參數):

[技術專欄] 以 Paros 掃描 Web 程式漏洞
▲ 圖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 預設服務的埠)正在運作即表示啟動成功,如下圖示)。

[技術專欄] 以 Paros 掃描 Web 程式漏洞
▲圖5 Paros 運行在 8080 埠

2.調整瀏覽器,以 IE8 為例(設定瀏覽器欲使用 proxy,點選【工具】→【網際網路選項】→【連線】→【區域網路設定】如下圖示)。

[技術專欄] 以 Paros 掃描 Web 程式漏洞
▲圖6 設定瀏覽器使用 8080 埠的 proxy

3.利用瀏覽器瀏覽欲偵測的網站(此時在 Paros 上的<site>區域上即會出現所瀏覽網站的 URL)。

4.利用<spider>功能將該網站的所有 URL 資訊捉進來。

[技術專欄] 以 Paros 掃描 Web 程式漏洞
▲ 圖7       

5.利用 "scan all" 來掃描所有的 URL 網頁,掃描完成後即會產生掃描報表。

6.利用 REPORT 功能查看掃描結果報表(如下圖示)

[技術專欄] 以 Paros 掃描 Web 程式漏洞
▲ 圖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:

[技術專欄] CentOS 基礎設定(中)
▲圖1 修改 RunLevel 設定檔

那要如何得知目前所在的 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 圖形管理介面。

[技術專欄] CentOS 基礎設定(中)
▲圖2 查詢 RunLevel 3 所啟用的服務

[技術專欄] CentOS 基礎設定(中)
▲圖3 設定 smartd 服務於 RunLevel 3、5 啟用並查看狀態

[技術專欄] CentOS 基礎設定(中)
▲圖4 ntsysv 互動設定視窗

[技術專欄] CentOS 基礎設定(中)
▲圖5 system-config-services 圖形管理介面

常常會有 Linux 初學者詢問,若希望有程式或動作想要在系統開機時,如何自動啟動某些服務或執行某個動作,那該如何達成呢?您可以將相關執行動作寫入至 /etc/rc.local 設定檔內即可。或許您會有疑問為何寫入此檔案的內容會在開機時自動執行,您可以查看 RunLevel 3、5 的執行資料夾裡面有 S99local 的連結檔案,其內容便是連結指向至 /etc/rc.local 檔案,而在 RunLevel 資料夾中 S 開頭表示啟動 (Satrted) 而 K 表示關閉 (Killed),而數字 99 為啟動順序(數字愈小愈先啟動),這也就是為何寫入 /etc/rc.local 檔案中的內容會在開機時被執行的原因。

[技術專欄] CentOS 基礎設定(中)
▲圖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 的個人環境設定檔內容:

[技術專欄] CentOS 基礎設定(中)
▲圖7 查詢使用者帳號所使用的 Shell 及 tcsh Shell 個人環境設定檔內容

設定 VIM 編輯器操作環境


VI (Visual Interface) 為 Unix-Like 預設內建的檔案編輯器,然而此編輯器對於 Linux 初學者來說比較容易感覺到使用不易。CentOS 作業系統預設會安裝較容易使用而且功能更為強大的檔案編輯器 VIM (Vi Imitation) ,建議 Linux 初學者可以使用此編輯器進行檔案編修,相信可以較為順手。與 tcsh Shell 相同的觀念,VIM 檔案編輯器預設功能雖然已經很強大,但是您仍可以依需求加上相關參數設定使得 VIM 編輯器更為強大更為貼近您的使用需求。以下為筆者個人習慣設定的 VIM 參數設定值:

[技術專欄] CentOS 基礎設定(中)
▲圖8 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) 並且進入編輯模式之外,當我們修改完成後若設定檔內容中有發生語法或斷行等錯誤時,系統會在顯示警告訊息提醒我們哪裡發生語法錯誤。

[技術專欄] CentOS 基礎設定(中)
▲圖9 查詢系統是否安裝 sudo 套件及相關指令

在此次實作中我們會修改 sudo 設定檔內容為將 wheel 群組那行的註解符號拿掉,並且加上 Log 記錄檔的內容 (/var/log/sudo.log),當此 sudo 設定檔設定完畢後,後續只要有人執行 sudo 指令提升權限至管理者身份時便會觸發到剛才設定檔中的 Log 設定,此時系統會自動產生 Log 檔案並將相關資訊寫入其中。相關操作如下所示:

[技術專欄] CentOS 基礎設定(中)
▲圖10 修改 sudo 設定檔內容及加上查核記錄設定


上述 sudo 設定檔內容中表示只要屬於 wheel 群組內的使用者帳號,便可以使用 sudo 指令來暫時提升權限為管理者帳號進行操作。當使用者第一次執行 sudo 指令時系統會再次詢問該使用者密碼,當成功通過密碼驗證 (Authentication) 之後便會暫時切換授權 (Authorization) 身份為管理者帳號 root 來執行其指令,並且在 5 分鐘之內若該使用者再次執行 sudo 指令時,系統便不會再次詢問使用者密碼。

接下來我們著手來測試剛才設定的 sudo 記錄檔機制是否正常運作,請您另外開啟一個 SSH Client 視窗並使用一般使用者帳號遠端登入 CentOS 主機。例如使用 weithenn 這個一般使用者帳號(請確定該使用者帳號已加入 wheel 群組)登入系統並嘗試執行 vipw 指令試圖修改使用者帳號設定檔內容,相信會得到權限被拒絕 (Permission denied) 的錯誤訊息回應。此時您可以使用 sudo 指令搭配剛才的 vipw 指令再次執行即可修改使用者帳號設定檔內容。

[技術專欄] CentOS 基礎設定(中)
▲圖11 配合 sudo 指令修改使用者帳號設定檔

當上述指令執行完畢後您可以接著查看 sudo 記錄檔便會看到相關的記錄內容,從 sudo 記錄檔內容中我們可以確定 sudo 記錄檔機制目前正確運作中。從 sudo 記錄檔中可以清楚得知是在什麼時間點 (Jun  7 17:30:22)、哪個系統使用者帳號 (weithenn)、在哪一台主機上 (centos5)、從遠端登入此台主機 (pts/3)、在系統中哪個路徑 (/home/user/weithenn)、切換成什麼身份 (root)、執行什麼指令 (/usr/sbin/vipw)。

[技術專欄] CentOS 基礎設定(中)
▲圖12 查看 sudo 記錄檔內容

確定 sudo 指令及記錄檔均正確運作後筆者習慣將 root 管理者帳號的密碼給封鎖起來,因此屆時這台主機的管理者們進行主機管理時,便會習慣使用自己的一般使用者帳號登入並配合 sudo 指令,在需要的時候才提升為管理者權限進行管理,不致一登入主機後便習慣使用 su – 來切換成為 root 管理者帳號逃避查核機制。要封鎖 root 管理者密碼請先將權限提升為 root 後,執行 vipw 指令修改 /etc/shadow 檔案,將第二個欄位(密碼欄位)內容修改為 * 即可。

[技術專欄] CentOS 基礎設定(中)
▲圖13 封鎖 root 管理者帳號的密碼

 

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 設定檔中鏡像網站由預設的國外修改為國內的元智大學:

[技術專欄] CentOS 基礎設定(中)
▲圖14 修改 YUM 設定檔指向至國內的元智大學

上述設定完成後您便可以開始使用 YUM 配合相關指令管理套件,但是在開始以前筆者建議您先手動更新 CentOS 的主機時間,以免後續管理相關套件時因為本機系統時間與 YUM 鏡像網站時間差異過大造成不可預期的錯誤。在後續文章中會說明如何設定 CentOS 主機自動與網際網路上的主機定時校對系統時間。

[技術專欄] 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 套件、設定檔及服務啟動檔在哪裡。

[技術專欄] CentOS 基礎設定(中)
▲圖16 利用 rpm 指令查詢套件版本、設定檔、服務啟動檔

結語


本文首先討論 RunLevel 啟動模式等級使讀者可以概略了解一下整個 CentOS 開機過程,相信對於後續的主機管理是有幫助的,接著說明及設定使用者登入 CentOS 主機後第一件事 Shell,筆者以設定 tcsh Shell 為例進行實作,將 Shell 環境設定好相信對於管理主機上會更加得心應手。再來則是設定 VIM 檔案編輯器設定讓您日後編輯相關設定檔更加順手。

接著我們討論到利用 sudo 套件來限制及記錄管理者所做的操作,像是誰透過 sudo 指令把權限提升為 root 管理者帳號,並且對 CentOS 主機在什麼時間點執行了什麼指令或動作,以便後續的稽核動作得以執行。並且將 root 管理者密碼封鎖以避免有管理者貪一時之便直接使用 su – 指令轉換為 root 管理者帳號權限,最後則是說明如何將 YUM 套件管理工具的套件下載鏡像網站由預設值的國外修改為國內鏡像網站以便節省套件下載時間,同時也說明常用的 yum 及 rpm 指令及其說明。

在下一篇文章中也就是 CentOS 基礎設定的最後一篇我們將會討論,當主機上線運作如何定期將系統的相關記錄例如安全性記錄、磁碟空間使用狀況、登入資訊等定期寄送給管理人員,以及探討如何對遠端登入服務 SSH 做基本的安全性設定,還有主機該如何定時自動與網際網路上的時間伺服器進行時間校對。最後則是了解系統啟動哪些服務、開啟哪些相對應的 Port 以及關閉系統上不必要的服務,最後則是安裝 RPMforge 來增加可安裝的套件數量。

[源碼密技] 用自由軟體 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 criteri

轉寄『第 176 期 以 Paros 掃描 Web 程式漏洞』這期電子報

寄信人暱稱  寄信人email
收信人暱稱  收信人email

  • 社群留言
  • 留言報主