บังคับให้ที่อยู่จากเมื่อรีเลย์ postfix ทับ smtp


28

ฉันพยายามรับรายงานอีเมลจากอินสแตนซ์ AWS EC2 ของเรา เรากำลังใช้ Exchange Online (ส่วนหนึ่งของ Microsoft Online Services) ฉันตั้งค่าบัญชีผู้ใช้โดยเฉพาะสำหรับการส่งต่อSMTPและฉันได้ติดตั้ง Postfix เพื่อให้ตรงตามข้อกำหนดทั้งหมดในการส่งต่อข้อความผ่านเซิร์ฟเวอร์นี้ อย่างไรก็ตามเซิร์ฟเวอร์ SMTP ของ Exchange Online จะปฏิเสธข้อความยกเว้นว่าที่อยู่จากตรงกับที่อยู่รับรองความถูกต้อง550 5.7.1 Client does not have permissions to send as this senderทุกประการ(ข้อความแสดงข้อผิดพลาดคือ)

ด้วยการกำหนดค่าอย่างระมัดระวังฉันสามารถตั้งค่าบริการเพื่อส่งในฐานะผู้ใช้รายนี้ แต่ฉันไม่ได้เป็นแฟนตัวยงของการระมัดระวัง - ฉันควรจะบังคับให้ปัญหา มีวิธีทำเช่นนี้หรือไม่?

คำตอบ:


38

นี่คือวิธีการทำใน postfix

การกำหนดค่านี้จะเปลี่ยนที่อยู่ผู้ส่งจากทั้งการรับส่งจดหมายในท้องถิ่นและการรับส่งเมล SMTP แบบส่งต่อ:

/etc/postfix/main.cf:

sender_canonical_classes = envelope_sender, header_sender
sender_canonical_maps =  regexp:/etc/postfix/sender_canonical_maps
smtp_header_checks = regexp:/etc/postfix/header_check

เขียนที่อยู่ซองจดหมายจากอีเมลที่มาจากเซิร์ฟเวอร์เอง

/ etc / postfix / sender_canonical_maps:

/.+/    newsender@address.com

เขียนซ้ำจากที่อยู่ในอีเมลที่ส่งต่อ SMTP

/ etc / postfix / header_check:

/From:.*/ REPLACE From: newsender@address.com

มีประโยชน์มากถ้าคุณใช้อินสแตนซ์ของเซิร์ฟเวอร์รีเลย์ smtp ซึ่งใช้โดยเครื่องมัลติฟังก์ชั่นและแอพพลิเคชั่นหลายตัวของคุณ

หากคุณใช้เซิร์ฟเวอร์ Office 365 SMTP จดหมายใด ๆ ที่มีที่อยู่ผู้ส่งแตกต่างจากอีเมลจากผู้ใช้ที่ผ่านการตรวจสอบสิทธิ์นั้นจะถูกปฏิเสธ การกำหนดค่าข้างต้นป้องกันสิ่งนี้


ขอบคุณ! ดูเหมือนว่าสิ่งที่ฉันกำลังมองหา น่าเสียดายที่การเข้าถึง Office 365 ของฉันเป็นงานสองงานที่ผ่านมา มีใครยืนยันได้ไหมว่าสิ่งนี้ใช้ได้กับพวกเขาหรือไม่?
John Whitlock

1
ฉันสามารถ. ฉันกำลังใช้สิ่งนี้กับ office 365
Jasper

1
เมื่อใช้sender_canonical_mapspostfix ไม่สามารถบันทึกจดหมายปฏิเสธที่จะปูลท้องถิ่นและแทนที่จะพยายามที่จะส่งผ่านการถ่ายทอดอนันต์
ลุ่มน้ำ

2
@Jasper FYI ฉันพบว่าสิ่งนี้ง่ายกว่าในการเปลี่ยนการกำหนดค่าด้านบนpostconf -e sender_canonical_classes=envelope_sender,header_sender postconf -e sender_canonical_maps=regexp:/etc/postfix/sender_canonical_maps postconf -e smtp_header_checks=regexp:/etc/postfix/header_check
Jacob Evans

มีปัญหาที่คล้ายกันsender_canonical_classes = envelope_senderบันทึกวันของฉัน!
Stephan Richter

13

ตารางทั่วไปที่เป็นทางเลือกระบุการแม็พแอดเดรสที่ใช้เมื่อเมลถูกส่ง (ส่ง) จากเซิร์ฟเวอร์

นี่คือสิ่งที่ตรงกันข้ามกับการแมปแบบบัญญัติซึ่งใช้เมื่อเซิร์ฟเวอร์ได้รับจดหมาย

(หมายเหตุ: ที่อยู่ทั้งจากและที่อยู่ถูกจับคู่เพื่อแทนที่ตารางทั่วไปและตารางบัญญัติใด ๆ )

การใช้ตาราง canonical เมื่อเซิร์ฟเวอร์ได้รับจดหมายอธิบายไว้แล้วคือคำตอบอื่น ๆ

คุณสามารถเขียนจากที่อยู่เมื่อมีจดหมายถูกส่งจากเซิร์ฟเวอร์smtp_generic_mapsที่ใช้

ตามเอกสาร postfix :

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    user@localdomain.local      account@isp.example.com
    @localdomain.local          wholedomain@isp.example.com

จากนั้นทำ:

sudo postmap /etc/postfix/generic
sudo /etc/init.d/postfix reload

อ้างอิง:


1
ใช้งานได้ แต่ฉันจะเปลี่ยนชื่อ FROM ได้อย่างไร
Joanna Mikalai

ประสบการณ์ของฉันกับแผนที่ทั่วไปคือมันจะระบุทั้งที่อยู่จากและที่อยู่ใช้แผนที่ที่เป็นที่ยอมรับเพื่อบังคับใช้ที่อยู่เพียงอย่างเดียวจากที่ OP ร้องขอ
doz87

เป็นไปได้หรือไม่ที่จะเปลี่ยนที่อยู่อีเมลของผู้ส่งและจับคู่ที่อยู่ผู้ส่งโดยใช้ regex?
WM

@ doz87 ทั้งจากและถึงจะถูกจับคู่โดยแผนที่ทั้งบัญญัติและสามัญ ฉันได้อัปเดตคำตอบเพื่ออธิบายความแตกต่างระหว่างแผนที่ทั้งสองแล้ว
โจเซลีน

@WM ใช่คุณสามารถใช้ regexp ฉันไม่เคยลอง แต่คุณอาจจะต้องเปลี่ยนhash:เป็นregexp:main.cf และใช้เส้นเหมือน/foo.*@localdomain.local/ account@example.comในแผนที่ทั่วไป นี่คือคำอธิบายในหน้าคน: postfix.org/generic.5.html
Jocelyn

7

อัปเดต: ตามคำแนะนำของเพื่อนไอทีฉันกำลังเรียกใช้ postfix บนเซิร์ฟเวอร์ทั้งหมดของฉันแทนที่จะสร้างเซิร์ฟเวอร์จดหมายระบบคลาวด์หนึ่งเซิร์ฟเวอร์ นี่คือทางออกของฉัน:

/etc/postfix/main.cf

# output of hostname -f - mail from local users appears to come from here
myhostname = domU-01-02-03-04-05-06.compute-1.internal
# Local delivery - include all 127.0.0.1 aliases from /etc/hosts
mydestination = $myhostname, $mydomain, rest_of_entries_from_hosts
# Needed for address translation to work
myorigin = $mydomain

# Talking to MS Online
# :submission = port 587
relayhost = [smtp.mail.microsoftonline.com]:submission
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options =   # Yes, leave empty
smtp_tls_security_level = encrypt
smtp_generic_maps = hash:/etc/postfix/generic

# Enable if you need debugging, but it does leak credentials to the log
#debug_peer_level = 2
#debug_peer_list = smtp.mail.microsoftonline.com

# Only listen on the local interfaces (not the public)
inet_interfaces = localhost

# I left out a bunch of CentOS defaults.  postconf -n is your friend.
# These are included
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

/etc/postfix/sasl_passwd

# Run postmap /etc/postfix/sasl_passwd after editing
# Also, chown root:root; chmod 600
smtp.mail.microsoftonline.com relayer@hosteddomain.com:YourP@ssw0rd

/etc/postfix/generic

# Run postmap /etc/postfix/generic
# I've seen local mail come from either source
# output of dnsdomainname
@compute-1.internal relayer@hosteddomain.com
# output of hostname -f
@domU-01-02-03-04-05-06.compute-1.internal relayer@hosteddomain.com

/etc/aliases

# Run newaliases after changing
# Lot of stuff here. Mostly, just make sure the graph points to root, such as
mailer-daemon:  postmaster
postmaster:     root

# And the important part - your email or distribution group
root:           awsadmins@hosteddomain.com

/etc/passwd

# Sometimes it helps to expand the name, so email comes from 'root at aws host 5'
#  rather than just 'root'
# Was
#root:x:0:0:root:/root:/bin/bash
# Is
root:x:0:0:root on aws host 5:/root:/bin/bash

สิ่งที่ฉันมีความสุขเกี่ยวกับ:

  • อีเมลจำนวนมากถูกส่งไปยังรูทและอีกหนึ่งบรรทัดaliasนำผู้ที่ได้รับมา
  • จดหมายทั้งหมดจากผู้ใช้ในท้องถิ่นได้รับการแปลเป็นภาษาที่มาจากrelayer@hosteddomain.comดังนั้นจึงได้รับผ่านเซิร์ฟเวอร์ MS Online SMTP
  • postfix มีเอกสารที่ดีกว่า sendmail

สิ่งที่ฉันไม่มีความสุขเกี่ยวกับ:

  • การเปลี่ยนแปลงที่กำหนดเองเป็นสิ่งจำเป็นสำหรับแต่ละโฮสต์และหลายขั้นตอน ฉันเขียนสคริปต์ทุบตีเพื่อช่วย
  • passwdชื่อเคล็ดลับไม่เคยทำงานและมันอาจเป็นเรื่องยากที่จะคิดออกว่าเซิร์ฟเวอร์อีเมลที่มาจาก
  • ทุกจดหมายที่ส่งจะมีคำเตือนสามรายการในบันทึก:
    1. warning: smtp.mail.microsoftonline.com[65.55.171.153] offered null AUTH mechanism list(เซิร์ฟเวอร์ SMTP ส่งAUTHรายการว่างก่อนSTARTTLSแต่AUTH LOGINหลัง)
    2. certificate verification failed for smtp.mail.microsoftonline.com: num=20:unable to get local issuer certificate (มีบางตัวเลือกการกำหนดค่ารอบ ๆ certs แต่ฉันไม่แน่ใจว่าการส่งจดหมายหยุดลงเมื่อมีการต่ออายุใบรับรอง)
    3. certificate verification failed for smtp.mail.microsoftonline.com: num=27:certificate not trusted (เหมือนกับ # 2)

ขอบคุณชุมชน serverfault สำหรับการแบ่งปันความคิดเห็นที่ดีในเมลเซิร์ฟเวอร์


4

คุณสามารถใช้smtpd_sender_login_mapsเพื่อระบุรายการแผนที่: ที่อยู่ผู้ส่ง - ผู้ใช้

ตัวอย่าง:

smtpd_sender_login_maps = 
    hash:/etc/postfix/login-map 

/ etc / postfix / เข้าสู่ระบบแผนที่:

mail1@domain    userlogin
mail2@domain    userlogin, otheruser@example.com

มันใช้งานได้สำหรับการส่งมันควรจะทำงานเพื่อถ่ายทอดในลักษณะเดียวกัน


มีวัตถุประสงค์เพื่อเขียนที่อยู่จากที่เวลาคิวหรือไม่ ความประทับใจของฉันคือ smtpd_sender_login_maps ใช้เพื่อปฏิเสธผู้ส่ง (เป็นส่วนหนึ่งของ smtpd_sender_restrictions) ไม่ใช่เพื่อแปลการเข้าสู่ระบบไปยังที่อยู่อีเมล ด้วยสิ่งนี้ในสถานที่echo "This is a test" | /usr/sbin/sendmail test@example.comยังคงอยู่ในคิว (และในที่สุดก็รีเลย์) จดหมายที่มาจากuser@domU-DE-AD-BE-EF-00-01.compute-1.internal
จอห์นวิทล็อค

ไม่ดีของฉันฉันก็เข้าใจว่าคุณอนุญาตให้ postfix ของคุณ ในกรณีเช่นนี้ smtpd_sender_login_maps จะ จำกัด สิ่งที่ผู้ใช้สามารถใช้ที่อยู่ของผู้ส่งได้
ผ้าไหม

นี่อาจเป็นส่วนหนึ่งของทางออกสุดท้ายของฉัน ฉันสามารถปฏิเสธได้ทั้งหมดยกเว้นที่อยู่ผู้ส่งหนึ่งรายการที่ส่วนหน้าและแจ้งให้ผู้ดูแลระบบทราบถึงการปฏิเสธส่วนหน้าใด ๆ เพื่อแจ้งให้เราทราบเมื่อบริการไม่ได้กำหนดค่าอย่างถูกต้อง ฉันกำลังดู smtp_generic_maps เพื่อดูว่าฉันสามารถใช้พวกเขาเพื่อปรับเปลี่ยนบัญชีท้องถิ่นทั้งหมดเป็น One True From Address หรือไม่ แต่ฉันต้องอ่านเอกสาร postfix อีกครั้งเพื่อให้เข้าใจว่าเป็นตัวกำหนดบัญชีในท้องที่ได้อย่างไร AWS DNS ไม่ตรงกับสัญชาตญาณของฉัน
John Whitlock

0

ฉันใช้การทำแผนที่แบบบัญญัติเพื่อเขียนที่อยู่ใหม่เช่นเขียนใหม่ root @ app01 เป็น no-reply@example.com


3
ยินดีต้อนรับสู่ Server Fault! เราชอบที่คำตอบนั้นมีเนื้อหาไม่ใช่ตัวชี้ไปที่เนื้อหา ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
user9517 รองรับ GoFundMonica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.