OpenDKIM + Postfix
В конце 2011 года разработчики проекта dkim-milter прекратили его поддержку и разработку. К счастью, на замену проекта dkim-milter пришел OpenDKIM, с помощью которого добавить DKIM-подпись в письма так же просто.
Для этого нам потребуется сам Postfix и пакеты OpenDKIM. Установим все необходимые компоненты с помощью вашего пакетного менеджера:
Теперь нам нужно получить ключи, которые мы будем использовать для подписи писем. Ключи будем хранить рядом с конфигурационными файлами Postfix, но вы можете выбрать и другое место — это непринципиально.
Получим ключ для домена example.com и селектора mail: (Домен example.com необходимо заменить, на свой. Например vanila.org)
Эта команда создаст файлы /etc/postfix/dkim/mail.private и /etc/postfix/dkim/mail.txt, с секретным и публичными ключами соответственно. Публичный ключ нужно добавить в соответствующую TXT запись вашего домена.
Файлам ключей обязательно нужно дать доступ для группы, в которой работает OpenDKIM:
В файл конфигурации /etc/opendkim.conf записываем:
Список имеющихся ключей укажем в файле /etc/postfix/dkim/keytable:
Объясним OpenDKIM почту каких доменов какими ключами подписывать в файле /etc/postfix/dkim/signingtable:
В других файлах, указаных в директивах ExternalIgnoreList и InternalHosts, содержится просто список хостов и/или IP-адресов каждый на новой строке.
В файле /etc/default/opendkim объясним DKIM-демону где ему ждать подключений:
Наконец, добавим в конец /etc/postfix/main.cf следующие строки:
Не забываем добавить TXT запись и проверить, что она на месте:
main.cf
opendkim.conf
Для корректности отображения, DKIM подписи, необходимо внести тхт запись, в файл конфигурации домена.
Перезапускаем postfix и opendkim i bind, отправляем тестовое письмо куда-нибудь на Яндекс и наслаждаемся успешным результатом проверки подписи:
В конце 2011 года разработчики проекта dkim-milter прекратили его поддержку и разработку. К счастью, на замену проекта dkim-milter пришел OpenDKIM, с помощью которого добавить DKIM-подпись в письма так же просто.
Для этого нам потребуется сам Postfix и пакеты OpenDKIM. Установим все необходимые компоненты с помощью вашего пакетного менеджера:
Code:
aptitude install opendkim opendkim-tools
Code:
mkdir /etc/postfix/dkim/
Code:
opendkim-genkey -D /etc/postfix/dkim/ -d example.com -s mail
Файлам ключей обязательно нужно дать доступ для группы, в которой работает OpenDKIM:
Code:
chgrp opendkim /etc/postfix/dkim/* chmod g+r /etc/postfix/dkim/*
Code:
Syslog yes SyslogSuccess yes # на время отладки включим расширенное логгирование LogWhy yes X-Header yes Canonicalization relaxed/relaxed # подпись и проверка подписей Mode sv # если только подписываем #Mode s # список ключей - KeyTable file:/etc/postfix/dkim/keytable # соответствие адресов/доменов и ключей - SigningTable file:/etc/postfix/dkim/signingtable # если вы подписываете и на других серверах - #ExternalIgnoreList file:/etc/postfix/dkim/trusted # список внутренних хостов, почта которых требует подписи - #InternalHosts file:/etc/postfix/dkim/internal
Code:
# формат: "название домен:селектор:/путь/до/ключа" # в качестве названия удобно использовать имя DNS записи с ключем mail._domainkey.example.com example.com:mail:/etc/postfix/dkim/mail.private # ключей может быть сколько угодно mx._domainkey.example.net example.net:mx:/etc/postfix/dkim/mx.private # (список ключей может быть и в БД - продробней в манах)
Code:
# формат: "домен-или-адрес название-ключа" example.com mail._domainkey.example.com example.net mx._domainkey.example.net # все остальные адреса тоже подписываем * mail._domainkey.example.com # (подробное описание формат есть в man)
В файле /etc/default/opendkim объясним DKIM-демону где ему ждать подключений:
Code:
SOCKET="inet:8891@127.0.0.1"
Code:
milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
Code:
dig txt mail._domainkey.example.com
Code:
smtpd_banner = $myhostname ESMTP (debian) #Отключаем использование comsat biff = no #Запрещаем автоматически дополнять неполное доменное имя в адресе письма append_dot_mydomain = no #Указываем имя нашего хоста myhostname = gw0.nauk.name # Указываем файл с псевдонимами почтовых ящиков alias_maps = hash:/etc/aliases #Указываем, для каких доменов будем принимать почту mydestination = localhost # Не будем ограничивать размер почтовых ящиков mailbox_size_limit = 0 recipient_delimiter = + #Указываем прослушивание на всех сетевых интерфейсах inet_interfaces = all #Указываем обязательность использование клиентами команды helo smtpd_helo_required = yes #Описываем доступ доменам, почтовым ящикам и т.д. virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf virtual_mailbox_base = /var/vmail virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf virtual_minimum_uid = 100 virtual_uid_maps = static:5000 virtual_gid_maps = static:5000 home_mailbox = Maildir/ local_recipient_maps = $virtual_mailbox_maps #Описываем авторизацию по SMTP для клиентов не из доверенной зоны smtpd_sasl_type = dovecot smtpd_sasl_auth_enable = yes smtpd_sasl_path = private/auth smtpd_sasl_security_options = noanonymous #broken_sasl_auth_clients = yes #Указываем каталог очереди для Postfix queue_directory = /var/spool/postfix smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps smtp_use_tls = yes smtpd_use_tls = yes smtp_tls_note_starttls_offer = yes smtpd_tls_key_file = /etc/dovecot/nauk.key smtpd_tls_cert_file = /etc/dovecot/nauk.cert smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 1s tls_random_source = dev:/dev/urandom #DKIM milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
Code:
# This is a basic configuration that can easily be adapted to suit a standard # installation. For more advanced options, see opendkim.conf(5) and/or # /usr/share/doc/opendkim/examples/opendkim.conf.sample. # Log to syslog Syslog yes SyslogSuccess yes # на время отладки включим расширенное логгирование LogWhy yes X-Header yes # Required to use local socket with MTAs that access the socket as a non- # privileged user (e.g. Postfix) UMask 002 # Sign for example.com with key in /etc/mail/dkim.key using # selector '2007' (e.g. 2007._domainkey.example.com) #Domain example.com #KeyFile /etc/mail/dkim.key #Selector 2007 # Commonly-used options; the commented-out versions show the defaults. #Canonicalization simple Mode sv #SubDomains no #ADSPDiscard no # Always oversign From (sign using actual From and a null From to prevent # malicious signatures header fields (From and/or others) between the signer # and the verifier. From is oversigned by default in the Debian pacakge # because it is often the identity key used by reputation systems and thus # somewhat security sensitive. OversignHeaders From # List domains to use for RFC 6541 DKIM Authorized Third-Party Signatures # (ATPS) (experimental) #ATPSDomains example.com # список ключей - KeyTable file:/etc/postfix/dkim/keytable # соответствие адресов/доменов и ключей - SigningTable file:/etc/postfix/dkim/signingtable # если вы подписываете и на других серверах - #ExternalIgnoreList file:/etc/postfix/dkim/trusted # список внутренних хостов, почта которых требует подписи - #InternalHosts file:/etc/postfix/dkim/internal
Code:
chown -R opendkim:opendkim /etc/opendkim/keys chmod -R 700 /etc/opendkim/keys /etc/init.d/opendkim restart
Code:
mail._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCd5M9hcAXLWsps2QIh3t4/eHN/GkXuVEm0rf6bPfmhg39MxcmhHsKljClDs4drc4E/UoDjNLaDymsUwryEbPlabqZZuS22XS0Vux67ZQjRk/lZTF5DRFous8HwHRgAetTlQmYfHco1T88xzjWaEPHJahbbYBiC1lqPY7UBlkD5bwIDAQAB"