Exim จำกัด โดเมน“ ที่อยู่” หนึ่งโดเมนไว้ที่ จำกัด เฉพาะผู้ใช้ระบบ


0

ฉันเรียกใช้เซิร์ฟเวอร์ที่ใช้ร่วมกันสำหรับเว็บไซต์ของลูกค้า (อูบุนตู 16.04) ฉันเรียกใช้ exim เพื่ออนุญาตให้เว็บไซต์ส่งอีเมล นอกจากนี้ยังทำหน้าที่เป็นผู้ส่งต่อจดหมายและเซิร์ฟเวอร์ smtp สำหรับซอฟต์แวร์อีเมล cleints ของฉัน (หรือเพียงแค่ gmail) เพื่อให้พวกเขาส่งอีเมลจากผู้ส่งของพวกเขา

ขณะนี้ฉัน จำกัด การส่งอีเมลสำหรับผู้ใช้ระยะไกลเพื่ออนุญาตที่อยู่ "จาก" เฉพาะเมื่อตรงกับชื่อผู้ใช้ smtp ของพวกเขา (เพื่อหยุดไคลเอ็นต์หนึ่งสามารถส่งอีเมลเป็นลูกค้าอื่น) ผู้ใช้ smtp ระยะไกลไม่ใช่ผู้ใช้ระบบพวกเขาเป็นเพียงข้อมูลรับรองที่เก็บไว้ในไฟล์ passwd มันใช้งานได้ดีมาก

อีเมลเดียวที่ส่งโดยผู้ใช้ท้องถิ่นมาจากสคริปต์ PHP แต่ละเว็บไซต์ทำงานในฐานะผู้ใช้ที่แตกต่างกัน เช่น example.com ทำงานเป็นผู้ใช้ "ตัวอย่าง" test.com ทำงานเป็นผู้ใช้ "ทดสอบ" คำถามของฉันคือฉันจะ จำกัด บัญชีผู้ใช้ในท้องถิ่นให้สามารถส่งอีเมลจากโดเมนเดียวได้อย่างไร ดังนั้นผู้ใช้ "ทดสอบ" สามารถส่งจาก anyaddress@test.com แต่ไม่สามารถส่งจาก anyaddress@example.com ได้

โดยอุดมคติแล้วฉันต้องการให้สคริปต์ทดสอบดูในไฟล์เช่นconf/env{USER}/allowed-from-domainsและทดสอบโดเมนของFrom:ฟิลด์เพื่อให้แน่ใจว่าเป็นไฟล์นั้น

คำตอบ:


0

การกำหนดค่าด้านล่างนี้สร้างข้อความบล็อก exim จากผู้ใช้exampleและtestเมื่อFromส่วนหัวไม่มี "@ example.com" หรือ "@ test.net" ตามลำดับ

ฉันใช้ตัวกรองระบบเพื่อตรวจสอบFromบรรทัดส่วนหัวซึ่งใช้ได้เฉพาะหลังจากที่ข้อความได้รับการยอมรับ

exim.conf:

system_filter  = /etc/exim/system_filter.conf
qualify_domain = mydomain.net

system_filter.conf:

if $sender_address is "example@$qualify_domain" and not $h_from contains "@example.com"
or $sender_address is    "test@$qualify_domain" and not $h_from contains "@test.net"
then
  seen finish
endif

ทดสอบเมลขาออกสำหรับผู้ใช้โลคัล test

test.php

#!/bin/php
<?php
mail( "me@gmail.com", "Pass Test", "My message", "From: Me <anything@test.net>" );
mail( "me@gmail.com", "Fail Test", "My message", "From: Me <anything@nottest.net>" );
?>

หมายเหตุเว็บเซิร์ฟเวอร์

ทั้งหมดนี้ถือว่า php กำลังถูกเรียกโดยบัญชีผู้ใช้ของลูกค้า คุณอาจต้องกำหนดค่าเว็บเซิร์ฟเวอร์ของคุณใหม่เพื่อทำสิ่งนี้ ตัวอย่างเช่นเว็บเซิร์ฟเวอร์ apache มักจะเรียกใช้สคริปต์ในฐานะผู้ใช้ "apache" แทนที่จะเป็น "test" หรือ "example" ซึ่งเป็นสิ่งที่เราต้องการ Apache จะต้องมีการกำหนดค่าด้วยสิ่งที่ต้องการ mod_privileges.c หรือ mpm-itk

หากเว็บเซิร์ฟเวอร์ของคุณได้รับการกำหนดค่าให้ใช้โหมด CGI / FastCGI คุณอาจทำได้โดยเพิ่ม [HOST = example.com] และ [HOST = test.net] ใน php.ini

อ้างอิง:


ขอบคุณสำหรับคำตอบ. คุณสามารถชี้แจงสำหรับผมที่จะif $sender_address is "example@$qualify_domain"หมายถึงตัวอย่างเช่นexample@hostname? PHP no-reply@domain.comสคริปต์ของฉันตั้งจากที่อยู่เพื่อสิ่งที่ต้องการ กฎนี้จะไม่ตรงกันหรือไม่
James Swift

ฉันได้อัปเดตคำถามของฉันด้วยย่อหน้าซึ่งหวังว่าจะทำให้ความคิดของฉันชัดเจนขึ้น
James Swift

qualify_domain เป็นสิ่งที่คุณกำหนดให้เป็น exim.conf ( qualify_domain = mydomain.net) มันต่อท้ายที่อยู่อีเมลที่ไม่มีโดเมน โดยเฉพาะอย่างยิ่งถ้าฉันเข้าสู่ระบบเป็นfredและเรียกจดหมายจะปรากฏขึ้นมาจากtest.php fred@mydomain.net
Jim U

PHP กำลังสร้างที่อยู่ผู้ส่งสำหรับส่วนหัว (กำหนดโดยพารามิเตอร์ที่ 3 ของอีเมล) และผู้ส่งซองจดหมาย (ซึ่งสามารถกำหนดได้โดยอาร์กิวเมนต์ -f ของพารามิเตอร์หลักตัวที่ 5) เพราะสิ่งเหล่านี้สามารถปลอมแปลงได้โดยผู้ใช้ของคุณบางทีคุณอาจจะต้องการปรับเปลี่ยนphp.iniไปอย่างชัดเจนตั้งค่าผู้ส่งซองจดหมายต่อโดเมนใช้สิ่งที่ต้องการหรือ[PATH=...] [HOST=...] mail.force_extra_parameters = -fdefault@test.netจากนั้นบางทีคุณไม่จำเป็นต้องใช้qualify_domainและใช้ที่อยู่ที่คุณกำหนดไว้ใน php.ini แทนsystem_filter.conf
Jim U

การตั้งค่า php ของฉันใช้ php-fpm เพื่อเรียกใช้แต่ละเว็บไซต์ตามที่ผู้ใช้เป็นเจ้าของ คุณพูดSince these can be forged by your users..ดังนั้นเหตุผลที่ฉันต้องการ จำกัด ที่อยู่ขาออกเป็น exim ปลอดภัยกว่านั้นอีกกว่าการติดตั้ง php.ini ที่บอบบาง
James Swift
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.