openDKIM และ Postfix บน Ubuntu Server 12.04LTS
ฉันจะพยายามกลับมาและจัดรูปแบบนี้ดีกว่า แต่เนื่องจากมีคำขอให้โพสต์คำตอบของฉันฉันต้องการโพสต์ทันทีแทนที่จะรอจนกว่าฉันจะมีเวลาจัดรูปแบบที่ถูกต้อง เนื่องจากไม่มีเวลาฉันจึงเก็บคำตอบทั้งหมดไว้ในบล็อกสี่เหลี่ยม ฉันหวังว่าโซลูชันนี้มีประโยชน์
นี่คือการอ้างอิงของฉัน:
และWikipediaมีเนื้อหาที่ดีในหัวข้อนี้
อย่างน้อยคุณจะต้อง:
- รูทการเข้าถึงเซิร์ฟเวอร์อีเมลของคุณ
- การเข้าถึงเพื่ออัปเดตระเบียน DNS สำหรับโดเมนของคุณ
ติดตั้ง opendkim จากที่เก็บ:
# sudo apt-get install opendkim opendkim-tools
คุณต้องตัดสินใจเลือก“ ตัวเลือก” ที่คุณต้องการใช้ ตัวเลือกเป็นคำสำคัญที่อธิบายถึงคีย์ที่คุณต้องการใช้ ที่นี่ฉันจะใช้ตัวเลือก 201205 เนื่องจากคีย์จะใช้ได้ในเดือนพฤษภาคม 2012 (ไหวพริบใช่มั้ย) ฉันให้สองตัวอย่างสำหรับความหลากหลายซึ่งหวังว่าจะเพิ่มความชัดเจน คุณจะต้องสร้างหนึ่งคีย์ อย่างไรก็ตามฉันให้ทั้งสองตัวอย่างเพื่อให้คุณสามารถเปรียบเทียบได้
- 201205 (คีย์ที่ 1)
- my_selector (คีย์ที่สอง)
โดเมนของฉันจะเป็นexample.com
แต่ฉันจะใช้โดเมนย่อยสำหรับตัวอย่างที่สองของฉัน:
- example.com (คีย์ที่ 1)
- mail.example.com (คีย์ที่สอง)
ฉันตัดสินใจที่จะทำงานในไดเรกทอรีต่อไปนี้:
# mkdir /etc/opendkim/
# cd /etc/opendkim
สร้างคีย์ในไดเรกทอรีปัจจุบันโดยใช้ตัวเลือกและโดเมนที่คุณเลือก
# opendkim-genkey -s 201205 -d example.com
คุณอาจหรืออาจไม่จำเป็นต้องเปลี่ยนความเป็นเจ้าของ ดูรายละเอียดในตัวอย่างของฉันสำหรับคีย์ที่ 2 ด้านล่างสำหรับสิ่งที่เป็นเจ้าของและสิทธิ์ควรเป็น
ก่อนอื่นคุณควรตรวจสอบว่ามีopendkim
ผู้ใช้หรือไม่ (ID ผู้ใช้ / กลุ่มของคุณอาจแตกต่างกัน):
# grep opendkim /etc/passwd
opendkim:x:108:117::/var/run/opendkim:/bin/false
และคุณอาจต้องทำสิ่งนี้:
# chmod 700 /var/run/opendkim
หมายเหตุ: ไม่จำเป็นต้องใช้สองคำสั่งถัดไปใน Ubuntu 12.04 แต่ถ้าคำสั่งด้านบนไม่แสดงว่าผู้ใช้ตั้งค่า opendkim อย่างถูกต้องให้ทำเช่นนี้:
# useradd -r -g opendkim -G mail -s /sbin/nologin -d /var/run/opendkim -c "OpenDKIM" opendkim
# chown opendkim:opendkim 201205.private
# cat 201205.private
-----BEGIN RSA PRIVATE KEY-----
ABCCXQ...[long string]...SdQaZw9
-----END RSA PRIVATE KEY-----
ตอนนี้ตรวจสอบกุญแจสาธารณะและสังเกตว่ามีข้อผิดพลาด (ใน openDKIM 2.5.2 บน Ubuntu 12.04)! ที่ไหนมี, ก็ควรมี;=rsa;
;k=rsa;
ที่k
ขาดหายไป กรุณาใส่มัน
# cat 201205.txt
201205._domainkey IN TXT "v=DKIM1;=rsa; p=WIGfM..[snip]..QIDIAB" ; ----- DKIM 201205 for example.com
หลังจากได้รับการแก้ไขแล้วจะมีลักษณะเช่นนี้:
201205._domainkey IN TXT "v=DKIM1;k=rsa; p=WIGfM..[snip]..QIDIAB" ; ----- DKIM 201205 for example.com
นอกจากนี้คุณอาจต้องหลีกเลี่ยงเซมิโคลอนเช่นนี้ หากคุณไม่ต้องการความคิดเห็นที่สิ้นสุดเพียงลบมัน นอกจากนี้โปรดทราบว่าคุณควรเพิ่มการตั้งค่าสถานะ t = y เพื่อระบุว่ารับเซิร์ฟเวอร์ที่คุณกำลังทดสอบ DKIM แต่ยังไม่ได้ใช้งาน คุณมีบันทึกทรัพยากรที่ทำงานได้:
201205._domainkey IN TXT "v=DKIM1\;k=rsa\;t=y\;p=WIGfM..[snip]..QIDIAB"
คุณต้องเผยแพร่เนื้อหาของกุญแจสาธารณะข้างต้นไปยังเซิร์ฟเวอร์ DNS ที่มีสิทธิ์ของคุณ ฉันแนะนำให้ใช้เรคคอร์ด TXT ดูเหมือนจะมีข้อโต้แย้งเล็กน้อยว่าจะใช้ระเบียน SPF หรือทั้งสองประเภท หลังจากการอ่านเล็กน้อยฉันเลือกที่จะยึดติดกับประเภทเรคคอร์ด TXT โดยเฉพาะแม้ว่าฉันไม่เชื่อว่านี่เป็นคำสุดท้ายในหัวข้อนี้
คุณควรใช้ TTL สั้น ๆ (ใช้เวลาในการถ่ายทอดสด) เพื่อให้คุณสามารถเปลี่ยนคีย์ได้โดยไม่ต้องรอให้อายุทำการเผยแพร่แม้ว่า DNS ฉันใช้ 180 วินาที
ตัวอย่างที่สองของการสร้างคู่กุญแจเป็นเรื่องยากสำหรับฉัน ฉันจะอธิบายสิ่งที่ฉันทำ องค์ประกอบแรกคือฉันใช้ค่าโดเมน "example.com" แม้ว่าคีย์จะใช้สำหรับ "mail.example.com" ฉันมาถึงที่นี่ผ่านการลองผิดลองถูก ใช้งานได้ขณะใช้ "mail.example.com" ไม่ทำงาน น่าเสียดายที่ฉันไม่ทราบสาเหตุที่อยู่เบื้องหลัง นี่เป็นความแตกต่างเพียงอย่างเดียวที่ฉันพบ แต่มันก็หนักใจพอที่ฉันรู้สึกว่าฉันควรบันทึกประสบการณ์ของฉันด้วยการใช้โดเมนย่อย ไม่มีบทเรียนอื่น ๆ ในระดับเริ่มต้นที่ฉันพบว่าทำสิ่งนี้ สร้างคีย์ที่สอง:
opendkim-genkey -s my_selector -d example.com
ตรวจสอบความเป็นเจ้าของและการอนุญาตของรหัสส่วนตัวดังกล่าวข้างต้น นี่คือสิ่งที่พวกเขาควรมีลักษณะ:
# ls -la /etc/opendkim
-rw------- 1 opendkim opendkim 891 May 10 07:44 my_selector.private
หลังจากประกาศระเบียน DNS dig
ให้ตรวจสอบด้วย มันควรกลับสิ่งที่คุณป้อนในบันทึกทรัพยากร (RR)
$ dig 201205._domainkey.example.com txt +short
"v=DKIM1\;k=rsa\;t=y\;p=WIGfM..[snip]..QIDIAB"
ตอนนี้ทดสอบคีย์ คำสั่งด้านล่างถือว่าคุณอยู่ในไดเรกทอรีที่มีคีย์อยู่ (/ etc / opendkim สำหรับฉัน)
# opendkim-testkey -d example.com -s 201205 -k 201205.private -vvv
opendkim-testkey: key loaded from /etc/opendkim/201205.private
opendkim-testkey: checking key '201205._domainkey.example.com'
opendkim-testkey: key not secure
opendkim-testkey: key OK
คาดว่าผลลัพธ์เหล่านี้ "รหัสไม่ปลอดภัย" ไม่ได้ระบุข้อผิดพลาด เป็นผลที่คาดว่าจะไม่ได้ใช้ DNSSSEC DNSSEC กำลังจะมา แต่ก็ยังไม่พร้อมสำหรับช่วงเวลาที่ดีตามการอ่านของฉัน
ตัวอย่างด้วยคีย์ที่ 2:
# opendkim-testkey -d example.com -s my_selector -k /etc/opendkim/my_selector.private -vvvv
opendkim-testkey: key loaded from /etc/opendkim/my_selector.private
opendkim-testkey: checking key 'my_selector._domainkey.example.com'
opendkim-testkey: key not secure
opendkim-testkey: key OK
โปรดทราบว่า opendkim กำลังรายงานว่ารหัสไม่ปลอดภัย สิ่งนี้เกี่ยวข้องกับความจริงที่ว่า DNSSEC ไม่ได้ถูกนำไปใช้กับเซิร์ฟเวอร์ DNS ของฉันและในทางทฤษฎีแล้วใครบางคนสามารถขัดขวางการค้นหา DNS และแทนที่ด้วยคีย์ของตัวเอง
แก้ไขไฟล์กำหนดค่า OpenDKIM:
# nano /etc/opendkim.conf
# cat /etc/opendkim.conf
# 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
หากคุณใช้ตัวอย่างคีย์ที่สองของฉันกับโดเมนเป้าหมาย“ mail.example.com” รายการจะยังคงอ้างอิงโดเมนหลักเท่านั้น:
Domain example.com
KeyFile /etc/dkim/my_selector.private
Selector my_selector
-----
หมายเหตุจากแหล่งที่มาของฉัน: ถ้าคุณเรียกใช้ Postfix หลายอินสแตนซ์คุณต้องเพิ่มสิ่งนี้ใน opendkim.conf สำหรับแต่ละอินสแตนซ์ (หรืออันที่คุณต้องการใช้ opendkim)
สร้างไฟล์ด้วยโปรแกรมแก้ไขข้อความของคุณ/etc/opendkim/TrustedHosts
:
เพิ่มโดเมนชื่อโฮสต์และ / หรือ ip ที่ OpenDKIM ควรจัดการ อย่าลืม localhost
127.0.0.1
localhost
example.com
mail.example.com
192.168.1.100 #(IP address of your server, if applicable)
(บรรทัดสุดท้ายด้านบนอาจไม่จำเป็นหากคุณมีที่อยู่ IP ให้เพิ่มตรวจสอบให้แน่ใจว่าคุณใช้ของคุณเองไม่ใช่ตัวอย่างด้านบน)
แก้ไข/etc/default/opendkim
:
ยกเลิกข้อคิดเห็นแถวนี้และใช้พอร์ต 8891:
SOCKET="inet:8891@localhost" # listen on loopback on port
ตรวจสอบให้แน่ใจว่าไฟร์วอลล์ของคุณ (iptables) อนุญาตให้วนรอบบนโลคัลโฮสต์:
sudo iptables -A INPUT -i lo -j ACCEPT
จากนั้นสร้างไฟล์ด้วยโปรแกรมแก้ไขข้อความของคุณ/etc/opendkim/KeyTable
และเพิ่มโดเมนใน KeyTable
เพิ่มบรรทัด:
#EXAMPLE showing my 2nd key:
my_selector._domainkey.example.com example.com:my_selector:/etc/opendkim/my_selector.private
ถัดไปสร้างไฟล์ด้วยโปรแกรมแก้ไขข้อความของคุณ/etc/opendkim/SigningTable
และเพิ่มโดเมนใน SigningTable
ฉันแสดงตัวอย่างทั้งสอง โปรดทราบว่าสำหรับคีย์ที่ 2 ของฉันตอนนี้ฉันต้องใช้ชื่อโดเมนแบบเต็ม "mail.example.com":
example.com 201205._domainkey.example.com
mail.example.com my_selector._domainkey.example.com
โปรดทราบว่าในชื่อโดเมน OpenDKIM 2.0.1 จะต้องตรงตามตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ในตัวอย่างนี้เรากำลังใช้ OpenDKIM เวอร์ชันที่ใหม่กว่าและดูเหมือนจะไม่มีปัญหา
กำหนดค่า postfix แก้ไข /etc/postfix/main.cf และเพิ่มบรรทัดต่อท้าย
milter_default_action = accept
milter_protocol = 2
smtpd_milters=inet:localhost:8891
non_smtpd_milters=inet:localhost:8891
เปลี่ยนชื่อโฮสต์ด้วย:
#myhostname = localhost #original
myhostname = mail.example.com
คุณควรเปลี่ยนรายการที่เกี่ยวข้องใน / etc / hosts การเปลี่ยนแปลงเหล่านี้มีผลบังคับใช้หลังจากรีบูต (แม้ว่าคุณสามารถตั้งค่าได้ทันทีที่มีคำสั่ง: hostname NEW_NAME
)
รีสตาร์ท postfix และ opendkim หากคุณไม่รีบูต:
# service opendkim restart
Restarting OpenDKIM: opendkim.
# service postfix restart
* Stopping Postfix Mail Transport Agent postfix [ OK ]
* Starting Postfix Mail Transport Agent postfix [ OK ]
การทดสอบ
วิธีที่ดีที่สุดในการตรวจสอบว่าจดหมายที่เซ็นชื่อของคุณกำลังถูกรับรองความถูกต้องและมีการตั้งค่าระเบียน DNS ของคุณอย่างถูกต้องคือการใช้บริการทดสอบฟรีหนึ่งใน ฉันใช้สิ่งเหล่านี้:
- เครื่องมือตรวจสอบอีเมล Brandon Checketts - http://www.brandonchecketts.com/emailtest.php (รายการโปรดของฉัน)
- ส่งอีเมลที่ลงชื่อแล้วไปที่: check-auth@verifier.port25.com (ที่ฉันชอบ)
ส่งอีเมลที่ลงชื่อแล้วไปที่: sa-test@sendmail.net (คุณสามารถใส่ที่อยู่อีเมลทดสอบทั้งหมดลงในฟิลด์ถึง: ของข้อความขาออกเดียวเพื่อทดสอบ)
ส่งอีเมลที่ลงชื่อแล้วไปที่: autorespond+dkim@dk.elandsys.com <--- BROKEN !!! อย่าใช้อันนี้
แต่ละสิ่งเหล่านี้จะบอกคุณว่าสิ่งต่าง ๆ ทำงานได้อย่างถูกต้องหรือไม่และให้คำแนะนำในการแก้ไขปัญหาหากจำเป็น
หากคุณมีบัญชี Gmail คุณสามารถส่งข้อความที่ลงชื่อเพื่อรับการทดสอบที่ง่ายและรวดเร็ว
เมื่อคุณมีความสุขที่ทุกอย่างเรียบร้อยแล้วคุณสามารถลบการตั้งค่าสถานะการทดสอบในระเบียน DNS TXT และเพิ่ม TTL
ทำ!