SRS tarkvara postsrsd kasutamine Postfix keskkonnas

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

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

Kasulikud lisamaterjalid