SRS tarkvara postsrsd kasutamine Postfix keskkonnas
Sissejuhatus
SRS (Sender Rewriting Scheme) http://www.openspf.org/SRS aitab remaileril töötada SPF'i kasutavate domeenide kirjadega. Käesolev tekst tutvustab postsrsd https://github.com/roehling/postsrsd tarkvara kasutamist Postfix keskkonnas.
Mõisted
- SRS - Sender Rewriting Scheme
- remailer - spetsialiseeritud postimasin, mis suunab ühele aadressile saabunud kirju edasi teisele aadressile; remailer ei sisalda postkasti; üldselt toimub see sisse tulnud kirja 'rcpt to' väärtuse asendamise abil (nt /etc/aliases failiga)
- mail from - ümbriku saatja aadress
- rcpt to - ümbriku saaja aadress
- header From - kirja nn body osa päis, saatja aadress
- header To - kirja nn body osa päis, saaja aadress
Tööpõhimõte
SRS tehnika aitab remailerit kahes osas
- remailerist väljuva kirja 'mail from' peab sisaldab remaileri teenuse pakkuja domeeni
- remailer peab oskama välja saadetud kirjale vastava võimaliku internetist tuleva veateate toimetada kirja algsele 'mail from' aadressile
Näited remaileritest
- Mailman listserver - tundub, et Mailman ise sisaldab piisavat palju SRS instrumente ja postsrsd tarkvara kasutamine ei ole vajalik
Legacy edasisuunamine
Priit saadab kirja Imrele kasutades tema vana aadressi, kust on tehtud edasisuunamine Imre uuele aadressile.
_____ _____ | | mail from: priit@vana-sober.ee | | imre@uus-aadress.ee | A | 10.100.1.25 | C | |_____| |_____| _____ | | imre@vana-aadress.ee | B | 10.200.1.25 |_____|
kus
- arvutist A saadetakse välja kiri, 'mail from: priit@vana-sober.ee' ja 'rcpt to: imre@vana-aadress'
- domeeni vana-sober.ee spf on 'v=spf1 ip4:10.100.1.25 -all'
- domeeni vana-aadress.ee spf on 'v=spf1 ip4:10.200.1.25 -all'
- kirju jõuab remailer arvutisse B ja /etc/aliases faili abil kirjutatakse rcpt to aadressi ringi; mail from aadress jääb samaks
rcpt to: imre@vana-aadress.ee -> imre@uus-aadress.ee mail from: priit@vana-sober.ee -> priit@vana-sober.ee
- kiri jõuab kohale arvutisse C; tekib probleem, et 'mail from' mõttes vana-sober.ee kiri tuli spf mõttes sobimatult ip aadressilt 10.200.1.25
SRS edasisuunamine
Priit saadab kirja Imrele kasutades tema vana aadressi; kust on tehtud edasisuunamine Imre uuele aadressile.
_____ _____ | | mail from: priit@vana-sober.ee | | imre@uus-aadress.ee | A | 10.100.1.25 | C | |_____| |_____| _____ | | remailer | B | imre@vana-aadress.ee |_____| 10.200.1.25
kus
- arvutist A saadetakse välja kiri, 'mail from: priit@vana-sober.ee' ja 'rcpt to: imre@vana-aadress'
- domeeni vana-sober.ee spf on 'v=spf1 ip4:10.100.1.25 -all'
- domeeni vana-aadress.ee spf on 'v=spf1 ip4:10.200.1.25 -all'
- kirju jõuab remailer arvutisse B ja /etc/aliases faili abil kirjutatakse rcpt to aadressi ringi
rcpt to: imre@vana-aadress.ee -> imre@uus-aadress.ee
- postsrsd abil kirjutatakse mail from aadress ringi
mail from: priit@vana-sober.ee -> SRS0=wsq7=2A=vana-sober.ee=priit@vana-aadress.ee
- kiri jõuab kohale arvutisse C; probleemi ole, vana-sober.ee kiri tuli 'mail from' muudetud väärtusega vana-aadress.ee ja spf mõttes sobivalt ip aadressilt 10.200.1.25
SRS edasisuunamisele internetist tuleva vastuse algsele mail from aadressile toimetamine
Priit saadab kirja Imrele kasutades tema vana aadressi; kust on tehtud edasisuunamine Imre uuele aadressile.
_____ _____ | | mail from: priit@vana-sober.ee | | imre@uus-aadress.ee | A | 10.100.1.25 | C | |_____| |_____| _____ _____ | | remailer | | imre@vaga-uus-aadress.ee | B | imre@vana-aadress.ee | D | mida ei ole |_____| 10.200.1.25 |_____|
kus
- arvutist A saadetakse välja kiri, 'mail from: priit@vana-sober.ee' ja 'rcpt to: imre@vana-aadress'
- domeeni vana-sober.ee spf on 'v=spf1 ip4:10.100.1.25 -all'
- domeeni vana-aadress.ee spf on 'v=spf1 ip4:10.200.1.25 -all'
- kirju jõuab remailer arvutisse B ja /etc/aliases faili abil kirjutatakse rcpt to aadressi ringi
rcpt to: imre@vana-aadress.ee -> imre@uus-aadress.ee
- postsrsd abil kirjutatakse mail from aadress ringi
mail from: priit@vana-sober.ee -> SRS0=wsq7=2A=vana-sober.ee=priit@vana-aadress.ee
- kiri jõuab kohale arvutisse C ja sealt püütakse saata edasi arvutisse D, mis ebaõnnestub
- arvuti C proovib mõnda aega ja saadab siis veateate kirja aadressile SRS0=wsq7=2A=vana-sober.ee=priit@vana-aadress.ee arvutisse B
- arvuti B tuletab postsrsd tarkvara abiga SRS0=wsq7=2A=vana-sober.ee=priit@vana-aadress.ee aadressist algse saatja aadressi priit@vana-sober.ee ning krüpto ja ajatempli osa (wsq7 ja 2A) abil veendub, et asi on õige
- arvuti B saadab veateate edasi algsele aadressile priit@vana-sober.ee
Seejuures
- arvuti C koostatud veateate kirjas on 'mail from' on <> ja mille 'header From:' on 'MAILER-DAEMON ...', algsesse kohta jõuab see teade just sellisena
- arvuti C koostatud veateate kirjas on 'rctp to' ja 'header To:' aadressiks 'SRS0=wsq7=2A=vana-sober.ee=priit@vana-aadress.ee'
- arvuti B postsrsd + postfix teisendavad ja asendavad need mõlemad aadressiga 'priit@vana-sober.ee'
Väited
- tavaliselt on kirja internetti saatev arvuti (kus toimib SRS) on sama, mis võtab võimalikud bounce'id internetist vastu; tundub ei kui sama SRS_SECRET väärtust kasutada, siis võivad need olla ka erinevad arvutid
- postsrsd kasutab Postfixi canonical tabeleid, ja omakorda tcp-tüüpi variante neist
- recipient_canonical_maps abil saab sisuliselt tekitada /etc/aliases funktsionaalsuse
- srs eposti aadressi on kodeeritud aadress, kuhu postimasin saadab edasisuunatud kirja, selles mõttes tegu on võimalusega süsteemi väärkasutada
- postsrsd tarkvara ei pruugi kasutada spetsialiseeritud remaileri juures, vaid see võiks olla asjakohane suvalises muu hulgas ainult natuke /etc/aliases abil kirju edasisuunavas arvutis
- srs muutumise vastu open relay smtp sõlmeks aitab srs aadressi lisaks kodeeritud nn signatuur ja ajatempel
SRS0=wsq7=2A=gmail.com=imre.oolberg@moraal.ee
kus
- wsq7 - signatuur
- 2A - ajatempel
Tarkvara paigaldamine, seadistamine ja käivitamine
Tarkvara paialdamiseks sobib öelda
# apt-get install postsrsd
postsrsd seadistused asuvad failis /etc/default/postsrsd
# egrep -v "^$|^#" /etc/default/postsrsd SRS_DOMAIN=moraal.ee SRS_EXCLUDE_DOMAINS=auul.pri.ee SRS_SEPARATOR== SRS_SECRET=/etc/postsrsd.secret SRS_FORWARD_PORT=10001 SRS_REVERSE_PORT=10002 RUN_AS=postsrsd CHROOT=/var/lib/postsrsd
kus
- SRS_DOMAIN - millise domeeni peale teisendatud aadressid moodustatakse (moodustatud aadressi @ märgist paremale jääv osa)
Postfixiga integreerimiseks peab main.cf faili sisaldama muu hulgas
sender_canonical_maps = tcp:localhost:10001 sender_canonical_classes = envelope_sender recipient_canonical_maps = tcp:localhost:10002 recipient_canonical_classes = envelope_recipient, header_recipient local_header_rewrite_clients = static:all
kus
- ilma 'local_header_rewrite_clients = static:all' parameetrita töötab kirja body 'From:' aadressi ümberkirjutamine vaid lokaalselt genereeritud kirjade jaoks; kuna bounce teated tulevad internetist, siis on see praktiliselt alati vajalik
- recipient_canonical_classes = envelope_recipient, header_recipient - envelope_* ja header_* tähendavad, et tegeldakse vastavalt ümbriku mail from ja body osa header From: aadresside teisendamisega
TCP tabelite tööd saab kontrollida, teisendus
# postmap -q imre.oolberg@gmail.com tcp:localhost:10001 SRS0=wsq7=2A=gmail.com=imre.oolberg@moraal.ee
pöördteisendus
# postmap -q SRS0=wsq7=2A=gmail.com=imre.oolberg@moraal.ee tcp:localhost:10002 imre.oolberg@gmail.com
muutuseta teisendus
# postmap -q imre.oolberg@moraal.ee tcp:localhost:10001 imre.oolberg@moraal.ee
Kasutamine
Kirja saatmise testimiseks sobib öelda
$ sendemail -f priit@auul.pri.ee -t imre@moraal.ee -u 'test 36' -s 127.0.0.1 -m 'test 36' -o tls=no
kus
- TODO
Lähtetekstist kompileerimine
Ettevalmistuseks peab olema
# apt-get install build-essentials make cmake
Pakkida .zip lahti kataloogi ja öelda
$ make
tulemusena tekib fail build/postsrsd, käivitamiseks tekistada
- /etc/postsrsd.secret
ja öelda
$ ./postsrsd -f 10001 -r 10002 -d moraal.ee -s /etc/postsrsd.secret -a = -u imre -X
Tulemusena saab portidele 10001 ja 10002 esitada postmap abil päringuid.
Käivitusskript
# cat /etc/init.d/postsrsd #!/bin/sh ### BEGIN INIT INFO # Provides: bks # Required-Start: $network $local_fs $remote_fs $all # Required-Stop: $network $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: postsrsd ### END INIT INFO case "$1" in start) echo "Starting postsrsd" su - postsrsd -c 'cd /opt/postsrsd/bin && ./postsrsd -f 10001 -r 10002 -d moraal.ee -s /etc/postsrsd.secret -a = -u postsrsd -X -D' ;; stop) echo "Stopping postsrsd" PID=`pgrep -u postsrsd postsrsd` if [ "X$PID" = "X" ]; then echo "" else kill $PID fi ;; *) echo "Usage: /etc/init.d/postsrsd { start | stop }" exit 1 esac exit 0
Märkused
- programmile tuttavad suvandid
$ /opt/postsrsd/bin/postsrsd -h Sender Rewriting Scheme implementation for Postfix. Implements two TCP lookup tables to rewrite mail addresses as needed. The forward SRS is for sender envelope addresses to prevent SPF-related bounces. The reverse SRS is for recipient envelope addresses so that bounced mails can be routed back to their original sender. Usage: postsrsd -s<file> -d<domain> [other options] Options: -s<file> read secrets from file (required) -d<domain> set domain name for rewrite (required) -a<char> set first separator character which can be one of: -=+ (default: =) -f<port> set port for the forward SRS lookup (default: 10001) -r<port> set port for the reverse SRS lookup (default: 10002) -p<pidfile> write process ID to pidfile (default: none) -c<dir> chroot to <dir> (default: none) -u<user> switch user id after port bind (default: none) -t<seconds> timeout for idle client connections (default: 1800) -X<domain> exclude additional domain from address rewriting -e attempt to read above parameters from environment -D fork into background -4 force IPv4 socket (default: any) -6 force IPv6 socket (default: any) -h show this help -v show version
dst domeeni kirjade srs ümberkirjutamine
Üldised väited
- üldiselt kirjutab postsrsd kõik süsteemist läbikäivad kirjad ümber
- üldiselt töötab ühe domeeni srs teisenduse tegemine selliselt, et transport abil suunatakse sisenenud kirjad 127.0.0.1:10027 pordil töötavale spetsiaalselt seadistatud smtpd serverile
- 10027 server teeb srs teisenduse cleanup-srs abil
- peale teisendust saadab 10027 server kirjad internetti 'content_filter=smtp:' abil
Erilised väited
- antud juhul on raskendavaks asjaoluks virtual_ sistema kasutamine, tänu sellele ei tööta tavaline transport
- selleks, et saaks transport'i kasutada kasutakse abistavaid dst aadresse virtual_aliastena (imre.oolberg@gmail.com.srs-auulpriee)
- enne kirja väljumist kirjutatakse see abistav aadress tagasi normaalseks regexp abil
Olgu lähtepunktiks selliselt töötav postfix, st kasutusel on virtual aliased, ja neid on teisigi lisaks @auul.pri.ee aadressidele (st kõiki @auul.pri.ee kirju saadetakse edasi)
... virtual_mailbox_domains = /etc/postfix/virtual_mailbox_domains.txt virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps-auul.pri.ee.txt ...
Olgu eesmärgiks, et @auul.pri.ee kirjade edasisaatmisel rakendatakse srs teisendust, ja ainult selle domeeni kõigil kirjadel. Selle tulemuse saavutamiseks on lisaks tavalisele postsrsd kasutamisel sobilik teha postfixis sellised muudatused
main.cf failis on muu hulgas
recipient_canonical_maps = tcp:localhost:10002 recipient_canonical_classes = envelope_recipient, header_recipient local_header_rewrite_clients = static:all transport_maps = regexp:/etc/postfix/transport virtual_mailbox_domains = /etc/postfix/virtual_mailbox_domains.txt virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps-auul.pri.ee.txt
master.cf failis on muu hulgas
cleanup-srs unix n - - - 0 cleanup -o sender_canonical_maps=tcp:localhost:10001 -o sender_canonical_classes=envelope_sender -o recipient_canonical_maps=regexp:/etc/postfix/recipient_canonical_maps.regexp 127.0.0.1:10027 inet n - - - - smtpd -o cleanup_service_name=cleanup-srs -o smtpd_tls_security_level=none -o content_filter=smtp: -o smtpd_recipient_restrictions=permit_mynetworks,reject
kus
# cat /etc/postfix/virtual_alias_maps-auul.pri.ee.txt imre.oolberg@auul.pri.ee imre.oolberg@gmail.com.srs-auulpriee
ja
# cat /etc/postfix/recipient_canonical_maps.regex /(.*)@(.*)\.srs-auulpriee$/ ${1}@${2}
ja
# cat /etc/postfix/transport /^.*@.*srs-auulpriee$/ smtp:127.0.0.1:10027
Kasulikud lisamaterjalid