Chinaunix

标题: sendmail,已做了smtp认证,但却无法防止内部员工以老板名义向外发邮件! [打印本页]

作者: yindows    时间: 2006-06-29 18:57
标题: sendmail,已做了smtp认证,但却无法防止内部员工以老板名义向外发邮件!
由于smtp协议的问题,姓名和邮件地址都可以伪造,并且由于此人在邮件服务器上有合法帐号,可以通过服务器的smtp认证,而对外发信。

但对接收邮件者来说,他只看到伪造后的发件人姓名和e-mail地址。(比如被伪造的老板e-mail地址)

这样存在了一定程度的安全隐患,大家有没有好的解决办法?

[ 本帖最后由 yindows 于 2006-6-29 18:59 编辑 ]
作者: yindows    时间: 2006-06-30 11:06
ding
作者: tanyear    时间: 2006-06-30 15:45
好的邮件服务器会检查通过验证的用户和邮件中的发件人是否吻合
作者: anthonyfeng    时间: 2006-06-30 15:57
用OA 或gpg
作者: yindows    时间: 2006-06-30 16:47
原帖由 anthonyfeng 于 2006-6-30 15:57 发表
用OA 或gpg

好象有点复杂,而且查不到什么资料
作者: yindows    时间: 2006-06-30 16:48
原帖由 tanyear 于 2006-6-30 15:45 发表
好的邮件服务器会检查通过验证的用户和邮件中的发件人是否吻合

可能自带sendmail的毕竟还不是商业软件,许多功能一般人还是无法实现吧
作者: galaxy1975    时间: 2006-07-01 02:03
postfix可以在policy中检测一下发件人和认证名是否相同
作者: anthonyfeng    时间: 2006-07-01 11:59
那如果假邮件是从其它smtp server 过来的呢? 用gpg 似乎是很不错的方法,找些商业化产品的就容易实施。

如果只是内部邮件server,限制只能用web mail,亦算方法之一吧。


原帖由 galaxy1975 于 2006-7-1 02:03 发表
postfix可以在policy中检测一下发件人和认证名是否相同

[ 本帖最后由 anthonyfeng 于 2006-7-1 12:00 编辑 ]
作者: abel    时间: 2006-07-03 11:13
就 sendmail 而言,應該是在
Local_check_mail 中比對 auth_authen (Auth username) 和 $&f  (Envelope From ) 中是否不同,
不過這個 rule 寫法我個人不是很了解,也沒有興趣了解,因為對我來說跟本用不到或有其他的替代方案,

若我需要,則會用 Sendmail + mimedefang 解法,在 filter_sender 中加

  1. sub filter_sender {
  2. # ...
  3. return ('REJECT','This is not allow for AUTH!=Sender') if (!($Sender=~ /^$SendmailMacros{'auth_authen'}\@/ ));
  4. # ...
  5. }
复制代码

我認為這是一點都不難的,解法一是用 sendmail.cf (我認為 這個才花工),一種就是用 Milter API (mimedefang ), 直覺而好用多了

[ 本帖最后由 abel 于 2006-7-3 13:05 编辑 ]
作者: yindows    时间: 2006-07-03 12:23
多谢able,我找一下相当资料试一试
作者: dragonets    时间: 2007-01-24 14:37
原帖由 abel 于 2006-7-3 11:13 发表
就 sendmail 而言,應該是在
Local_check_mail 中比對 auth_authen (Auth username) 和 $&f  (Envelope From ) 中是否不同,
不過這個 rule 寫法我個人不是很了解,也沒有興趣了解,因為對我來說跟本用不到或有 ...



少了一行语句

read_commands_file();  # 执行此句才能激活全局变量 $SendmailMacros


return ('REJECT','This is not allow for AUTH!=Sender') if (!($Sender=~ /^$SendmailMacros{'auth_authen'}\@/ ));
作者: abel    时间: 2007-01-24 14:42
原帖由 dragonets 于 2007-1-24 14:37 发表



少了一行语句

read_commands_file();  # 执行此句才能激活全局变量 $SendmailMacros


return ('REJECT','This is not allow for AUTH!=Sender') if (!($Sender=~ /^$SendmailMac ...

哈~您說的沒有錯,確實需要 read....() 才行,
因為這個動作還在 filter_sender , 所以需要  read_commands_file
作者: dragonets    时间: 2007-01-24 15:02
标题: ;)
原帖由 abel 于 2007-1-24 14:42 发表

哈~您說的沒有錯,確實需要 read....() 才行,
因為這個動作還在 filter_sender , 所以需要  read_commands_file



我还有个问题想请教一下abel,盼望能指点一二。
Sendmail 用户发内部邮件的时候,可以不经过验证就发内部邮件。
在没有验证的情况下,$SendmailMacros 的值是什么?是否为空?
作者: abel    时间: 2007-01-24 15:25
原帖由 dragonets 于 2007-1-24 15:02 发表



我还有个问题想请教一下abel,盼望能指点一二。
Sendmail 用户发内部邮件的时候,可以不经过验证就发内部邮件。
在没有验证的情况下,$SendmailMacros 的值是什么?是否为空?

{auth_type}, {auth_authen} {auth_author} 不算為空,應視為未定義
也就是可以用 來判斷
if (!defined($SendmailMacros{"auth_authen"})) {
...
}
作者: dragonets    时间: 2007-01-24 15:44
原帖由 abel 于 2007-1-24 15:25 发表

{auth_type}, {auth_authen} {auth_author} 不算為空,應視為未定義
也就是可以用 來判斷
if (!defined($SendmailMacros{"auth_authen"})) {
...
}


谢谢abel!

实验成功!

有这2句就可以确定唯一的发信者了。整理一下

sub filter_sender {
        my ($sender,$ip,$hostname,$helo)=@_;

        read_commands_file();
        # 执行此句才能激活全局变量 $SendmailMacros
        return (0,'服务器需要验证才能发信')
                      if (!defined($SendmailMacros{auth_authen}));

        return (0,'验证名和邮件地址不一致')
                      if (lc($sender) !~ /$SendmailMacros{auth_authen}\@/);

        return (1,'ok');
}

[ 本帖最后由 dragonets 于 2007-1-24 15:45 编辑 ]
作者: abel    时间: 2007-01-24 16:03
原帖由 dragonets 于 2007-1-24 15:44 发表


谢谢abel!

实验成功!

有这2句就可以确定唯一的发信者了。整理一下

sub filter_sender {
        my ($sender,$ip,$hostname,$helo)=@_;

        read_commands_file();
        # 执行此句才能激活全局变量 $Sendm ...

您應該回應英文的訊息,不然 Sendmail 會以 7bit 來處理,所以看見的會數化亂碼
作者: dragonets    时间: 2007-01-24 16:19
原帖由 abel 于 2007-1-24 16:03 发表

您應該回應英文的訊息,不然 Sendmail 會以 7bit 來處理,所以看見的會數化亂碼


这样啊,呵呵,我只是做笔记的时候写成中文了,在mail服务器上写的是英文。

这个问题我还没考虑周全,谢谢您的提醒。
作者: beerpapo    时间: 2007-01-25 09:42
可以看邮件头里面发送假冒邮件的计算机名称,但如果连计算机名也改了就没办法了
Received: from 6tkt12x ([218.19.11.230])
        (envelope-sender <xxxxx>)
        by 10.0.0.102 with ESMTP
        for <xxxx>; Tue, 23 Jan 2007 13:56:10 +0800
Date: Tue, 23 Jan 2007 13:58:16 +0800




但对接收邮件者来说,他只看到伪造后的发件人姓名和e-mail地址。(比如被伪造 ... [/quote]
作者: abel    时间: 2007-01-25 09:55
原帖由 beerpapo 于 2007-1-25 09:42 发表
可以看邮件头里面发送假冒邮件的计算机名称,但如果连计算机名也改了就没办法了
Received: from 6tkt12x ([218.19.11.230])
        (envelope-sender <xxxxx>)
        by 10.0.0.102 with ESMTP
        for <xx ...

如果我用 telnet 來送,除了 IP 外,什麼都可以假了
而且若我 auth_authen = Sender , 但 Mail Header 中的 From: 又是老板,那一般的人也很難判斷
這到底是不是老板發的了

當然,這種狀況在 sendmail + mimedefang 也是很好解的,其他的 MTA 恐怕就很難處理了
作者: dragonets    时间: 2007-01-25 10:02
原帖由 abel 于 2007-1-25 09:55 发表

如果我用 telnet 來送,除了 IP 外,什麼都可以假了
而且若我 auth_authen = Sender , 但 Mail Header 中的 From: 又是老板,那一般的人也很難判斷
這到底是不是老板發的了

當然,這種狀況在 sendmail + m ...


所有出去进来的信我在filter_end做了add_recipient("postmaster"),是否能找到是谁发的?
作者: abel    时间: 2007-01-25 10:36
原帖由 dragonets 于 2007-1-25 10:02 发表


所有出去进来的信我在filter_end做了add_recipient("postmaster"),是否能找到是谁发的?

這樣不夠自動,需要人工去判讀
作者: 枫影谁用了    时间: 2007-01-25 10:39
原帖由 abel 于 2007-1-25 09:55 发表

如果我用 telnet 來送,除了 IP 外,什麼都可以假了
而且若我 auth_authen = Sender , 但 Mail Header 中的 From: 又是老板,那一般的人也很難判斷
這到底是不是老板發的了

當然,這種狀況在 sendmail + m ...


Postfix不会!应该比Sendmail更容易.

http://blog.chinaunix.net/u/9817/showart.php?id=207355

如果采用ldap或mysql的话应该更简单.

[ 本帖最后由 枫影谁用了 于 2007-1-25 10:42 编辑 ]
作者: abel    时间: 2007-01-25 10:50
原帖由 枫影谁用了 于 2007-1-25 10:39 发表


Postfix不会!应该比Sendmail更容易.

http://blog.chinaunix.net/u/9817/showart.php?id=207355

如果采用ldap或mysql的话应该更简单.

枫兄倒不妨舉個實例看看 postfix 怎麼做 Envelope Sender 和 Header From 怎麼比對 ?


sendmail + mimedefang 非常簡單,不過就是

  1. my $header_object = $entity->head;
  2. my $header_from= $header_object->get('From', 0);
  3. return action_bounce("Envelope From != Header From") if ($header_from != ~ /$Sender/);
复制代码

作者: abel    时间: 2007-01-25 10:54
原帖由 枫影谁用了 于 2007-1-25 10:39 发表


Postfix不会!应该比Sendmail更容易.

http://blog.chinaunix.net/u/9817/showart.php?id=207355

如果采用ldap或mysql的话应该更简单.

你說的不過是
Envelope Sender 和 auth 的比對而以,和 Header From 跟本沒有關係
http://archives.neohapsis.com/archives/postfix/2005-11/0452.html
這篇也說了, postfix 尚做不到 Header 中的東西和 envelope 的比對!
當然,現在行不行或有沒有替代方法這我就不知道了
作者: 枫影谁用了    时间: 2007-01-26 07:56
原帖由 abel 于 2007-1-25 10:54 发表

你說的不過是
Envelope Sender 和 auth 的比對而以,和 Header From 跟本沒有關係
http://archives.neohapsis.com/archives/postfix/2005-11/0452.html
這篇也說了, postfix 尚做不到 Header 中 ...


abel說得極是。
作者: dragonets    时间: 2007-01-26 08:08
标题: 有点迷糊
原帖由 abel 于 2007-1-25 10:54 发表

你說的不過是
Envelope Sender 和 auth 的比對而以,和 Header From 跟本沒有關係
http://archives.neohapsis.com/archives/postfix/2005-11/0452.html
這篇也說了, postfix 尚做不到 Header 中 ...


abel,请问,您说的情况是否是这样:

一个a用户,使用a帐号通过sasl验证后,在发邮件的时候,header里面使用From b ?

一个例子:

Return-Path: <dragonetS@dragonetsss.com>
Received: from dragonet (dragonet [192.168.16.166] (may be forged))
        (authenticated bits=0)
        by dragonetsss.com (8.13.1/8.13.1) with ESMTP id l0NAQJ38007048
        for <dragonets@dragonetsss.com>; Tue, 23 Jan 2007 18:26:19 +0800
Message-ID: <000601c74052$d3629e20$a610a8c0@dragonet>
From: "test" <dragonetS@dragonetsss.com>
To: <dragonets@dragonetsss.com>
Subject:


您说的是不是红色那行?

PS:MIMEDefang中$sender 和 $Sender 有什么区别?我看了下说明,好象都是指发件者?

[ 本帖最后由 dragonets 于 2007-1-26 09:33 编辑 ]
作者: abel    时间: 2007-01-26 11:37
你用一些標準的 MTA ,在 Envelope Sender,authen,Header From 都是一樣的,
你若用 spam tools 發的信這些東西都可以不一樣,所以最好應該做到三者的一致性檢查
我的意思是其他的 MTA 應該沒有這種功能,但 sendmail+ mimedefang 可以做到三者的一致性檢查
一般只做 mail from (Envelope Sender) 和 auth 的檢查根本對 End user 是沒有意義的

紅字那些應包含
"test" <dragonetS@dragonetsss.com>
而 Sender (or sender) 則是 <dragonetS@dragonetsss.com>
所以這兩個內容要比對是否一致

Sender/sender 都是一樣的,只要慣例上用在 filter_sender/filter_repicient 用 $sender (也可以叫 ssssender),
而在 filter/filter_begin/filter_end 等都是用系統的全域變數 $Sender (不可變,系統預設)
只兩個都是一樣的
作者: dragonets    时间: 2007-01-26 14:01
标题: 谢谢回答
原帖由 abel 于 2007-1-26 11:37 发表
你用一些標準的 MTA ,在 Envelope Sender,authen,Header From 都是一樣的,
你若用 spam tools 發的信這些東西都可以不一樣,所以最好應該做到三者的一致性檢查
我的意思是其他的 MTA 應該沒有這種功能,但 sen ...


TANKS! 近来正在研究Sendmail + MIMEDefang , 确实如您说,很强大。有空还要向您多请教。

还有几个问题想请教一下:

my $header_object = $entity->head;
my $header_from= $header_object->get('From', 0);
return action_bounce("Envelope From != Header From") if ($header_from != ~ /$Sender/);

以上是否还应该在filter_sender?或者在其他function内?

return action_bounce("Envelope From != Header From") if ($header_from !~ /$Sender/);

红色部分是否应当是!~?

刚才实验了一下,在filter_sender里面加的,结果返回 try again later 错误信息了。。

代码如下:

sub filter_sender {
        my($sender,$ip,$hostname,$helo)=@_;
        if (lc($Sender) =~ /\@dragonetsss\.com\>$/i) {
                     read_commands_file();
             return (0,"this is not allow for auth!=sender") if (!(lc($sender) =~/$SendmailMacros{auth_authen}\@/));
             return (0,"smtp authentication required.") if (!defined($SendmailMacros{auth_authen}));
             my $header_object=$entity->head;
             my $header_from=$header_object->get('From',0);
             return action_bounce("Envelope From != Header From") if ($header_from !~ /$Sender/);
}

哪里出问题了呢?

[ 本帖最后由 dragonets 于 2007-1-26 14:27 编辑 ]
作者: dragonets    时间: 2007-01-27 09:37
已经成功,谢谢abel指点。

在filter_begin增加:
if ($Sender =~ /\@dragonetsss\.com/) {

my $header_object = $entity->head;
my $header_from= $header_object->get('From', 0);
return action_bounce("Envelope From != Header From") if ($header_from ! ~ /$Sender/);

}

以下为实验记录,红色部分为自己输入部分:

220 dragonetsss.com ESMTP Sendmail 8.13.1/8.13.1; Thu, 25 Jan 2007 04:32:00 +0800
helo a
250 dragonetsss.com Hello dragonet [192.168.16.166] (may be forged), pleased to meet you
auth login
334 VXNlcm5hbWU6
YWJj
334 UGFzc3dvcmQ6
YWJj
235 2.0.0 OK Authenticated
mail from:abc@dragonetsss.com
250 2.1.0 abc@dragonetsss.com... Sender ok
rcpt to:dragonets@dragonetsss.com
250 2.1.5 dragonets@dragonetsss.com... Recipient ok
data
354 Enter mail, end with "." on a line by itself
from:a@dragonetsss.com
to:a
heihei
.

554 5.7.1 ENV FROM != HEADER FROM
mail from:abc@dragonetsss.com
250 2.1.0 abc@dragonetsss.com... Sender ok
rcpt to:dragonet@dragonetsss.com
250 2.1.5 dragonet@dragonetsss.com... Recipient ok
data
354 Enter mail, end with "." on a line by itself
from:abc@dragonetsss.com
to:a
a
.

250 2.0.0 l0OKW0Od004940 Message accepted for delivery

[ 本帖最后由 dragonets 于 2007-1-27 09:40 编辑 ]
作者: abel    时间: 2007-01-29 09:20
原帖由 dragonets 于 2007-1-27 09:37 发表
已经成功,谢谢abel指点。

在filter_begin增加:
if ($Sender =~ /\@dragonetsss\.com/) {

my $header_object = $entity->head;
my $header_from= $header_object->get('From', 0);
return action ...

這種做法有一點你必需注意的是 mailling list 的問題 (aliases)
也就是若是用 mailman 或 majadomo 之類的,可能 Envelope From != Header From
避免方式就是判斷 Header List-* 之類的是否存在
作者: dragonets    时间: 2007-01-29 10:03
原帖由 abel 于 2007-1-29 09:20 发表

這種做法有一點你必需注意的是 mailling list 的問題 (aliases)
也就是若是用 mailman 或 majadomo 之類的,可能 Envelope From != Header From
避免方式就是判斷 Header List-* 之類的是否存在


谢谢提醒,我现在暂时用不到那2个。呵呵,以后有时间在研究下那2个。
作者: abel    时间: 2007-01-29 10:28
原帖由 dragonets 于 2007-1-29 10:03 发表


谢谢提醒,我现在暂时用不到那2个。呵呵,以后有时间在研究下那2个。

這無關你用不用,而是你的 user 是否有訂閱外面的 mailing list , 若這些 mailing list
使用 mailman 等,其 Sender 會不同於 header from
作者: dragonets    时间: 2007-01-29 10:44
原帖由 abel 于 2007-1-29 10:28 发表

這無關你用不用,而是你的 user 是否有訂閱外面的 mailing list , 若這些 mailing list
使用 mailman 等,其 Sender 會不同於 header from


我已经限定只是发送出去的用户,也就是本机(dragonetsss.com)用户才检查是否一致。外面邮件进来应该不受影响的。我现在对发送要求严格点,外进邮件有一个梭子鱼在挡着。
MAILMAN等我对它还不是很了解。理解错误,不要见笑;)
作者: jzcqx    时间: 2007-05-23 08:42
楼主可否将你的完整的suggested-minimum-filter-for-windows-clients文档贴出一下,我正有这方面的需求,想作为参考,谢谢!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2