การใช้ DKIM ในเซิร์ฟเวอร์ของฉันสำหรับหลายโดเมน (เว็บไซต์)


22

ฉันได้อ่านบทช่วยสอนที่โพสต์โดย MountainX ( ตั้งค่า 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"

เราเปิดไฟล์ config 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 susudo

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 Zone ของโดเมนและเราต้องใช้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 ต่อlists.opendkim.org/archive/opendkim/ users / 2011/08 / 1332.html
dw1

1
ขอบคุณสำหรับคำแนะนำนี้ฉันมีปัญหาเช่นเดียวกับ dw1 แต่หลังจากลบ* @ออกจาก SigningTable ทุกอย่างทำงานได้ตามที่คาดไว้ อีกสิ่งหนึ่งคือใน/etc/opendkim/TrustedHostsไฟล์ IP ของโฮสต์จะต้องอยู่ในนั้นเพียงครั้งเดียวโดยไม่คำนึงถึงจำนวนโดเมนที่ทำงานผ่านโฮสต์นี้ หากคุณต้องการใช้ตัวเลือกอื่น ๆ โปรดdefaultตรวจสอบให้แน่ใจว่าได้เปลี่ยนมันในทุกไฟล์!
Flatron

ปฏิบัติตามคำแนะนำทั้งหมด แต่ดูเหมือนว่าลายเซ็น DKIM จะไม่ถูกเพิ่ม ... ฉันจะแก้ไขข้อบกพร่องนี้ได้อย่างไร
the_nuts

1
ขอบคุณสำหรับสิ่งนี้! ฉันใช้ Ubuntu 16.x และ opendkim 2.10.3 ... ฉันต้องการ*@ส่วนหน้าของชื่อโดเมนใน SigningTable; ไม่มีอะไรลงชื่อจนกว่าฉันจะแก้ไขสิ่งนี้ cc: @the_nuts
Patrick Moore

1
การรีสตาร์ทครั้งแรกของบริการอาจไม่สำเร็จหากไฟล์ / etc / opendkim / KeyTable และ / หรือ / etc / opendkim / SigningTable ไม่มีอยู่ เพียงแค่สร้างพวกเขาโดยใช้ # touch /etc/opendkim/KeyTable # touch /etc/opendkim/SigningTable
Kristjan Adojaan

4

สคริปต์นี้ดำเนินการโดยอัตโนมัติหลังจาก "เสร็จสิ้น! เซิร์ฟเวอร์พร้อมที่จะทำงานกับ DKIM"

เพื่อช่วยให้กระบวนการนี้เป็นอัตโนมัติฉันได้สร้างสคริปต์ทุบตีนี้ขึ้นมา เพียงเพิ่มหนึ่ง 'domain.com' ต่อบรรทัดภายในอาร์เรย์ domains = ()

ขั้นแรกให้สร้างไฟล์และไดเรกทอรีหากยังไม่มีอยู่

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

ไฟล์ spfs.txt จะมีระเบียน spf ทั้งหมดที่คุณต้องการเพิ่มลงในระเบียน DNS ของคุณสำหรับแต่ละโดเมน

หมายเหตุ: อย่ารันมากกว่าหนึ่งครั้งจะไม่ตรวจสอบเพื่อดูว่ามีโดเมนอยู่แล้ว สคริปต์ต้องถูกเรียกใช้ในฐานะรูทด้วย

#!/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"

เพื่อช่วยให้กระบวนการนี้เป็นอัตโนมัติฉันได้สร้างสคริปต์ทุบตีนี้ขึ้นมา เพียงเพิ่มหนึ่งโดเมนเช่น 'example.com' ต่อบรรทัดภายในอาร์เรย์ domains = ()

สคริปต์นี้สร้างไฟล์ให้คุณและตรวจสอบว่ามีบรรทัดอยู่ในไฟล์หรือไม่

Spfs.txt จะถูกลบและสร้างใหม่ทุกครั้งที่รันและตรวจสอบบรรทัดที่ 2 ของ default.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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.