DKIM Exim (взято с lissyara.su)

Привожу данный текст как закладку для себя. Автором этой статьи является некий Laa с сайта lissyra.su.

Привет.
Поднял у себя и решил поделиться опытом с массами.
Есть такая технология, как DKIM (DomainKeys Identified Mail), позволяет письма подписывать ключами. Сервер получателя письма в ДНС берет информацию о ключе и сам ключ. После сверки информации из ДНС с заголовками письма, которое пытается поступить, можно судить об отправителе — доверять ему или нет. Спамеру практически не реально подобрать ключ для отправки на чужой сервер спама. Однако, спамеру гораздо более реальней проломить клиентский компьютер, который имеет доступ к почтовому серверу, использующему для отправки DKIM, и через этот сервер разослать спам. Спам и доставлен будет и подписан.

На сегодняшний день этот метод больше используется бесплатными почтовыми службами или крупными почтовыми серверами, которые частенько подставляют спамеры. Я не уверен вообще, что это кто-то будет использовать, но мало-ли, а вдруг?  У себя я еще не собрал достаточно статистики для понимания стоит ли использовать DKIM для анализа спама или не стоит. Через недельку-две думаю соберу статистику.

Но как самому подписывать свою почту при помощи DKIM я тут на примере freebsd 7.2 и exim расскажу.

Итак, я использую на сегодняшний день exim 4.70. (Уже есть 4.71, в котором подправлен небольшой баг в реализации DKIM). В более ранних версиях поддержка DKIM реализовывалась при помощи сторонних методов, а с этой версии DKIM поддерживается самим exim-ом.

Первым делом создаем ключ:

КОД: 
20:18:45 root@m $ openssl genrsa -out /usr/local/etc/exim/dkim/domain.org.key 1024
Generating RSA private key, 1024 bit long modulus
...++++++
.....................................................................++++++
e is 65537 (0x10001)
20:41:18 root@m $

Желательно, чтобы меньше глаз ключ видело и тем более меньше рук могли этот ключ изменить:

КОД: 
chown mailnull:wheel /usr/local/etc/exim/dkim/
chmod u=rx,go= /usr/local/etc/exim/dkim/

Теперь создаем публичный ключ, который будет предоставляться всем желающим для проверки исходящих писем (в дальнейшем этот ключ будет в ДНС записи TXT):

КОД: 
20:47:03 root@m $ openssl rsa -in /usr/local/etc/exim/dkim/domain.org.key -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYw9Ddhod6jZZkp0S0lf4I/j57
G8DnW5HDoKHDr0OwmbOhg0QOefHIpfrhBCrTK08dAvvvFnXs5/g1i9YU2ZDHE1uB
pSrtm33ZBAC9tUneqTM6J4PYAHKs1hOchoOZCYJBdZiNBFUtxT9Ma2Gldkgy5lhX
ZkS3pbIpEHYvI3PbewIDAQAB
-----END PUBLIC KEY-----
20:47:07 root@m $

Копируем ключ и вставляем в ДНС зоне нашего домена domain.org в поле:

КОД: 
...
dkim._domainkey         TXT     "k=rsa; p=MIGfMA0GCSqGSIb3D.........;"
....

Внимание: ключ должен располагаться одной строкой, без переносов и пробелов. Обновляем serial в зоне и обновляем зону. Проверяем, что получилось:

КОД: 
20:51:30 root@m $ host -t txt dkim._domainkey.domain.org.
Trying "dkim._domainkey.domain.org"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 37561
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2
;; QUESTION SECTION:
;dkim._domainkey.domain.org.  IN      TXT;; ANSWER SECTION:
dkim._domainkey.domain.org. 86400 IN  TXT     «k=rsa\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBi…..\;»

Ok! Все хорошо. В ДНС все получилось.
Первое слово, до _domainkey в ДНС-записи — это будет наш dkim-selector. Его можно любой заюзать и пользоваться для разных случаев разными селекторами и тем самым юзать кучу ключей. Не знаю зачем это может понадобиться, но мало ли.

Теперь перейдем к настройке exim! В configure указываем следующее:

КОД:
...
## 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
...

Таким образом, при отправке письма, из адреса отправителя $h_from будет выкусываться домен. Скажем domain.org, В случае отсутствия ключа, для этого домена, значение переменной ключа будет равно нулю, то есть письмо не будет подписываться.

Перечитываем конфиг exim:

КОД:
20:57:16 root@m $ /usr/local/etc/rc.d/exim reload

И отправляем тестовое письмо так, чтобы оно уходило при помощи транспорта remote_smtp (то есть на внешний адресок какой-то).
Заглядываем в заголовки этого письма и радуемся — DKIM работает!!!

КОД: 
...
Received-SPF: pass (google.com: domain of laa@domain.org designates 194.z.y.x as permitted sender) client-ip=194.z.y.x;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of laa@domain.org designates 194.z.y.x as permitted sender) smtp.mail=laa@domain.org;
+dkim=pass header.i=@domain.org
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=;
Received: from [89.x.x.x] (port=17497 helo=toshiba)
by m.domain.org with esmtpa (Exim)
(envelope-from <laa@domain.org>)
id 1NDiOF-000ELJ-JT
for domain.org.user-test@gmail.com; Thu, 26 Nov 2009 20:44:25 +0300
...

Ну вот и все. Может кому и пригодится.

Дальше хочу проверять входящую почту по этой технологии, постараюсь сообщить тут о результатах, возможно оно все будет бестолку.

p.s. ключ покусал для лучшего восприятия, длинные строки хуже читаются.

prooflink : http://forum.lissyara.su/viewtopic.php?f=20&t=22162