Використання DKIM на моєму сервері для кількох доменів (веб-сайтів)


22

Я читав підручник, опублікований MountainX ( Setup DKIM (DomainKeys) для Ubuntu, Postfix та Mailman )), але не можу зрозуміти, як застосувати ці кроки, якщо хочу розмістити та надсилати електронні листи для кількох доменів. Хтось має підказку?

Відповіді:


30

Добре! Я зрозумів це з посади, згаданої у питанні. Я зробив своєрідну суміш між самою відповіддю та посиланнями, що містяться в ній. Особливо четверте посилання - це те, що я використав.

Так справа йде так. Припустимо, у вас є сервер або VPS і зробити один із ваших доменів основним доменом і використовувати його як ім’я сервера (у моєму прикладі: mydomain.com).

Отже, перш за все, ми змінимо корінь, щоб полегшити все, але ви можете пропустити цей крок і використовувати sudoперед кожною командою.

sudo su

Тепер ми встановлюємо OpenDKIM:

apt-get install opendkim opendkim-tools

Давайте виправимо файл конфігурації. Ми відкриваємо /etc/opendkim.confдля редагування. Я використовую нано, але так само і з іншими редакторами.

nano /etc/opendkim.conf

Після відкриття зробіть так, щоб це виглядало так. Якщо ви відчуваєте себе комфортно, ви можете змінити деякі параметри, але Domain, KeyFileі Selectorпотрібно залишати коментар.

# 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.
#
#Domain                  example.com
#KeyFile                 /etc/opendkim/201205.private
#Selector                201205
#
# Commonly-used options
Canonicalization        relaxed/simple
Mode                    sv
SubDomains              yes
# Log to syslog
Syslog                  yes
LogWhy                  yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask                   022
UserID                  opendkim:opendkim
#
KeyTable                /etc/opendkim/KeyTable
SigningTable            /etc/opendkim/SigningTable
ExternalIgnoreList      /etc/opendkim/TrustedHosts
InternalHosts           /etc/opendkim/TrustedHosts
#
Socket                  inet:8891@localhost
#EOF

Далі ми створюємо частину папки та файлів, які містять інформацію про те, що OpenDKIM повинен використовувати та обробляти. Поки що TrustedHostsфайл. Ми створюємо та редагуємо його:

mkdir /etc/opendkim
nano /etc/opendkim/TrustedHosts

Ми повинні помістити в цей файл список надійних адрес: localhost та 127.0.0.1, а також ім'я вашого сервера та IP:

127.0.0.1
localhost
192.99.34.121
mydomain.com

Тепер ми редагуємо конфігураційний файл OpenDKIM.

nano /etc/default/opendkim

І додайте ці рядки в кінці файлу. Вони скажуть OpenDKIM, у якому порту він повинен очікувати запитів на підписання:

SOCKET="inet:8891@localhost"

Відкриваємо конфігураційний файл Postfix.

nano /etc/postfix/main.cf

І додайте ці рядки до кінця файлу. Вони скажуть Postfix, що він повинен надсилати електронні листи для підписання та куди.

milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

Якщо ви зараз не додаєте домени, ви можете перезапустити все, так що конфігурація набуває чинності.

/etc/init.d/opendkim restart
/etc/init.d/postfix reload
/etc/init.d/postfix restart

Готово! Сервер готовий працювати з DKIM. Тепер вам потрібно додати свої домени до цієї системи. Наступний процес однаковий для всіх доменів, які ви хочете додати. Я буду використовувати приклад otherdomain.com для прикладу, заміню його своїм.

Пам'ятайте, що я корінь був раніше, але якщо ви цього не зробите, виконайте sudo suабо передуйте своїм командам ключового слова sudo.

sudo su

Спочатку ми створюємо каталог для нашого домену і заносимо його всередину:

mkdir -p /etc/opendkim/keys/otherdomain.com
cd /etc/opendkim/keys/otherdomain.com

Тепер ми генеруємо ключ для домену:

opendkim-genkey -r -d otherdomain.com

Ми надаємо користувачеві OpenDKIM право власності на новостворений файл:

chown opendkim:opendkim default.private

І ми відкриваємо KeyTableфайл, щоб додати новий ключ для нашого нового домену:

nano /etc/opendkim/KeyTable

Ми додаємо його в кінець файлу (після всіх інших доменів, які ми можемо мати тут):

default._domainkey.otherdomain.com otherdomain.com:default:/etc/opendkim/keys/otherdomain.com/default.private

Відкриваємо SigningTableфайл.

nano /etc/opendkim/SigningTable

І додати в кінці файлу (знову ж таки, у нас буде по одному рядку для кожного домену):

otherdomain.com default._domainkey.otherdomain.com

Цей SigningTable перелічує всі листи, які підписуються. Просто додавши доменне ім’я, всі листи з цього домену будуть підписані.

Я не впевнений у необхідності зробити наступний крок, але я це просто зробив, про всяк випадок ... Ми відкриваємо TrustedHostsфайл.

nano /etc/opendkim/TrustedHosts

І додайте в кінці файлу:

otherdomain.com

Останнє: ми показуємо вміст файлу /etc/opendkim/keys/otherdomain.com/default.txt.

cat /etc/opendkim/keys/otherdomain.com/default.txt

І додайте інформацію між цитатами до TXTзапису в зоні DNS домену, і ми також повинні використовувати default._domainkeyяк назву запису. ПРИМІТКА: "між цитатами" - це текст, який починається з " v=DKIM1;k=rsa; p=WIGfM...".

Якщо ми додали домени (до цього часу), ми перезапустимо все, щоб застосувати зміни.

/etc/init.d/opendkim restart
/etc/init.d/postfix reload
/etc/init.d/postfix restart

Готово!


2
Чудовий посібник, але мені довелося видалити * @ із записів SigningTable, щоб уникнути помилки "таблиця підписання не відповідає" user@example.com "" у mail.log, по списках.opendkim.org
dw1

1
Дякую за це керівництво, у мене була та сама проблема, що і dw1, але після вилучення * @ із SigningTable все працювало як очікувалося. Ще одна річ у тому, що у /etc/opendkim/TrustedHostsфайлі IP-хост повинен бути там один раз, незалежно від того, скільки доменів працює через цей хост. Якщо ви хочете скористатися іншим селектором, defaultпереконайтесь, що ви зміните його у всіх файлах!
Flatron

Дотримуйтесь всіх посібників, але підпис DKIM, здається, не додається ... як я можу це налагодити?
the_nuts

1
Дякую за це! Я на Ubuntu 16.x і opendkim 2.10.3 ... мені DID потрібна *@частина попереду доменного імені в SigningTable; нічого не було підписано, поки я не виправив цього. куб .: @the_nuts
Патрік Мур

1
Перший перезапуск послуг може не вдатися, якщо файлів / etc / opendkim / KeyTable та / або / etc / opendkim / SigningTable немає. Просто створіть їх за допомогою # touch /etc/opendkim/KeyTable # touch /etc/opendkim/SigningTable
Kristjan Adojaan

4

Цей сценарій автоматизує частину після "Готово! Сервер готовий працювати з DKIM"

Щоб трохи автоматизувати цей процес, я створив цей скрипт bash. Просто додайте по одному домену.com на рядок всередині масиву domeins = ().

Спочатку створіть файли та каталоги, якщо вони вже не існують

/etc/opendkim/keys/
/etc/opendkim/KeyTable
/etc/opendkim/SigningTable
/etc/opendkim/TrustedHosts
/etc/opendkim/spfs.txt

Файл spfs.txt міститиме всі записи SPF, які потрібно додати до записів DNS для кожного домену.

ПРИМІТКА: не запускайте більше одного разу, він не перевіряє, чи існує вже домен. Сценарій також потрібно запустити як root.

#!/bin/bash
domains=(
        'domain.com'
)
for domain in "${domains[@]}"
do
keydir="/etc/opendkim/keys/$domain"
if [ -d "$keydir" ]
then
cd $keydir
else
mkdir $keydir
cd $keydir
fi
opendkim-genkey -r -d $domain
chown opendkim:opendkim default.private
echo "default._domainkey.$domain $domain:default:$keydir/default.private" >> /etc/opendkim/KeyTable
echo "$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable
echo "$domain" >> /etc/opendkim/TrustedHosts
echo "$(cat $keydir/default.txt)" >> spfs.txt
done

3

Цей сценарій автоматизує частину після "Готово! Сервер готовий працювати з DKIM"

Щоб трохи автоматизувати цей процес, я створив цей скрипт bash. Просто додайте один домен на зразок "example.com" на рядок всередині масиву domeins = ().

Цей скрипт створює файли для вас і перевіряє, чи рядок вже є у файлі

Spfs.txt видаляється та відтворюється кожного разу, коли він запускається, і перед додаванням перевіряє другий рядок за замовчуванням.txt проти spfs.txt

Ви повинні розмістити свої сервери ipv4 та ipv6 (якщо у вас є) у наданих змінних. Він перевіряє, чи вони не порожні

Ви можете запустити цей файл декілька разів завдяки доданим чекам.

#!/bin/bash
# List of domains
domains=( 
        'example.com'
)
# file paths and directories
dkim="/etc/opendkim"
keys="$dkim/keys"
keyfile="$dkim/KeyTable"
signfile="$dkim/SigningTable"
trustfile="$dkim/TrustedHosts"
spffile="$dkim/spfs.txt"
# Set Ipv6 and Ipv4 addresses for the server here
ipv4=""
ipv6=""
# loopback addresses for the server
loop=( localhost 127.0.0.1 )
function loopback {
        for back in "${loop[@]}"
        do
                if ! grep -q "$back" "$trustfile"; then
                        echo "$back" >> "$trustfile"
                fi
        done
}
# Check for files and create / write to them if they dont exist
if [ ! -d "$keys" ]; then
        mkdir "$keys"
fi
if [ ! -f "$keyfile" ]; then
        touch "$keyfile"
fi
if [ ! -f "$signfile" ]; then
        touch "$signfile"
fi
if [ ! -f "$trustfile" ]; then
        touch "$trustfile"
        loopback
else
        loopback
fi
if [ ! -f "$spffile" ]; then
        touch "$spffile"
else
        rm -rf "$spffile"
        touch "$spffile"
fi
if [ ! -z "$ipv6" ]; then
        if ! grep -q "$ipv6" "$trustfile"; then
                echo "$ipv6" >> "$trustfile"
        fi
fi
if [ ! -z "$ipv4" ]; then
        if ! grep -q "$ipv4" "$trustfile"; then
                echo "$ipv4" >> "$trustfile"
        fi
fi
# Generate keys and write the spfs records we need for each domain to one file
for domain in "${domains[@]}"
do
        keydir="$keys/$domain"
        default="$keydir/default.txt"
        if [ ! -d "$keydir" ]; then
                mkdir $keydir
        fi
        cd $keydir
        opendkim-genkey -r -d $domain
        chown opendkim:opendkim default.private
        key="default._domainkey.$domain $domain:default:$keydir/default.private"
        sign="$domain default._domainkey.$domain"
        trust="$domain"
        spf="$(cat $default)"
        # Check only the last line against the spf file as the first line is always the same
        spflast="$(tail -1 $default)"
        if ! grep -q "$key" "$keyfile"; then
                echo "$key" >> "$keyfile"
        fi
        if ! grep -q "$sign" "$signfile"; then
                echo "$sign" >> "$signfile"
        fi
        if ! grep -q "$trust" "$trustfile"; then
                echo "$trust" >> "$trustfile"
        fi
        if ! grep -q "$spflast" "$spffile"; then
                echo "$spf" >> "$spffile"
        fi
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.