我目前遇到了 exim 的问题,我正尝试让它使用 DKIM 密钥对特定域的外发电子邮件进行签名(此服务器发送多个域,但并非所有域都需要 DKIM)
当前配置如下:
dkim_canon = relaxed
dkim_selector = 20150726
dkim_domain = ${lc:${domain:$h_from:}}
dkim_private_key = ${if exists {/etc/exim/dkim/${lc:${domain:$h_from:}}-private.pem} {/etc/exim/dkim/${lc:${domain:$h_from:}}-private.pem}}
它似乎在某种意义上起作用,当发送没有密钥的域时,日志中不会出现任何内容,但是当我正在测试的一个域发送电子邮件时,以下内容会出现在 panic.log(以及 main.log)中
2020-11-06 13:30:13 1kb1oj-00031L-AY Tainted filename '/etc/exim/dkim/example.com-private.pem'
2020-11-06 13:30:13 1kb1oj-00031L-AY unable to open file for reading: /etc/exim/dkim/example.com-private.pem
文件所在的目录都具有 755 权限,并且 dkim/ 目录由用户和组 exim 拥有,文件也由 exim 拥有并具有 640 权限(尽管在测试期间我将其设置为 777 只是为了确保它不是权限问题)
我有点迷茫,因为我以前从未实施过 DKIM,有人能给出什么建议吗,或者我是否遗漏了一些显而易见的东西?
它运行的是 CentOS 7 作为底层操作系统(不确定这是否有区别)
谢谢
答案1
这是 Exim 4.94 中的新功能;来自电子邮件的任何内容都被视为潜在的“污染”。
您可以$h_from
通过在数据库或文件中查找来“消除污染”。
例如,像这样
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = ${lookup {dkim.DKIM_DOMAIN.key} dsearch,ret=full {/etc/exim4}}
dkim_private_key = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
dkim_sign_headers = Date:Message-Id:From:To:Cc:Subject:Resent-Date:Resent-From:Resent-To:Resent-Cc
dkim_selector = dkim
它依赖于dsearch
抬头:
搜寻:给定的文件必须是绝对目录路径;通过调用统计()函数。密钥不得包含任何正斜杠字符。如果统计()成功则查找也成功。结果被视为未受污染。
当找到${lookup {dkim.DKIM_DOMAIN.key} dsearch,ret=full {/etc/exim4}}
文件时,表达式将会成功。/etc/exim4/dkim.DKIM_DOMAIN.key
答案2
问题可能是您从邮件本身创建了私钥的路径。这使得该路径基于不受信任的用户输入,因此文件名被污染...问题。
为了解决这个问题,您可能需要有几个固定路径,并根据邮件决定使用哪条路径,而不是根据邮件动态创建路径。