複数のドメイン(ウェブサイト)のサーバーでDKIMを使用する


回答:


30

良い!私は質問で言及された投稿からこれを理解しました。答え自体と、その中に提供されるリンクとの間に一種のミックスを作りました。特に、4番目のリンクは私が使用したものです。

だから物事はこのようになります。サーバーまたはVPSがあり、ドメインの1つをメインドメインにし、サーバー名として使用するとします(私の例ではmydomain.com)。

そのため、まず最初に、物事を簡単にするためにルートに変更しますが、このステップをスキップして、sudoすべてのコマンドの前に使用できます。

sudo su

次に、OpenDKIMをインストールします。

apt-get install opendkim opendkim-tools

設定ファイルを修正しましょう。/etc/opendkim.conf編集を開始します。nanoを使用していますが、他のエディターと同じです。

nano /etc/opendkim.conf

開いたら、このようにします。あなたが快適に感じる場合は、いくつかのオプションを変更することができますが、DomainKeyFileSelectorコメントしたままにしなければなりません。

# 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を使用しますが、独自のものに置き換えます。

私は以前からrootでしたが、そうでない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

そして、ファイルの最後に追加します(ここでも、ドメインごとに1行があります)。

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
グレートガイドが、私につき、誤差たmail.logで「『user@example.com』の無署名テーブルの一致」を避けるために、SigningTableエントリから* @を削除する必要がありましたlists.opendkim.org/archive/opendkim/ users / 2011/08 / 1332.html
dw1

1
このガイドのおかげで、私はdw1と同じ問題を抱えていましたが、SigningTableから* @を削除した後、すべてが期待どおりに機能しました。もう1つは、/etc/opendkim/TrustedHostsこのホストを介して実行されるドメインの数に関係なく、ファイル内でホストのIPが1回だけあればよいということです。他のセレクターを使用する場合はdefault、必ずすべてのファイルで変更してください!
フラットロン

すべてのガイドに従いましたが、DKIM署名は追加されていないようです...これをデバッグするにはどうすればよいですか?
-the_nuts

1
これをありがとう!Ubuntu 16.xおよびopendkim 2.10.3を使用しています... SigningTable *@のドメイン名の前にDIDが必要です。これを修正するまで何も署名されませんでした。cc:@the_nuts
パトリックムーア

1
ファイル/ etc / opendkim / KeyTableおよび/ or / etc / opendkim / SigningTableが存在しない場合、サービスの最初の再起動は成功しない可能性があります。次を使用して単純に作成します # touch /etc/opendkim/KeyTable # touch /etc/opendkim/SigningTable
Kristjan Adojaan

4

このスクリプトは、「完了!サーバーはDKIMを使用する準備ができました」の後の部分を自動化します

このプロセスを少し自動化するために、このbashスクリプトを作成しました。domains =()配列内の行ごとに1つの「domain.com」を追加するだけです。

最初にファイルとディレクトリが存在しない場合は作成します

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

spfs.txtファイルには、各ドメインのDNSレコードに追加する必要があるすべてのspfレコードが含まれます。

注:複数回実行しないでください。ドメインが既に存在するかどうかを確認しません。スクリプトもルートとして実行する必要があります。

#!/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スクリプトを作成しました。domains =()配列内の行ごとに「example.com」のようなドメインを1つ追加するだけです。

このスクリプトはファイルを作成し、ファイルに行がすでにあるかどうかを確認します

Spfs.txtは実行されるたびに削除および再作成され、追加する前にdefault.txtの2行目を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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.