четверг, 29 мая 2014 г.

Настройка openDKIM

Установка:
# apt-get install opendkim opendkim-tools

Приводим основной конфиг в такое состояние:
# vim /etc/opendkim.conf
KeyTable           /etc/opendkim/KeyTable
SigningTable       /etc/opendkim/SigningTable
ExternalIgnoreList /etc/opendkim/TrustedHosts
InternalHosts      /etc/opendkim/TrustedHosts
# Optional - To show more information in logs
LogWhy yes

Создаём необходимые каталоги и файлы:
# mkdir -p /etc/opendkim/keys
# touch /etc/opendkim/KeyTable
# touch /etc/opendkim/SigningTable
# touch /etc/opendkim/TrustedHosts

Структура каталогов будет примерно такая:
$ tree /etc/opendkim/
/etc/opendkim/
├── keys
│ ├── domain1.ru
│ │ ├── default.private
│ │ └── default.txt
│ ├── domain2.ru
│ │ ├── default.private
│ │ └── default.txt
│ └── default.txt
├── KeyTable
├── SigningTable
└── TrustedHosts

где default.private - ключ DKIM, default.txt - то, что должно быть прописано в TXT записи домена.
Сюда записываем все нужные домены, ip'шники:
# vim /etc/opendkim/TrustedHosts
127.0.0.1
localhost
example.com

Указываем порт, который будем слушать:
# vim /etc/default/opendkim
SOCKET="inet:[email protected]" # listen on loopback on port 12345

Интеграция с postfix:
# vim /etc/postfix/main.cf
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:12345
non_smtpd_milters = inet:localhost:12345

Теперь нужно для каждого домена создать ключ и прописать TXT-запись в настройках DNS.
Однако, если доменов много, очень поможет этот скрипт:
# vim add_domains_opendkim
#!/bin/bash
# Authors: Pierre Burri-Wittke/Michel Bisson
# 9. March 2013
# Purpose: Generates DNS-Txt keys and configures OpenDKIM for one or multiple domains
#===========================================
# Verifying the entries

if [ "$#" -lt 1 ]; then
   echo "ERROR: Wrong number of parameters"
   echo "Usage: add_domains_opendkim  [DomainName] ....."
   echo "eg. add_domains_opendkim example.com example.de example2.com"
   exit 1
fi

# Checking if OpenDKIM is installed and if yes creating the necessary data directory

if ! [ -d /etc/opendkim ]; then
    echo "ERROR: The package OpenDKIM is not installed. Install it and rerun this command."
    exit 2
else
    mkdir -p /etc/opendkim/keys
fi

# Verifying the given domains and skip them if errors or already configured

for domain ; do
  # Check the mail handling resolving
  if ! (host $domain | grep -q 'is handled by'); then
     echo "Domain $domain doesn't resolve well. Skipping"
     echo "Output:"
     host $domain
  # Check if the domain is already configured in openDKIM
  elif (grep -q "$domain default._domainkey.$domain" /etc/opendkim/SigningTable); then
      echo "Domain $domain is already configured in /etc/opendkim/SigningTable. Skipping"
  elif (grep -q "$domain default._domainkey.$domain" /etc/opendkim/KeyTable); then
      echo "Domain $domain is already configured in /etc/opendkim/KeyTable. Skipping"
  # All ok, then generate the key and configure OpenDKIM
  else
      mkdir /etc/opendkim/keys/$domain
      echo " "
      echo "Generate the keys..."
      cd /etc/opendkim/keys/$domain
      opendkim-genkey -r -d $domain
      chown opendkim:opendkim default.private
      ls -l /etc/opendkim/keys/$domain
      echo " "
      echo "Adding following lines in /etc/opendkim/KeyTable & /etc/opendkim/SigningTable"
      echo "        default._domainkey.$domain $domain:default:/etc/opendkim/keys/$domain/default.private"
      echo "default._domainkey.$domain $domain:default:/etc/opendkim/keys/$domain/default.private" >> /etc/opendkim/KeyTable
      echo "        $domain default._domainkey.$domain"
      echo "$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
      echo " "
      echo "-------------------- TODO ----------------------"
      echo "Now copy the record below in your DNS (until the end of the domain! Do not include lines with '***')"
      echo "DNS: Free Text Entries/freier Textentraege of domain "
      echo " "
      echo "*** $domain *** ---------------------------"
      cat /etc/opendkim/keys/$domain/default.txt
      echo "*** $domain *** ---------------------------"
      result=true
  fi
done

# Restart OpenDKIM if at least one new domain was registered in OpenDKIM
echo " "
if $result ; then /etc/init.d/opendkim restart ; fi

Делаем скрипт исполняемым и запускаем его:
# chmod +x add_domains_opendkim
# ./add_domains_opendkim domain1 domain2 domain3 

Перезагружаем postfix:
# service postfix reload

И теперь осталось только прописать TXT записи для каждого домена.

P.S. Если пригодится.
Список моих доменов был в файле, в каждой новой строке новый домен. Для замены переноса строки на пробел можно воспользоваться командой tr:
$ cat hosts_mail | tr '\n' ' '

Комментариев нет: