我们遇到安全问题与我们的邮件服务器,并希望一些build议。
在我们的邮件服务器(Postfix 2.9.6 + Dovecot 2.1.7),我们希望能够创build有限的电子邮件帐户。 那些被学员使用的账户只能发送/接收来自本地域的邮件(出于安全原因,我们不希望他们能够发送或接收到其他邮件服务器的邮件)。 为了简单起见,我们为受限制的电子邮件帐户创build了一个特定的子域。
在我们的基础设施上,所有电子邮件帐户都是基于LDAP的,configuration文件包含在下面。
在后缀中,可以在文件/etc/postfix/main.cf创build限制规则,所以我们添加了规则:
check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf
到部分:
smtpd_recipient_restrictions
当然,还添加了以下几行:
smtpd_restriction_classes = local_only, insiders_only local_only = check_recipient_access ldap:/etc/postfix/ldap_virtual_domains_restrict.cf, reject insiders_only = check_sender_access ldap:/etc/postfix/ldap_virtual_domains_restrict.cf, reject
/etc/postfix/ldap_restricted_senders.cf内容是:
bind = yes bind_dn = uid=postfix,ou=service,dc=example,dc=com bind_pw = ******* server_host = ldap://127.0.0.1:389 search_base = ou=domain,dc=example,dc=com query_filter = (&(ObjectClass=DNSDomain)(dc=%s)) result_attribute = description
当域名被允许在外面发送电子邮件时,这返回“ok”。
/etc/postfix/ldap_restricted_recipients.cf内容是:
bind = yes bind_dn = uid=postfix,ou=service,dc=example,dc=com bind_pw = ****** server_host = ldap://127.0.0.1:389 search_base = ou=domain,dc=example,dc=com query_filter = (&(description=local_only)(dc=%s)) result_attribute = description result_filter = insiders_only
当域只能被本地域访问时,这将返回“insiders_only”。
/etc/postfix/ldap_virtual_domains_restrict.cf内容是:
bind = yes bind_dn = uid=postfix,ou=service,dc=example,dc=com bind_pw = ****** server_host = ldap://127.0.0.1:389 search_base = ou=domain,dc=example,dc=com query_filter = (&(ObjectClass=dNSDomain)(dc=%s)) result_attribute = dc result_filter = OK
当域是本地的时候,这个返回“OK”(可以发送电子邮件到受限制的子域)。
为了更精确,后缀smtpd_recipient_restrictions部分包含:
smtpd_recipient_restrictions = permit_mynetworks, reject_sender_login_mismatch check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf permit_sasl_authenticated, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, check_policy_service unix:private/policy-spf
这可以很好地工作,从子域的所有电子邮件只能发送到其他本地域的电子邮件,只能接收来自本地域的电子邮件。
但…
由于我们启用了这个function,我们注意到人们可以使用邮件服务器发送垃圾邮件(所以我们暂时将其删除)。
我们注意到这个问题,因为日志文件/var/log/mail.log包含如下的行:
Jul 22 11:59:24 mail postfix/qmgr[366]: F342F42AE4: from=<[email protected]>, size=2171, nrcpt=11 (queue active) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<iraci@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<hugocesar_007@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<reginadanielian@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<thais_jp@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<tropicalfmcomerciais@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<valeria.x@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<veloso1071@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<termopiso@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<rafaelpm84@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/smtp[382]: 1344D42ACC: to=<vanessyca@*******>, relay=127.0.0.1[127.0.0.1]:10024, delay=1197348, delays=1197334/12/0.17/2.2, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as F342F42AE4) Jul 22 11:59:24 mail postfix/qmgr[366]: 1344D42ACC: removed
由于我们设置的限制只匹配域名(对于发件人)某人正在使用我们的服务器作为中继与电子邮件发件人伪造匹配[email protected],并将被接受。
我们将改变设置,使规则匹配整个电子邮件,而不是我们不确定它会防止欺骗。
你怎么看待这件事? 我们做错了什么? 还有其他方式(或function)有这样的限制吗?
PS:如果需要,我们可以发布更多信息
由于我们设置的限制只匹配域名(对于发件人),有人使用我们的服务器作为中继与电子邮件发件人伪造匹配[email protected],并将被接受。
是的,这是由smtpd_recipient_restrictions的这个限制引起的
check_sender_access ldap:/etc/postfix/ldap_restricted_senders.cf
您上面说过,当发件人允许发送外发电子邮件时,此查询将返回“确定”。 这意味着后缀将允许电子邮件和绕过它下面的限制
check_recipient_access ldap:/etc/postfix/ldap_restricted_recipients.cf permit_sasl_authenticated, reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname, check_policy_service unix:private/policy-spf
也许解决方法是用“DUNNO”replace“OK”查询结果。 这两个参数之间的差异是,
另见man 5访问 。
确定接受匹配模式的地址等。
DUNNO假装没有find查找键。 这可以防止Postfix尝试查找关键字的子string(例如子域名或networking地址子网)。
Postfix 2.0和更高版本提供此function。
对于实施类似限制的人来说:
这只有在创build了额外文件的情况下才能正常工作,例如/etc/postfix/ldap_virtual_domains_restrict_access.cf其中包含以下内容
bind = yes bind_dn = uid=postfix,ou=service,dc=example,dc=com bind_pw = xxxxxx server_host = ldap://127.0.0.1:389 search_base = ou=domain,dc=example,dc=com query_filter = (&(ObjectClass=dNSDomain)(dc=%s)) result_attribute = dc result_filter = dunno result_format = OK
然后,在文件/etc/postfix/main.cf中将行更改为:
local_only = check_recipient_access ldap:/etc/postfix/ldap_virtual_domains_restrict_access.cf, reject insiders_only = check_sender_access ldap:/etc/postfix/ldap_virtual_domains_restrict_access.cf, reject
这样,请求function工作正常! 否则,当匹配“local_only”或“insiders_only”时,如果ldap查询的结果是“DUNNO”,则发送者或接收者被拒绝(在请求下一个规则为“拒绝”之后)。
结果为“DUNNO”时result_format = OK ,那么ldap请求的结果是“OK”。
希望这可以帮助别人