Привожу данный текст как закладку для себя. Автором этой статьи является некий 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
 ;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