squid 代理伺服器下載檔案掃毒設定
最後更新日期 2005/08/11
上次更新日期:2005/05/18
使用系統linux FC3
使用軟體:
squid
squidguard
viralator
clamav
#經過設定後只有動態url(將特殊符號?+&=均轉為/路徑的表示法)無法正確判斷及轉port下載(要看代理伺服器是否開放該port)

我 假設你已經設好了FC3及squid,clamav ,以下是設定的重點是squidguard及viralator,其它軟體請自行下載安裝
#預設全部安裝於一台機器上,因此主機名稱或IP是相同的

如果squid.conf中設定好了使用squidguard之後,在squid啟動時會一併啟動預設五個squidguard的行程
當使用者的瀏覽器啟動時並使用該squid為代理伺服器,當每一個連線要求時會產生下面的流程
browser(送出url要求)->squid(轉送url)->squidguard(如果合乎某條件則變更urls, 否則傳回空白行\ n給squid)
squidguard只是提供url的檢查,並不掃描的其內容,因此可以將不好的url擋掉
當有人要下載檔案通常url最後接著檔名,因此我們使用正規表示法來取出合乎的檔案類型,作病毒的掃描
一般的作法:
正常上網
url->squidguard(檢查有問題的url)->squidguard.cgi (包含url等相關參數)
正常下載
url->squidguard(檢查含下載的url)->viralator.cgi(包含url參數)


squidguard 有rpm版本請自dag網站下載
安裝完成後
主要有三個檔
/etc/squid/squidguard.conf  (設定檔)
/var/www/cbi-bin/squidguard.cgi(不會自動安裝,稍後手動安裝)
/usr/bin/squidguard     (程式檔)

設定
在/etc/squid/squid.conf 檔案最後加入一行(若有說明在說明後加入一行)
redirector_program /usr/bin/squidguard -c /etc/squid/squidguard.conf
將/usr/share/doc/squidguard-x.x.x/中的squidGuard.simple.cgi 或squidGuard.cgi擇一當成你的預設CGI
複製到/var/www/html/cgi-bin
注意squidguard.cgi的權限

squidguard網站下載別人設好的黑名單,下載完畢後解壓縮到/var/lib/squidguard/blacklists
其中有許多類別以下僅設定porn(色情網站)
我的範例如下:
色情網站不可以上,如果有.com/.exe/.zip使用viralator來掃毒,如果有影音檔限制下載

dbnmae /var/lib/squidguard
logdir /var/log/squidguard
# 定義時間
# abbrev for weekdays:
# s = sun, m = mon, t =tue, w = wed, h = thu, f = fri, a = sat
time workhours {
    weekly mtwhf 09:00 - 18:30
}

#
# 定義來源IP模組
#
source admin {
    ip        192.168.0.32
}
source local_lan {
    ip        192.168.0.1-192.168.0.31
    ip        192.168.0.33-192.168.0.48
}

#目的模組
destination exe_file {
    expressionlist        exe_file
        log virus.log
        redirect http://主機名稱或IP/cgi-bin/viralator.cgi?url=%u
}

destination medium {
    expressionlist    block_medium
           
}
#定義色情網站黑名單
destination bl_porn {
       domainlist blacklists/porn/domains
       urllist    blacklists/porn/urls
       expressionlist blacklists/porn/expressions
       log anonymous porn.log
}

#定義存取控制
#
acl {
    admin {
                pass !bl_porn !exe_file any
                redirect http://主機名稱或IP/cgi-bin/squidguard.cgi?url=%u  & amp; amp; amp; amp; amp; amp; amp; nbsp;      
    }
    local_lan within workhours {
               redirect http://主機名稱或IP/cgi-bin/squidguard.cgi?url=%u
               pass !bl_porn !medium !exe_file any
    } else {
               pass !bl_porn !exe_file any
    }
    default {
              pass !bl_porn !medium !exe_file any
        redirect http://主機名稱或IP/cgi-bin/squidguard.cgi?url=%u
     }
}
*注意如果squidguard.conf設定有錯時squidguard會進入緊急模式,並將pass所有的url(squidguard沒有作用)
#在定義dest時redirect可以寫在該定義中
#squidguard.cgi可傳的參數,我是參考該程式的內容
clientaddr=%a
&clientgroup=%s
&targetclass=%t
&url=%u
&srcclass=%s
&clientname=%n
#url的網頁路徑及參數是以?為大分隔符號,後使用=來指是參數,而&是一個以上參數的分隔符號
在/var/lib/squidguard/下建立一個新檔
exe_file
內容是
(\.exe$|\.com$|\.bat$|\.zip$)


安裝viralator
下載完後
cd varalator
mv  /etc/viralator etc
mv viralator.cgi /var/www/cgi-bin
md /var/www/html/viralator
mv *.png /var/www/html/viralator
請注意權限問題(一般我都改為使用者為apache ,並有x的權限)
在/etc/viralator/viralator.conf是設定檔
因預設是使用clamav所以不用更改防毒程式的基本設定,但clamdscan/clamscan的路徑,
如果你沒有使用clamd服務,掃描程式請改用clamscan

請變更下面四個參數,你必須建立/var/www/html/viralator 並給予適當的權限
當需要下載檔案時:
檔案會下載到這個路徑,掃毒並提供一個網頁給使用者正真下載http://主機名稱或IP/viralator/檔案名稱
#檔下載的路徑
downloads -> /var/www/html/viralator
#網頁下載的相對網頁的路徑
downloadsdir -> /viralator
#進度尺標的圖檔所在,相對網頁的路徑
BAR-> /varalator/bar.png
#進度圖檔所在,相對網頁的路徑
PROGRESS->/varalator/progress.png
重新讀取squid.conf
squid -k reconfigure  

問 題
  1. 如何中文化?
    squidguard有兩個範例,你可以自己修改squidguard.cgi檔中關於html的部份
    viralator則在/etc/viralator/languages/english.txt複製一個檔案.例如: chinese.txt 將內容中文化,另在/var/www/cgi-bin/viralator.cgi內尋找所有的$ viralator->header在括 號內加入引號內的字",-Charset=Big5"
  2. 測試?
    在修改過squidguard的設定,規則檔之後,請使用下面的命令來測試
    echo "測試目標的URL 要連線的IP - GET" | /usr/bin/squidguard -c 測試的設定檔 -d
  3. 下載檔案url因?&+%所產生無效問題(最近的資訊請 參考5)?
    有一些url使用參數來下載檔案,因此該類url不會轉向 viralator.cgi
    做法:在/etc/squid中建立一個 noredirect檔案內容
    \&
    \=
    \?
    \%
    "&"
    "="
    "?"
    "%"
    &
    =
    ?
    %
    要squid當url含有上述的符號不轉給squidguard(也就不轉到viralator)
    在/etc/squid.conf檔案最後加入(其中all 是acl的ip src也就是所有區網內可以上網的ip)
    acl noredirect url_regex "/etc/squid/noredirect"
    redirector_access deny noredirect
    redirector_access allow all 
  4. Apache url rewrite(url 問題)
    雖然上述解決了部份問題,但apache有一個網址重寫功能(url rewritering )使用mod_rewrite模組,會將所有的參數轉為路徑,因此如果是下載檔案可能有找不到該檔案,找尋viralator的群組討論,有提到使用 mime 來觸發,但目前還有看到新版,而不是使用url
  5. viralator.cgi進入一個迴圈
    因為下載頁重導到viralator.cgi 當下載完畢後會產生一個本地下載的網頁,因此造成該網頁再次重導到viralator.cgi,你必須略過重導含有本地檔案url
    例如:
    http://abc.com.tw/a.com
    -> http://my_redirect_server/viralator.cgi?url=http://abc.com.tw/a.com
    ->http://my_redirect_server/viralator/a.com
    查看第三行後會重導為第二行,loop 因此產生,我們有兩種作法來解決這個問題
    1. 在網頁瀏覽器,加入該網站ip直接連線不經代理伺服器
    2. 修改squid.conf
    在上述redirector_access deny noredirect 之前加入
    redirector_access deny
    在本行之前加入
    acl lan_proxy url_regex -i http://重導到viralator.cgi的IP
    修改完的squid.conf
    acl noredirect url_regex "/etc/squid/noredirect"
    acl lan_proxy  url_regex -i http://重導到viralator.cgi的IP
    redirector_access deny lan_proxy
    redirector_access deny noredirect
    redirector_access allow all
  6. 下載檔案url因?&+%所產生無效問題,另 解?
    這 是我想的很久才解出來的,因為對perl的正規表示法不是很懂, 雖然試出來但也可能有錯
    在上述3我使用一個檔來存要掃描的檔案正規表示法
    (\.exe$|\.com$|\.bat$|\.zip$),變更如下
    ^([^&+=?%])+(\.exe$|\.com$|\.bat$|\.zip$),也就會略過網址中含有 &+=?,其 中%開頭代表有url編碼,而結尾是檔名.exe.com.bat.zip你也可以加入其它相關的檔名(doc,xls...),
    因此不需要上述4的noredirect的相關設定
  7. 這是修正6的,你可以看一下項目3的nodirect項目有使用\及不使用 \,後來測試一下可能是正規表示法在此的小bug,在不同的轉換中可能有上述兩種情況,因此我們必須兩個都指定^[^&+=?\&\+\ =\?]+(\.exe$|\.com$|\.bat$|\.zip$)這前面是負向表列,我們可以使用正向表列[a-zA-Z0-9\/.-\\\/ \.\-]+(\.exe$|\.com$|\.bat$|\.zip$)
  8. url含port,viralator無法下載?
    有一些url如右:http://abc.com.tw:8080/..../a.doc ,viralator.cgi好像不能下載,可能需要略過有:的url 
  9. 將viralator.cgi 改寫為php ?
    太久程式碼沒有動了而且也不合乎要求......................如何下載含有?=&:,首先要找一個可以下載檔案功能 的程式 (比wget還要強,可以自動判別動態url).