RSPAMD + DKIM 签名:如何对多个域使用单个 DKIM 密钥?

RSPAMD + DKIM 签名:如何对多个域使用单个 DKIM 密钥?

我能够使用 OPENDKIM 的 KeyTables 和 SigningTable 为多个域设置单个 DKIM 密钥。但自从公司开始使用 RSPAMD 以来,我就不能再同时使用 OPENDKIM 和 RSPAMD 了,而是需要使用 RSPAMD 的 DKIM 签名模块。

说来话长,但我最终遇到了这种情况,我需要为其他公司品牌域名设置单个 DKIM 密钥。通常,我会在 OPENDKIM 中执行此操作:

*@maincorp.com mail._domainkey.maincorp.com
*@brand1.com mail._domainkey.maincorp.com
*@brand2.com mail._domainkey.maincorp.com

但是,如何在 RSPAMD DKIM 签名中做到这一点?我浏览并使用 RSPAMD 文档尝试了几种方法,但都没有成功。是否可以像在 OPENDKIM 中一样,在 RSPAMD 中为多个域 DKIM 签名使用单个 DKIM 密钥?

请注意,到目前为止,我的试用情况如下:

到目前为止,1 对 1 方案(即对不同域使用不同 DKIM 密钥的 DKIM 签名)是可行的。但我需要 1 对 N 方案,即多个域使用 1 个 DKIM 密钥。

备注:

  1. 我明白,我可以为每个品牌域名添加指向 maincorp.com _domainkey 的 CNAME 记录。但是,每个品牌域名都是在另一个国家域名注册商处注册的,我无法立即访问它(这将是一个相当漫长的官僚程序),因此这不太可能。
  2. 我一直在使用 Opendkim 和 Spamassassin,并将此事指定为 1 号,运行良好,但现在 Spamassassin 已被 RSPAMD 取代,并且 Opendkim 不再使用。

谢谢你,

托马斯

供您参考,这是我在 local.d/dkim_signing.conf 中的 DKIM 签名配置:

我的local.d/dkim_signing.conf:

enabled = true;

If false, messages with empty envelope from are not signed
allow_envfrom_empty = true;

# If true, envelope/header domain mismatch is ignored
allow_hdrfrom_mismatch = false;

# If true, multiple from headers are allowed (but only first is used)
allow_hdrfrom_multiple = false;

# If true, username does not need to contain matching domain
allow_username_mismatch = true;

# If false, messages from authenticated users are not selected for signing
auth_only = true;

# Default path to key, can include '$domain' and '$selector' variables
#path = "/etc/opendkim/userkeys/$domain/$selector.private";
path = "/etc/opendkim/keys/mailcorp.com/mail.private";

# Default selector to use
#selector = "default";
selector = "mail";

# If false, messages from local networks are not selected for signing
sign_local = true;

# Map file of IP addresses/subnets to consider for signing
# sign_networks = "/some/file"; # or url
# Symbol to add when message is signed
symbol = "DKIM_SIGNED";

# Whether to fallback to global config
try_fallback = false;
selector_map = "/etc/rspamd/dkim_selectors.map";
path_map = "/etc/rspamd/dkim_paths.map";

# Domain to use for DKIM signing: can be "header" (MIME From), "envelope" (SMTP From) or "auth" (SMTP username)
use_domain = "header";

# Domain to use for DKIM signing when sender is in sign_networks ("header"/"envelope"/"auth")
use_domain_sign_networks = "header";

# Domain to use for DKIM signing when sender is a local IP ("header"/"envelope"/"auth")
use_domain_sign_local = "header";

# Whether to normalise domains to eSLD
use_esld = false;

# Whether to get keys from Redis
# Not using redis, keys coming from files in /etc/opendkim
use_redis = false;

# Hash for DKIM keys in Redis
key_prefix = "DKIM_KEYS";

我的 /etc/rspamd/dkim_selectors.map:

maincorp.com mail
brand1.com mail
brand2.com mail

还有我的 /etc/rspamd/dkim_paths.map:

maincorp.com /etc/opendkim/keys/mancorp.com/mail.private
brand1.com /etc/opendkim/keys/mancorp.com/mail.private
brand2.com /etc/opendkim/keys/mancorp.com/mail.private

在 local.d/dkim_signing.conf 使用上述配置,结果如下:

  • 当电子邮件从 @mailcorp.com 发送时,它没有问题,DKIM 将被签名。为什么?因为在 DNS mailcorp.com 上它有 _domainkey。
  • 但是,当从 @brand1.com 和 @brand2.com 发送电子邮件时,DKIM 将不会被签名,除非我在 brand1.com 和 brand2.com 中添加 CNAME 记录,而我第一次并不想这样做。

需要做什么(主要目标),使用上述配置尚未实现,我需要您的帮助:

目标是能够为 brand1.com 和 brand2.com 签名已在 maincorp.com 中的 TXT 记录中实现的现有单个 DKIM 密钥,而无需在每个 brand1.com 和 brand2.com DNS 面板中添加 CNAME 或 TXT 记录 _domainkey。

对于 maincorp.com,它已经可以正常工作,因为它在 DNS 面板中具有 mail._domainkey.maincorp.com 的 TXT 记录。但对于 brand1.com 和 brand2.com,它不起作用。

请帮忙...

更新时间:2019 年 4 月 9 日:

我发现我需要的这个功能不幸尚未被 RSPAMD 支持,至少在提出这个问题时是这样。好吧,希望他们能启用它。

因此,现在,我只需要向 brand1.com 和 brand2.com 添加 CNAME 记录,这样 DKIM 就会有效且已签名 :(。

非常感谢您的耐心和帮助!祝您有美好的一天!

答案1

为了让遇到相同问题的人更容易理解。下面是一个如何使用密钥和签名表的示例,如上文评论中所述,以便您可以对每个来自域进行签名,并使用来自您的域的选择器,而不是来自域的选择器:

key_table = [ 
  "maincorp.com maincorp.com:dkim:/var/lib/rspamd/dkim/dkim.key"
];
signing_table = [ 
  "*@maincorp.com maincorp.com",
  "*@brand1.com maincorp.com",
  "*@brand2.com maincorp.com"
];

或者只对每个域名进行签名

signing_table = [ 
  "* maincorp.com",
];

这将产生以下 dkim 签名:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=maincorp.com;
    s=dkim; t=[...];
    h=from:from:reply-to:subject:subject:date:date:message-id:message-id:to:
     cc; bh=[...];
    b=[...]

官方 rspamd dkim_signing 文档

相关内容