Для работы потребуется, что бы Exim был собран с поддержкой SPF/DKIM. Для Debian это означает установку пакета exim4-daemon-heavy.
SPF
Добавляем в DNS такие записи (предпочтительнее):
mydomain.ru. IN TXT "v=spf1 a mx ~all"
а если позволяет DNS, то такую:
mydomain.ru. IN SPF "v=spf1 a mx ~all"
Для проверки того, что запись добавилась и работает, её нужно проверить через spfquery:
# dig -t spf mydomain.ru +short
"v=spf1 +a +mx ~all"
# apt-get install libspf2-2 libmail-spf-perl spf-tools-perl
# spfquery --ip 1.1.1.1 --mail-from a@mydomain.ru --helo mydomain.ru
softfail
mydomain.ru: Sender is not authorized by default to use 'mydomain.ru' in 'helo' identity, however domain is not currently prepared for false failures (mechanism '~all' matched)
mydomain.ru: Sender is not authorized by default to use 'mydomain.ru' in 'helo' identity, however domain is not currently prepared for false failures (mechanism '~all' matched)
Received-SPF: softfail (mydomain.ru: Sender is not authorized by default to use 'mydomain.ru' in 'helo' identity, however domain is not currently prepared for false failures (mechanism '~all' matched)) receiver=mydomain.ru; identity=helo; helo=mydomain.ru; client-ip=1.1.1.1
# spfquery --ip XX.XX.XX.XX --mail-from a@mydomain.ru --helo mydomain.ru
pass
mydomain.ru: XX.XX.XX.XX is authorized to use 'mydomain.ru' in 'helo' identity (mechanism 'a' matched)
mydomain.ru: XX.XX.XX.XX is authorized to use 'mydomain.ru' in 'helo' identity (mechanism 'a' matched)
Received-SPF: pass (mydomain.ru: XX.XX.XX.XX is authorized to use 'mydomain.ru' in 'helo' identity (mechanism 'a' matched)) receiver=mydomain.ru; identity=helo; helo=mydomain.ru; client-ip=XX.XX.XX.XX
Где XX.XX.XX.XX – это один был IN A в DNS для домена mydomain.ru
Примечание.
Некоторые почтовые сервера (например, gmail) в заголовки специально добавляют информацию об SPF:
spf=pass (google.com: domain of user@domain.ru designates XX.XX.XX.XX as permitted sender) smtp.mail=user@domain.ru
Настроим демон spfd.
Для запуска пишем такой init-скрипт:
#!/bin/sh
USER=Debian-exim
GROUP=mail
SOCK=/var/run/spfd/spfd.sock
PID=/var/run/spfd/spfd.pid
SPFD=/usr/sbin/spfd
DESC="SPF Daemon"
ARGS="-path=${SOCK} -setuser=${USER} -setgroup=${GROUP} -pathuser=${USER} -pathgroup=${GROUP}"
case "$1" in
start)
echo -n "Starting $DESC:"
start-stop-daemon --start --quiet --background --make-pidfile \
--pidfile ${PID} \
--exec ${SPFD} -- ${ARGS}
echo "."
;;
stop)
echo -n "Stopping $DESC:"
start-stop-daemon --stop --quiet --oknodo --signal 9 --pidfile "${PID}"
rm -f $SOCK $PID
echo "."
;;
restart|force-reload)
/etc/init.d/spfd stop
/etc/init.d/spfd start
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac
exit 0
# update-rc.d spfd defaults
Для проверки exim’ом SPF-записей, добавляем такое:
begin acl
spf_rcpt_acl:
# Check envelope sender
warn set acl_m8 = $sender_address
deny !acl = spf_check
warn message = Received-SPF: $acl_m8 ($acl_m7)
accept
spf_from_acl:
# Check header From:
warn set acl_m8 = ${address:$h_from:}
deny !acl = spf_check
warn message = Received-SPF: $acl_m8 ($acl_m7)
accept
spf_check:
warn set acl_m9 = ${readsocket{/var/run/spfd/spfd.sock}\
{ip=$sender_host_address\n\
helo=${if def:sender_helo_name\
{$sender_helo_name}{NOHELO}}\
\nsender=$acl_m8\n\n}{20s}{\n}{socket failure}}
# Defer on socket error
defer condition = ${if eq{$acl_m9}{socket failure}{yes}{no}}
message = Cannot connect to spfd
# Prepare answer and get results
warn set acl_m9 = ${sg{$acl_m9}{\N=(.*)\n\N}{=\"\$1\" }}
set acl_m8 = ${extract{result}{$acl_m9}{$value}{unknown}}
set acl_m7 = ${extract{header_comment}{$acl_m9}{$value}{}}
# Check for fail
deny condition = ${if eq{$acl_m8}{fail}{yes}{no}}
message = ${extract{smtp_comment}{$acl_m9}{$value}{}}
log_message = Not authorized by SPF
accept
acl_check_mail:
accept authenticated = *
deny message = $sender_host_address is not allowed to send mail from $sender_address_domain
!acl = spf_rcpt_acl
hosts = !+relay_from_hosts
accept
acl_check_data:
deny senders = :
!acl = spf_from_acl
accept
DKIM
Генерируем приватный ключ:
$ openssl genrsa -out /usr/local/etc/exim/dkim/mydomain.ru.key 1024
Generating RSA private key, 1024 bit long modulus
...++++++
.....................................................................++++++
e is 65537 (0x10001)
Теперь публичный:
$ openssl rsa -in /usr/local/etc/exim/dkim/mydomain.ru.key -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYw9Ddhod6jZZkp0S0lf4I/j57
G8DnW5HDoKHDr0OwmbOhg0QOefHIpfrhBCrTK08dAvvvFnXs5/g1i9YU2ZDHE1uB
pSrtm33ZBAC9tUneqTM6J4PYAHKs1hOchoOZCYJBdZiNBFUtxT9Ma2Gldkgy5lhX
ZkS3pbIpEHYvI3PbewIDAQAB
-----END PUBLIC KEY-----
Копируем ключ и вставляем в ДНС зоне нашего домена mydomain.ru в поле:
dkim._domainkey TXT "k=rsa; p=MIGfMA0GCSqGSIb3D.........;"
Проверяем:
$ host -t txt dkim._domainkey.mydomain.ru.
;; Truncated, retrying in TCP mode.
dkim._domainkey.mydomain.ru. descriptive text "k=rsa\; p=MIGfMA0GCSqGS.....\;"
Теперь правим сам exim:
## DKIM:
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_FILE = /usr/local/etc/exim/dkim/${lc:${domain:$h_from:}}.key
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
...
## чуть правим транспорт:
remote_smtp:
driver = smtp
dkim_domain = DKIM_DOMAIN
dkim_selector = dkim
dkim_private_key = DKIM_PRIVATE_KEY
...
Теперь, если отправить письмо, то в заголовках можно увидеть такое:
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=domain.org; s=dkim;
h=Content-Transfer-Encoding:Content-Type:MIME-Version:Date:Subject:To:From:Message-ID; bh=47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=;
b=bfxwjczWz5OFi4LMTs4qpcOcl5p3RhKeC4iZp9KvOb6iI66ZxDSdYZSezJ5n3rdCHeQeTabF8NCTgUB65............YOlII=;
Что означает, что письма подписываются.
Примечание.
Для проверки работоспособности SPF/DKIM можно воспользоваться online сервисами:
http://www.mail-tester.com/
http://dkimvalidator.com/
Примечание.
Когда SPF, DMARK, DKIM не работают – уязвимости протоколов
2 коментарі “[exim] SPF/DKIM”
Добрый день. Пытаюсь настроить SPF по статье. SPF в DNS добавил, spfquery установил, проверку проходит, в конфиг эксима добавил правила из статьи. Пытаюсь проверить работу. При отправке письма с левого почтового сервера подделываю адрес отправителя. По идее письмо получать не должен, но получаю. В заголовках:
0.9 SPF_FAIL SPF: sender does not match SPF record (fail)
[SPF failed: Please see http://www.openspf.org/Why?s=mfrom;id=admin%40mydomain.com;ip=XXX.XXX.XXX.XXX;r=mail%5D
Вроде все правильно. SPF отрабатывает, но почему письмо не отклоняется, а попадает во входящие? Не подскажете что не так? Спасибо.
Добрый.
Скорее всего в exim’e не всё прописали, либо вместо deny поставили warn.