Привожу данный текст как закладку для себя. Автором этой статьи является некий 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 в зоне и обновляем зону. Проверяем, что получилось:
- КОД:
;; QUESTION SECTION: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