19 июн. 2013 г.

Using DKIM in Exim for Centos. Part 1.

Мои аптеки регулярно шлют мне письма от себя и из обратной связи от кутомеров и абузеров. В последнее время mail.ru и gmail.com повадились такие письма даже в спам не ложить, а отправлять обратно с пометкой 421 - "никого нет дома, приходите позже" или "550 - ты ёбаный спамер".

Хостеры ругаются, регистраторы банят домены, абузеры охуевают, кустомеры не покупают. После месячного заёбывания саппорта mail.ru и быстро покурив интернеты и второго после Бога, я выснил, что:
  1. почтовики не любят такую хуйню в заголовках как "X-PHP-Originating-Script: 500:class-phpmailer.php", устраняется в \etc\php.ini исправить mail.add_x_header = Off
  2. всем поголовно в ДНС добавить TXT  86400 v=spf1 ip4:111.222.33.44 a mx ~all (IP ясен хуй писать свой) 
  3. заставить exim (не менее 4.70, у меня 4.80.1) подписывать письма кровью, т.е. DKIM
 Создаём RSA-ключ (не менее, чем 1024 бита длиной, гугл меньше не примет) и парный ему общедоступный ключ. Прячем тайный ключ от посторонних:
mkdir /etc/pki/dkim
cd /etc/pki/dkim
openssl genrsa -out buy-viagra-online.com.key 1024
Generating RSA private key, 1024 bit long modulus
...................++++++
..++++++
e is 65537 (0x10001)
openssl rsa -in buy-viagra-online.com.key -pubout > buy-viagra-online.com.pub
chown exim:exim buy-viagra-online.com.key
chmod 640 buy-viagra-online.com.key
Получили buy-viagra-online.com.key 891 байт + buy-viagra-online.com.pub 272 байта
Создаём  DNS-запись для верификации DKIM
Берём публичный ключ, файло example.com.pub, который выглядит примерно так:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3D......
......
......
YRhOq9VT1IuiNhULLQIDAQAB
-----END PUBLIC KEY-----
Удаляем комментарии (начинаются со знаков минуса), всё остальное разворачиваем в одну линию, и приписываем к началу строку
k=rsa; p=
Получим что-то вроде следующего:
k=rsa; p=MIGfMA0GCSqGS.....дохуя.букв......BwIDAQAB
Входим в интерфейс управления зоной для домена example.com и создаём запись вида
dkim._domainkey.buy-viagra-online.com 86400 IN TXT "k=rsa; p=MIGfMA0GCSqG....дохуя.букв....9VT1IuiNhULLQIDAQAB"
Где dkim — произвольная строка (допустимая в доменном имени). Важно: можно создать несколько DKIM-записей для одного и того же домена, если у них различаются селекторы.
Лезем в файл \etc\exim\exim.conf
# было так
remote_smtp:
driver = smtp
# стало так
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_KEY_FILE = /etc/pki/dkim/DKIM_DOMAIN.key
# OLD FUCKING ERROR DKIM_PRIVATE_KEY = ${if exists{DKIM_KEY_FILE}{DKIM_FILE}{0}}
DKIM_PRIVATE_KEY = ${if exists{DKIM_KEY_FILE}{DKIM_KEY_FILE}{0}}
remote_smtp:
driver = smtp
dkim_domain = DKIM_DOMAIN
dkim_selector = dkim
dkim_private_key = DKIM_PRIVATE_KEY
# я не вкурил, зачем это и заремил dkim_canon = relaxed
service exim restart
echo "body viagra 00 _`date`_" |mail -s "subject 123 from _`hostname`_" fucking.viagra.admin@gmail.com

Если всё нормально, то на жимыле в исходниках вы увидите в том числе и такое:
Received-SPF: pass (google.com: domain of root@buy-viagra-online.com designates 111.222.33.44 as permitted sender) client-ip=111.222.33.44; Authentication-Results: mx.google.com;
spf=pass (google.com: domain of root@buy-viagra-online.com designates 111.222.33.44 as permitted sender) smtp.mail=root@buy-viagra-online.com;
dkim=pass header.i=@buy-viagra-online.com
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=buy-viagra-online.com; s=dkim;
h=Date:From:Message-Id:Subject:To; bh=9DgPzmCC0hW....много-букв.....2wDEUnow=;
b=idayqjqxQbc....дохуя-букв.....LhhlE8jE3Y=;
Received: from root by buy-viagra-online.com with local (Exim 4.80.1)
(envelope-from )
------ 
story is based on http://boyandin.info/w/Exim/DKIM
PS
The dkim_canon = relaxed, sets the canonicalization method to use when signing messages. DKIM supports “simple” and “relaxed” algorithms- to understand the difference, see section 3.4 of the DKIM RFC.
PS
Once you’ve set everything up, you can test your DKIM (and SPF and SenderID, etc) install, by using the port25.com validation service:
If you wish to receive the results at the address in the “mail_from”, the sample message should be sent to check-auth@verifier.port25.com.
If you wish to receive the results at the address in the “from” header, the sample message should be sent to check-auth2@verifier.port25.com.
If you wish to receive the results at a different address from one of the addresses above, the address need to be added to the check-auth address. For example, to send the results to: jsmith@yourdomain.com the sample message should be sent to check-auth-jsmith=yourdomain.com@verifier.port25.com.

PS
Как ставить EXIM 4.80.1 на Centos 5.9 32 бит на VDS с 128 Mb RAM - это тема отдельной истории. Если будут интересующиеся - напишу. А вот как делать DKIM на шареде - ебитесь сами :) потому что ВДС.
Иди работай! Прочитать полностью...