作者 主題: [問題]擾人的spam  (閱讀 6184 次)

0 會員 與 1 訪客 正在閱讀本文。

apollo627

  • 可愛的小學生
  • *
  • 文章數: 10
    • 檢視個人資料
[問題]擾人的spam
« 於: 2008-03-09 19:42 »
想請問..以類似防火牆,封鎖全部郵件,只開放白名單的方式,是否能有效防堵垃圾郵件?
有試了一下公司的MailBox,Sendmail+Spamassassin的系統,
Spamassassin的學習機制已經有7千筆,只能擋住一滴滴..哀..
我試著把它設定規則,黑名單拒絕全部(ex: *),白名單開放特定網域(ex: *@gmail.com)
但黑名單的權力好像大過白名單,先處理黑名單再來是白名單..
就變成先拒絕掉全部信件了..
想請問有人用這種方法防制垃圾郵件的嗎?效果怎麼樣?用的是什麼系統?

damon

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 4227
    • 檢視個人資料
    • http://blog.damon.tw/
回覆: [問題]擾人的spam
« 回覆 #1 於: 2008-03-09 23:10 »
你覺得附你薪水的老闆會同意這樣做的話再來討論吧

oreo

  • 憂鬱的高中生
  • ***
  • 文章數: 94
    • 檢視個人資料
    • 餅乾的家
回覆: [問題]擾人的spam
« 回覆 #2 於: 2008-03-09 23:37 »
建議還是找一下ANTI SPAM的方案好了
目前內容過濾式的已經到達一個瓶頸,只要是使用貝式分析的都是會被客戶罵到爆炸
不該檔的擋了,沒檔到的一狗票,也不是說貝式分析不好,只是覺得應該不是用在這種方面
關鍵字太容易造成誤判,灰色地帶太大,提供給您做參考

當然連線防禦這一段你可以做的,就先做一些,垃圾會少一點,方法精華區很多

timxn

  • 懷疑的國中生
  • **
  • 文章數: 72
    • 檢視個人資料
    • 睿碼資訊
回覆: [問題]擾人的spam
« 回覆 #3 於: 2008-03-10 11:42 »
內容過濾誤判較高,用通信行為去做正確率很高.

例如:
1.graylist 夜間開啟.
2.假冒你公司網域.
3.判斷Header date:時間,早2+天,晚30+都是spam.

像這種以行為去判斷spam的誤判率幾乎是0.

例如:以時間來判斷,當使用者的電腦時間不正確時.
早了2天,當他寄信給你時,mta判斷時間早2天,拒收信件(reject),同時使用者也會收到退信通知,知道因為時間不對被退.
因mta queue信,晚了30天以後才寄到的信,對你來說也不會有什麼商業價值,即使是你朋友寄的,這種誤判也沒關係,且mta queue了30天的機率也接近0,大多數的mta queue信也不會超過30天.

« 上次編輯: 2008-03-10 11:45 由 timxn »

apollo627

  • 可愛的小學生
  • *
  • 文章數: 10
    • 檢視個人資料
回覆: [問題]擾人的spam
« 回覆 #4 於: 2008-03-10 12:19 »
回 Damon 大大
我覺得方案要先確認可不可行和做些研究之後,再來跟老闆討論,
這樣他問的技術問題也好回答,如果都還不知道狀況,
老闆也都依你,後來發現做不到,那之前的提案也是白說了XD

oreo

  • 憂鬱的高中生
  • ***
  • 文章數: 94
    • 檢視個人資料
    • 餅乾的家
回覆: [問題]擾人的spam
« 回覆 #5 於: 2008-03-10 14:18 »
timxn 說的真對,給您拍拍手,表達的好清楚,最近上班太忙了,沒空仔細的寫這一塊,光VM板上的就寫不完了

我覺得連線方式的確認以及更深入比較信件來源的分析方式才是合理的anti-spam方案

EX:
垃圾信同時發信給很多人,卻用程式假造某些部份,但是某些部分又很雷同,同一個ip來源的信在1分鐘內換了100次DOMAIN(舉例)
這不是垃圾信的機率太低了,用這樣的方式來判斷,準確度就高多了

thomasho

  • 憂鬱的高中生
  • ***
  • 文章數: 132
    • 檢視個人資料
回覆: [問題]擾人的spam
« 回覆 #6 於: 2008-03-10 17:58 »
3.判斷Header date:時間,早2+天,晚30+都是spam.

例如:以時間來判斷,當使用者的電腦時間不正確時.
早了2天,當他寄信給你時,mta判斷時間早2天,拒收信件(reject),同時使用者也會收到退信通知,知道因為時間不對被退.
因mta queue信,晚了30天以後才寄到的信,對你來說也不會有什麼商業價值,即使是你朋友寄的,這種誤判也沒關係,且mta queue了30天的機率也接近0,大多數的mta queue信也不會超過30天.


timxn兄,您這方法真的不錯........小弟想請教您,如果在postfix+mailscanner+spamassasin的環境下,要如何達成這樣的檢查功能?

pippeng

  • 活潑的大學生
  • ***
  • 文章數: 329
  • 性別: 男
    • 檢視個人資料
    • IT Ranger
回覆: [問題]擾人的spam
« 回覆 #7 於: 2008-03-11 00:57 »
for Mailscanner
以下為Spamassassin的Rules,請將他加在/etc/MailScanner/spam.assassin.prefs.conf
時間自己改一改吧
太晚了沒空測試DATE_IN_FUTURE正確設定方式

header  Invalid Date: header (not RFC 2822)  INVALID_DATE  0.042 0 0 0 
header  Invalid Date: header (timezone does not exist)  INVALID_DATE_TZ_ABSURD  1.746 1.737 1.749 1.779 
header  Invalid Date: year begins with zero  DATE_YEAR_ZERO_FIRST  2.900 0 2.800 0 
header  Date: is 3 to 6 hours before Received: date  DATE_IN_PAST_03_06  0.322 0.680 0.753 0.419 
header  Date: is 6 to 12 hours before Received: date  DATE_IN_PAST_06_12  0.800 0.599 1.363 0.650 
header  Date: is 12 to 24 hours before Received: date  DATE_IN_PAST_12_24  0.756 0.385 1.364 0.746 
header  Date: is 24 to 48 hours before Received: date  DATE_IN_PAST_24_48  1
header  Date: is 48 to 96 hours before Received: date  DATE_IN_PAST_48_96  1
header  Date: is 96 hours or more before Received: date  DATE_IN_PAST_96_XX  1.781 1.238 2.165 1.534 
header  Date: is 3 to 6 hours after Received: date  DATE_IN_FUTURE_03_06  2.904 2.834 0.753 1.931 
header  Date: is 6 to 12 hours after Received: date  DATE_IN_FUTURE_06_12  1.609 1.946 1.559 1.973 
header  Date: is 12 to 24 hours after Received: date  DATE_IN_FUTURE_12_24  1.754 1.953 2.216 3.332 
header  Date: is 24 to 48 hours after Received: date  DATE_IN_FUTURE_24_48  2.730 2.796 2.567 2.546 
header  Date: is 48 to 96 hours after Received: date  DATE_IN_FUTURE_48_96  1
header  Date: is 96 hours or more after Received: date  DATE_IN_FUTURE_96_XX  2.486 2.370 2.071 2.599 

« 上次編輯: 2008-03-11 01:13 由 pippeng »
用心用心再用心

paulso

  • 俺是博士!
  • *****
  • 文章數: 1966
    • 檢視個人資料
回覆: [問題]擾人的spam
« 回覆 #8 於: 2008-03-11 14:23 »
分享一下我公司的設定

原本已經有使用 spamassass + rbl, razor 來擋
再加上會 upload spam 的樣本給 spamassassin 去學
一天擋 8萬個 spam

最近加了 sender verification, 擋 spam 的數目小了一半以上
就是說 >50% spam 都是使用一些假的 address 來 send
但 sender verification 有些缺點的, 使用前請參看官網

timxn

  • 懷疑的國中生
  • **
  • 文章數: 72
    • 檢視個人資料
    • 睿碼資訊
回覆: [問題]擾人的spam
« 回覆 #9 於: 2008-03-11 18:16 »
3.判斷Header date:時間,早2+天,晚30+都是spam.

就這個功能,postfix我不會,我使用sendmail.

做法好幾種,
1 .直接改sendmail的source code.
2.設計sendmail的規則集。
3.使用milter去實作。

以下介紹用sendmail的規則集去做,以hook1隻check_date的程式的方式,可能你們比較看得懂sendmail的規則集。
如不用check_date程式也是可以直接用sendmail規則集去做,但規則集會有點雜。

我是用c寫,用其它程式如perl寫也是可以,但用perl較浪費系統資源。
直接patch到 sendmail的soruce code好像較有效率。

將以下程式 compile:
gcc check_date.c -o check_date
copy 到 /etc/mail/program/  or /etc/mail/

設定sendmail.mc,在檔案最下方加入以下設定:
代碼: [選擇]
LOCAL_CONFIG
Kcheck_date program /etc/mail/program/check_date
HDate: $>mycheck_date
LOCAL_RULESETS
Smycheck_date
R$*                     $: $1 $| $(check_date $1 $)
R$*$|nopass             $#error $@ 5.7.1 $:Reject for nopass Date.
R$*$|error              $#error $@ 5.7.1 $:Reject for error Date.
R$*$|NoData             $#error $@ 5.7.1 $:Reject for No Date.
注意規則中間空白是tab鍵。

m4 sendmail.mc > sendmail.cf
 重新啟動sendmail。

測試程式例:
./check_date "Thu,11 Mar 2008 16:09:42+0800"

check_date.c
代碼: [選擇]
/* check_date for anti-spam program of sendmail.
 * if day > 2 days or < 30 days, sendmail will reject to sender.
 * compile this program :
 * gcc check_date.c -o check_date
 * than,copy check_date to /etc/mail/program/
 * For setting sendmail.cf :
 * config sendmail.mc file,add the following:

   LOCAL_CONFIG
   Kcheck_date program /etc/mail/program/check_date
   HDate: $>mycheck_date
   LOCAL_RULESETS
   Smycheck_date
   R$*                     $: $1 $| $(check_date $1 $)
   R$*                     $: $(syslog Date:$1 $) $1
   R$*$|nopass             $#error $@ 5.7.1 $:Reject for nopass Date.
   R$*$|error              $#error $@ 5.7.1 $:Reject for error Date.
   R$*$|NoData             $#error $@ 5.7.1 $:Reject for No Date.

 * m4 sendmail.mc > sendmail.cf
 * restart sendmail
*/

#include <stdio.h>
#include <regex.h>
#include <strings.h>
#include <time.h>
#include <stdlib.h>

#define nmatch  4

int get_month(char *data,int leapyear)
{
if(!strcasecmp(data,"Jan")) return 0;
if(!strcasecmp(data,"Feb")) return 31;
if(!strcasecmp(data,"Mar")) return 59+leapyear;
if(!strcasecmp(data,"Apr")) return 90+leapyear;
if(!strcasecmp(data,"May")) return 120+leapyear;
if(!strcasecmp(data,"Jun")) return 151+leapyear;
if(!strcasecmp(data,"Jul")) return 181+leapyear;
if(!strcasecmp(data,"Aug")) return 212+leapyear;
if(!strcasecmp(data,"Sep")) return 243+leapyear;
if(!strcasecmp(data,"Oct")) return 273+leapyear;
if(!strcasecmp(data,"Nov")) return 304+leapyear;
if(!strcasecmp(data,"Dec")) return 334+leapyear;
return 0;
}

int main(int argc,char *argv[])
{
// char *string = argv[1];
if(argc < 2)
{
printf("NoData");
return;
}
time_t timep;
struct tm *p;
time(&timep);
p = localtime(&timep);
/* tm_yday 0-365,first day is 0 */
int days1 = 365*(1900+p->tm_year)+p->tm_yday+1;
char data[4];
bzero(data,4);
char month_data[4];
bzero(month_data,4);
int year,day = 0;
int days2;
int leapyear = 0;
regex_t preg;
// Thu,13 Mar 2008 16:09:42+0800
char *regex = "^.*[^0-9][0]*([0-9]+)[^[:alnum:]]+([^0-9][^0-9][^0-9])[^[:alnum:]]+([0-9][0-9][0-9][0-9])[^[:alnum:]]+[0-9]";
regmatch_t pmatch[nmatch];
unsigned int i,n,len;
bzero(&preg,sizeof(regex_t));
if(regcomp(&preg,regex,REG_EXTENDED) == 0)
{
if(regexec(&preg,argv[1],nmatch,pmatch,0) == 0)
{
for(i=0;i<nmatch;i++)
{
if(pmatch[i].rm_so == -1 ) continue;
len = (pmatch[i].rm_eo-pmatch[i].rm_so);
if(i == 1)
{
for(n=0;n<len;n++)
data[n] = *(argv[1] + pmatch[i].rm_so + n);
day = atoi(data);
bzero(data,4);
}
if(i == 2)
{
for(n=0;n<len;n++)
month_data[n] = *(argv[1] + pmatch[i].rm_so + n);
}
if(i == 3)
{
for(n=0;n<len;n++)
data[n] = *(argv[1] + pmatch[i].rm_so + n);
year = atoi(data);
if(year % 4 == 0)
leapyear = 1;
bzero(data,4);
}
}
}
regfree(&preg);
}
// printf("day,month,year=%d,%s,%d\n",day,month_data,year);
days2 = year*365 + get_month(month_data,leapyear) + day ;
/* print error,nopass or pass for sendmail map rule */
if(day == 0)
{
printf("error");
exit(0);
}
if((days1 - days2) > 30 || (days2 - days1) > 1)
printf("nopass");
else
printf("pass");
exit(0);
}









« 上次編輯: 2008-03-12 23:19 由 timxn »

apollo627

  • 可愛的小學生
  • *
  • 文章數: 10
    • 檢視個人資料
回覆: [問題]擾人的spam
« 回覆 #10 於: 2008-03-12 17:21 »
十分感謝,趕快來參考看看!