自由軟體鑄造場電子報選輯

以開源碼 dansguardian+tinyproxy 實作色情守門員

作者:老薯條,2010 年 12 月投稿。

前言

相信每個父母都曾有這樣的經驗:小孩子躱在房裏通宵達旦的衝浪。您會很好奇,到底是什麼樣的網站可以讓人這麼無怨無悔,廢寢忘食。而在網路犯罪事件層出不 窮的今日,更會擔心自己的心肝寶貝因涉世未深,而無法拒絕網路上的誘惑,甚至發生無法彌補的遺憾。因此,坊間有一些 ISP 業者提供如「色情守門員」服務來過濾不當的網頁。對岸前一陣子鬧的沸沸揚揚的「綠霸」事件(規定新出廠的電腦上要預先安裝過濾軟體,以過濾不當的網頁,後 因安全性問題而暫緩實施),均是基於保護未成年人的立場,以避免受到不當網頁的危害。因此,一套可過濾不當網頁的解決方案,會是每個父母心目中完美的軟 體。在本篇文章中,筆者將以開源碼社群中的解決方案來實作一個過濾不當網頁的系統。我們希望系統能達到下列的功能。

  • 可設定客戶端 (client) 用戶不能瀏覽那些網站,即所謂的 URL 過濾。
  • 可設定客戶端 (client) 用戶不能瀏覽內容含有某些關鍵字(如情色 SEX)的網站。即所謂的關鍵字過濾。
  • 限制客戶端 (client) 用戶不能下載某些類型的檔案(如不允許ppt pdf 類型的檔案等等)。

所需軟體如下表所示:

軟體 說明 官方網址
Fedora 11 作業系統 http://fedoraproject.org/
Tinyprox proxy 伺服器 ,與 dansguardian 結合來實作網頁過濾的功能 https://banu.com/tinyproxy/
dansguardian 內容過濾軟體,與 tinyproxy 配合來完成網頁過濾的功能 http://dansguardian.org/

說明2

一般而言,要完成網頁過濾的功能,通常需要 http proxy(代理伺服器)的支援。

以下先行說明快取伺服器 (proxy) 的原理及型式。快取伺服器 (proxy) 是一種中介者程式,介於使用者與 internet 間;擔任使用者與 internet 間的中介層。當使用者欲連線到外部網站時,將會先查詢 proxy 是否有相關的資訊,如果有相關的資訊,則會直接從 proxy 下載相關資訊(因此每種通訊協定均會有相對應的 proxy,如 HTTP 即為 http proxy,本文中的 tinyproxy即為一種 http proxy)。反之,即先由 proxy 伺服器至外部網站取得相關資訊,再由使用者經由 proxy 取回資訊,如圖 1 所示:
▲圖 1

如果依 proxy 的型式來區分,可分為正向快取式 (forward caching) 及反向快取 (reverse caching)。正向快取式即是一般的運用模式(由內(內部使用者)向外 (internet) ),如圖 2 所示:
▲圖 2

當內部使用者想存取外部 internet 的網站時,會先詢問上述的正向快取伺服器 (forward caching) 是否有相關的資訊,如果正向快取伺服器 (forward caching) 有儲存相關的資訊,即直接至正向快取伺服器 (forward caching) 內存取而無需實際至外部的網頁伺服器存取網頁,來增快網頁存取的時間(這也是為什麼正向快取伺服器 (forward caching) 常用來增快網頁存取時間的原因)。反之,如果正向快取伺服器 (forward caching) 無相關的資訊,即由正向快取伺服器 (forward caching) 至外部的網頁伺服器取得相關資訊後,再提供給內部使用者查詢(這也是為什麼正向快取伺服器 (forward caching) 又被稱為代理程式的原因,因為都是由正向快取伺服器 (forward caching) 代理使用者來存取外部的網頁伺服器)。接下來說明反向式的快取伺服器(reverse caching),反向式的快取伺服器則是要服務外部使用者存取內部網頁伺服器(即外 (internet) 對內(內部的服務主機))。反向式的快取伺服器 (reverse caching) 會先暫存內部服務主機的相關資料,當外部使用者欲存取內部服務主機的資料時,會先至快取伺服器 (reverse caching) 上存取,一旦快取伺服器 (reverse caching) 沒有相關資料,才至內部實際提供服務的主機上存取。如圖 3 所示:
▲圖 3

通常反向式的快取伺服器 (reverse caching) 可以用於防火牆之外,當作外部使用者的內容伺服器(使用者並不會真正的接觸到實際服務的伺服器,而是透過反向式的快取伺服器 (reverse caching) 來存取),以避免有人在未受監視的情況下,從外部來直接存取伺服器的資料。另外,從負載平衡 (load balance) 的角度來看,由於反向快取伺服器 (reverse caching) 可與服務伺服器的資料同步,因此,我們可以思考可在高流量的服務器前架設多台的反向式的快取伺服器 (reverse caching),來分散過高的使用流量,以實現負載平衡的功能。

由上述說明,我們可以得知不論是正向快取伺服器 (forward caching) 或反向快取伺服器 (reverse caching) 都具有快取 (cache) 的功能,所以常被用來網頁加速用。但從另一角度來看,由於往來的網頁資訊均會存在快取伺服器 (proxy)。所以,如果要檢查往來的 HTTP 資訊是否有惡意的病毒,我們可以在快取伺服器 (proxy) 上再架構一層過濾機制(即為dansguardian),即可實作網頁過濾的任務。整體架構如圖 4 所示:
▲圖 4

使用者瀏覽網頁流程如下:

1. 使用者開啟瀏覽器 proxy 功能,以 IE 為例,請設定【工具】→【網際網路選項】→「連線」→「區域網路設定」,如圖 5 :

](http://www.openfoundry.org/images/101214/dansguardtiny/dansguardtiny05.png "Original Resolution - 370x306px")
▲圖 5 設定 proxy server 的 IP 位址及埠為 8080

2. 使用者將要求瀏覽網站的 http 要求送往 proxy(在本例中為tinyproxy)

3. tinyproxy 再將 http 要求送往過濾軟體(在本例中為dansguardian)依據設定的過濾條件來判別是否欲瀏覽的網頁為不當網頁,若是則阻擋使用者瀏覽該網頁,否則使用者即可正常的瀏覽該網頁。 接下來我們來說明如何安裝相關軟體

  • 安裝 tinyproxy
  • 請至 tinyproxy 官方取得最新版本(筆者所取得的版本為 1.8.2),解開後執行./configure --prefix=/usr/local/tinyproxy && make && make Install,將 tinyproxy 裝到 /usr/local/tinyproxy 目錄上。 接下來即需設定 /usr/local/tinyproxy/etc/tinyproxy.conf 設定檔,新增如下一列 Port 3128 #設定 tinyproxy 運作在 3128 埠 Allow 140.xxx.xxx.xxx/24 # 表允許那些網段的主機可使用此 proxy 伺服器, 最後以 /usr/local/tinyproxy/sbin/tinyproxy & 執行即可。

  • 安裝 dansguardian

  • 利用 yum install dansguardian* 安裝即可 修改 /etc/dansguardian/dansguardian.conf 設定檔,如下: language = 'chinesebig5' #設定顯示訊息的語系 filterport = 8080 #設定 dansguardian 運作埠 proxyip = 127.0.0.1 #設定 proxy 伺服器的所在位址 即 squid 運作的主機,在本例中由於與 dansguardian 在同一台機器上,所以可設為本機 proxyport = 3128 #設定 proxy 伺服器的運作埠,即 tinyproxy 的運作埠,預設為 3128

4. 設定完成後,利用 /etc/init.d/dansguardian start 即可啟動 dansguardian

可利用 netstat –an | grep 8080 查看主機上是否已開啟 8080 埠,如下圖
▲圖 6 此時需重新設定 IE 的 proxy 設定,如上步驟:但埠需改為 8080(dansguardian 的服務埠)

如下圖所示:


▲圖 7 dansguardian 主要是利用檔案來設定限制瀏覽網頁的規則,由於我們只想要達到下列功能:

  • 禁止瀏覽某些網站
  • 禁止瀏覽含有某些關鍵字的網頁
  • 禁止下載某些類型的檔案

因此本文中僅會介紹相關的設定檔,其餘相關設定檔就留待有興趣的讀者自行研究了。相關設定檔(位於 /etc/dansguardian/lists/ 目錄下)列表如下:

檔名 意義
bannedsitelist 可在此檔案中寫入欲限制瀏覽的網站,如不想讓使用者瀏覽 www.example.com,即將 www.example.com 寫入此檔即可
bannediplist 同 bannedsitelist,不過將以IP的型式取代網址型式
bannedphraselist 可在此檔案設定關鍵字,一旦網頁出現關鍵字,即限制瀏覽網頁。如設定“情色”,一旦網頁含有此類關鍵字即限制瀏覽。
bannedextensionlist 限制下載檔案的類型,如要讓使用者不能下載 exe 的執行檔,可將 .exe 寫入檔案,即可限制使用者下載 .exe 的執行檔
Bannedurllist 以 URL 方式限制瀏覽網頁,如只要限制瀏覽 www.example.com/news/ 。可將www.example.com/news寫入此檔,如此,僅限制不能瀏覽 www.example.com/news 網頁,但可瀏覽 www.example.com 其它的網頁
Exceptionsitelist 設定網站名稱,只要連線到這些網站,即不受其它 dansguardian 規則的限制,如設定 www.example.com 即表示連線到 www.example.com 即不受其它 dansguardian 規則的限制
Exceptioniplist 設定不受 dansguardian 規則限制的來源 IP,可將不願受 dansguardian 限制的IP設於此,如此 dansguardian 對其而言僅為 proxy 的功能,而無任何的過濾功能
Exceptionphraselist 設定關鍵字,只要連線的網頁含有此類關鍵字,即不受其它 dansguardian 規則的限制

一般我們在設定相關規定時,總想要加上限制時間,如<朝九晚五的上班時間中才要套用相關的規則>,所以 dansguardian 也很貼心的提供了時間參數的設定 時間參數格式如下所示:

 time: <start hour> <start minute><end hour><end minute> <days>
 <start hour>:開始時間(時)
 <start minute>:開始時間(分)
 <end hour>:結束時間(時)
 <end minute>:結束時間(分)
 <days>:0-6 星期一至星期天

如設定規則僅在星期一至星期五早上 8:00 至下午 5:00 生效則可設定如下 8 0 17 0 01234 如沒有設定時間參數,即表示該規則為全日生效,接下來,我們將來示範如何相關功能

1. URL過濾功能 以 vulscan.wynetech.com.tw 網站為例。限制使用者不能瀏覽該網站。

  • 確定使用的瀏覽器已開啟 proxy,並設定 proxy 埠為 8080
  • 將 vulscan.wynetech.com.tw 寫入 bannedsitelist 檔案中
  • 重新啟動 dansguardian /etc/init.d/dansguardian start
  • 當瀏覽器瀏覽 vulscan.wynetech.com.tw 即會出現如下圖示,而無法瀏覽該網頁


▲圖 8

2. 關鍵字過濾(限定使用者不能瀏覽含有關鍵字的網頁,在此以關鍵字「情色」為例)。

  • 確定使用的瀏覽器已開啟 proxy,並設定 proxy 埠為 8080
  • 將「情色」寫入 bannedphraselist 檔案,後再重新啟動 dansguardian
  • 關鍵字設法分為下列型式:
  • <關鍵字>:需完全符合關鍵字(如<sex>即網頁有 sex 關鍵字即符合)
  • < 關鍵字 >:網頁的字串中含有該關鍵字即符合,如< sex >即表示網頁有 sexual 字串即符合
  • <關鍵字1>,<關鍵字2>.. :網頁資訊中需同時含有關鍵字 1 與關鍵字 2...即符合


▲圖 9

3. 限制使用者能夠下載的檔案類型,在本例中將禁止使用者下載 ppt 檔。

▲圖 10