In ‘technisch’ gepostet

Debian Wheezy, Postfix und SRS

Mittwoch, 7. August, 2013

Ich betreibe für vom.tc einen Postfix-Mailserver und habe dort vor ewigen Zeiten SPF-Prüfung aktiviert. Unter wheezy ist das eher langweilig:

apt-get install postfix-policyd-spf-perl


Danach die master.cf ergänzen um

spfcheck  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/sbin/postfix-policyd-spf-perl


und main.cf um

smtpd_recipient_restrictions =
        permit_mynetworks
        reject_unauth_destination
        check_policy_service unix:private/spfcheck

Wer sich mit SPF auseinandergesetzt hat, weiß, dass es zu Problemen bei der Weiterleitung von E-Mails kommen kann.
Beispiel: paul@example.com leitet seine E-Mails an paul@example.net weiter. Schickt nun peter@example.net eine E-Mail an paul@example.com wird der Mailserver von example.com die E-Mail empfangen und den Empfänger auf paul@example.net ändern. Nutzt example.net SPF wird er diese E-Mail ablehnen, da der Absender peter@example.net ist und example.com keine E-Mails im Namen von example.net verschicken darf. Works As Designed. Dough.

Lösung: Sender Rewriting Scheme (kurz SRS)

Die Idee bei SRS ist es die ursprüngliche Absenderadresse in eine Adresse zu kodieren, für die der Mailserver Mails laut SPF verschicken darf. Dabei wird ein Hash und ein Zeitstempel ergänzt, um SPF-gültigen SPAM zu vermeiden und gleichzeitig eventuelle Fehlermeldungen an den ursprünglichen Absender weiterleiten zu können.

Etwas googlen hat mich dann an diese Orte gebracht:

Für mich war recht schnell klar, dass ich möglichst viel mit den Boardmitteln machen möchte. Nachdem die libsrs2-0 mit squeeze scheinbar endet, habe ich mir das Paket srs genauer angeguckt und entlang des Quelltextes oben zwei eigene Wrapper „srs_encode.sh“ und „srs_decode.sh“ geschrieben. Deren Verwendung möchte ich hier einmal skizzieren; sämtliche Dateien habe ich im Gist 6163083 hinterlegt.

1. Schritt: Das srs-Tool ans laufen bekommen

apt-get install srs
– anschließend müssen wir uns ein Secret für das Tool ausdenken. Meine Vorredner haben PHP verwendet um gleich mehrere Secrets zu erstellen, da aber das Tool nur das erste Secret zum Kodieren und alle zum Dekodieren nutzt, ist es in meinen Augen eher eine Sicherheitslücke als ein Vorteil bei einem einzelnen Server mehrere Zeilen zu verwenden. Bei mehreren Servern könnte man die Reihenfolge der Secrets allerdings durchtauschen, um aus der Adresse ableiten zu können, wo sie erstellt wurde.
Jede Art einen zufälligen String zu erzeugen ist gut, eine Methode, die einen sicheren Zufallszahlengenerator verwendet, besser. Ich habe
makepasswd --count 1 --minchars 42 --maxchars 84 >/etc/postfix/srs.secrets
verwendet (makepasswd ist aus dem gleichnamigen Paket). Anschließend per
chmod u=r,go= /etc/postfix/srs.secrets
sicher gehen, dass niemand das Secret liest.

Ein erster Test:
srs --alias=some.tld --secretfile=/etc/postfix/srs.secrets mail@example.com
> SRS0=fFqU=RU=example.com=mail@some.tld
srs --reverse --secretfile=/etc/postfix/srs.secrets SRS0=fFqU=RU=example.com=mail@some.tld
> mail@example.com

Es ist durchaus gängig eine eigene Sub-Domain für SRS-Adressen zu verwenden; einfach als --alias= beim Kodieren angeben. Das Dekodieren liest nur den Text links des @ und klappt bei euch hoffentlich nicht für mein Beispiel hier 😉

2. Wrapper Skripte

Die Skripte waren etwas tricky, da srs z.B. beim Dekodieren von E-Mail-Adressen mit einer anderen Groß-/Kleinschreibung im Hash zusätzlich zur dekodierten E-Mail-Adresse eine Warnung ausgibt. Um die beiden Skripte zu verwenden, ladet euch einfach srs-decode.sh und srs-encode.sh runter und legt sie unter /opt/srs/ ab (den Pfad werde ich gleich verwenden).

srs-encode.sh müsst ihr noch so anpassen, dass eure lokalen Domains durch den regulären Ausdruck erkannt werden und nicht umgewandelt werden (erzeugt nur Verwirrung) und die richtige Domain hinter --alias= steht.

Die Wrapper verwenden außer srs noch das Paket liburi-perl, das aber vermutlich bei den meisten ohnehin schon installiert ist.

Auch hier lohnt ein kleiner Test. Auf jede Eingabe der Form „get some@mail“ solltet ihr eine Antwort bekommen. Fängt die Antwortzeile mit 200 an, so wird Postfix die Adresse ändern, bei 400 und 500 wird sie nicht geändert. Die E-Mailadressen werden „URL-Encoded“ übertragen – wundert euch also nicht über %40 statt @.

3. Als Postfix-Tauglichen Dienst betreiben

Ein weiteres Paket, dass ohnehin auf den meisten Servern vorhanden ist, ist openbsd-inetd. Durch anfügen dieser drei Zeilen an die /etc/inetd.conf und Aufrufen von
service openbsd-inetd restart
machen wir aus unseren beiden Wrapper-Skripten per TCP erreichbare Dienste. Auch das sollten wir besser testen:

postmap -q mail@example.com tcp:10001
> SRS0=fFqU=RU=example.com=mail@some.tld
postmap -q SRS0=fFqU=RU=example.com=mail@some.tld tcp:10002
> mail@example.com

Wenn hier alles funktioniert (besser mehr Adressen testen!) können wir im letzten Schritt die Postfix-Konfiguration anpassen:

4. Postfix konfigurieren

Es gibt ein paar Adressen, die wir auf keinen Fall ändern wollen. Diese tragen wir in die /etc/postfix/pfix-srs.norewrite ein. Eine Vorlage findet ihr unten, bzw. hier
Immer, wenn wir die Datei ändern, rufen wir anschließend
postmap /etc/postfix/pfix-srs.norewrite
auf, um die von Postfix gelesene /etc/postfix/pfix-srs.norewrite.db zu aktualisieren.

In Postfix‘ main.cf kommen dann diese Zeilen, die dafür Sorgen, dass nur in der Kommunikation nach außen die umgeschriebenen Adressen verwendet werden. Ein
service postfix reload
später schlägt die Stunde der Wahrheit.

Getestet werden sollte das Weiterleiten einer extern abgeschickten E-Mail genau so, wie das Senden an eine SRS-Adresse und der allgemeine Betrieb (E-Mail von/an lokal). Wie immer ist der Teufel ein Eichhörnchen.

Alle Dateien auf einen Blick

Oh, eine Datei fehlt natürlich: die /etc/postfix/srs.secrets, die in Schritt 1 erstellt wurde 😉

Danke fürs lesen!

Ich freue mich über Feedback und auch um schönere Wrapper-Skripte z.B. in Perl.

Ruby und Windows 7

Donnerstag, 5. Januar, 2012

Neues Jahr, neues Glück.

Rails-Projekt von Github aktualisiert, bundle ausgeführt und… der erste Fehler. Das rmagick-gem streikt. Der Fehler ist leicht zu beheben: ImageMagick herunterladen in einem Pfad ohne Leerzeichen samt der C-Header installieren und dann selbst mit „gem install rmagick -v 2.13.1 -- --with-opt-dir=[Pfad]“ installieren.

Nachtrag: während der Installation muss ImageMagic im Pfad vor C:\windows\system32 liegen, sonst könnte sich das Tool zum konvertieren von FAT-Volumes in NTFS angespochen fühlen. Also noch ein PATH=C:\ImageMagick-6.8.0-Q16;%PATH% vorweg schicken.

Zweite Runde bundle. Alles scheint zu funktionieren. Erfreut ein rake db:migrate hinterher… „no library specified“. Schon etwas weniger leicht zu deuten als der erste Fehler. Ein --trace und etwas googeln später ist klar, dass ZBar fehlt (und nicht wie im ersten Moment gedacht ffi selbst einen Fehler hat). Die Installation von ZBar unter Windows 7 ist nach dem Installer erledigt, allerdings muss der Pfad noch in den Path eingefügt werden und anschließend die Umgebungsvariable ZBAR_LIB auf libzbar-0.dll gesetzt werden, da das zbar-gem sonst nicht im Path und nicht nach DLLs sucht.

Zweite Runde rake db:migrate. Die Vorfreude ist schon geringer geworden und tatsächlich, es gibt einen Fehler: „uninitialized constant RbReadline::Encoding“. Google direkt dazu gefragt auf diese Seite gestoßen. Scheinbar ein Ruby 1.8 Fehler. Die Anleitung befolgt (ok, ich habe Notepad++ statt Word genutzt, aber halt nur Zeile 4404 der C:\Ruby187\lib\ruby\site_ruby\1.8\rbreadline.rb auskommentiert.)

Dritte Runde rake db:migrate und die erste Überraschung: kein weiterer Fehler. Nach nur 2 Stunden Arbeit kann endlich der vorher in 10 Minuten gestrickte Patch getestet werden. Das war ja einfach.

TC

Er ist aus

Freitag, 12. November, 2010

Nach dem ich vom Februar 2007 an in der Küche z.B. diesen Blog gehostet habe und der Server mit wenigen Ausfällen durchgehend lief, hat heute ein Druck auf den Ausknopf eine neue Phase in meinem Leben eröffnet: ich habe jetzt einen vServer und bin somit in der Lage auch etwas leistungsfähige Dienste an zu bieten. Schneller, neuer, … das übliche.

Nur um es noch mal zusammen zufassen:

  • 2x 1,7GHz Xeon Prozessor
  • 1GB Rambus
  • 70GB Speicher verteilt auf 3 SCSI-Platten über HW-Controller-Raid-5

habe ich getauscht gegen einen V-PowerServer M. Der „Alte“ wird sicher noch das ein oder andere Mal laufen, damit ich an seine Daten komme, doch es scheint wirklich vorbei zu sein. Eine neue Zeit beginnt.

Morgen kommt dann noch ein Techniker vorbei und evtl. habe ich bald dann auch einen schnelleren Internetzugang über Kabel – etwas, dass ich eigentlich nie wollte, hier aber scheinbar der einzige Weg ist einen Upstream von mehr als 1MBit/s zu bekommen. Sehr schade.

Ach ja: sollte euch an dieser Seite etwas auffallen oder wenn Ihr einen Dienst des „Alten“ vermisst, meldet euch einfach; ein paar Sachen müssen noch eingerichtet werden, andere habe ich vielleicht übersehen.

So long

TC

Wie immer

Mittwoch, 15. September, 2010

Die Connichi 2010 ist vorbei und alles in allem ist sie sehr gut gelaufen.

Gestern habe ich mal wieder gearbeitet und heute habe ich mir Zeit zum Lernen für die Klausur nächsten Freitag genommen. Nebenbei habe ich noch meine Unterlagen zur Beleuchtung auf der Connichi dieses Jahr vervollständigt; ich weiß jetzt, wie ich sie nächstes Jahr genau so aufbauen könnte – selbst wenn das wohl etwas langweilig wäre.

Ich weiß jetzt, wie man eine GrandMA Full-Size bedient und warum ich die zu hause vorbereiteten Sachen nicht laden konnte.

Ich bin zufrieden.

Ich langweile mich.

Alles in allem ist alles wie immer und ich warte auf das nächste Abenteuer, die nächste Herausforderung und das Ende des Lernens.

So long

TC

Ach ja: ich habe keine Bilder von der Connichi gemacht. Sorry, einfach zu viel zu tun bzw. zu wenig vom Platz aus zu sehen.

Vorfreude…

Samstag, 4. September, 2010

… ist eine der schönsten Sachen. Und vermutlich eine der Sachen, die zu oft enttäuscht wird.

Ok, eigentlich wird die Vorfreude ja meist erst während des Erwarteten enttäuscht – man könnte sagen, dass sie eh abgelaufen war.

Ich jedenfalls freue mich gerade auf Donnerstag wo ich im Schweiße meines Angesichtes folgende Dinge in einem Saal verteilen werde:

  • 1x grandMA full-size
  • 1x MA Dimmer Rack 48×2,3kW
  • 8x PAR64 6er-Bar schwarz
  • 8x Vari*lite VL3000 Spot
  • 2x Martin Atomic 3000 Strobe
  • 4x Blinder 4-Light
  • 2x Smoke Factory Data 3kW Nebelmaschine
  • 1x DMX-Splitter/Booster
  • Kabelage

Nebenbei werde ich wohl auch noch den Tisch der Tonis mit aufbauen und vielleicht auch ein paar andere Kisten bewegen. So Sokoban mäßig vom LKW an den Ort mit der passenden Form&Farbe 😉

Und wenn der Donnerstag dann dem Abend zugeht gibt es die billigste Lieferpizza, die Kassel zu bieten hat. Einfach schon der Tradition wegen und weil man bei den Stückzahlen da wohl am ehesten noch das Hemd nach dem Bezahlen anbehalten darf.

Und dann hat auch noch @schaaafi Geburtstag. Denke mal die sehe ich erst Freitag, aber Ihr könnt mir noch bis Mittwoch sagen, welche Kleinigkeit ich Ihr schenken könnte. (Sie ist an ’n Kumpel vergeben, also nichts zu teures ;-))

Heute ist ja nun fast vorbei und ich muss zugeben, dass recht wenig passiert ist. Mein Onkel hat mir seinen Linksys WRT54G vorbeigebracht und gestern Abend habe ich mir mal in Ruhe „Blues Brothers“ angeguckt; hatte schon ganz vergessen, was die da alles machen.

Wer morgen noch nichts zu Cachen hat und in der Nähe von N 51° 58.915 E 007° 37.415 rumschwirrt könnte sich übrigens beim GC2DKDQ einfinden.

Ich lasse den Abend jetzt noch mit „Freaky Saturday“ auf MTV „Entertainment“ ausklingen und werde dann wohl schlafen gehen. Vielleicht mache ich auch noch ein Bier auf.

Update: „Blues Brothers“ war Donnerstag; gestern war „Nachts im Museum 2“.

So long

TC


Canonical URL by SEO No Duplicate WordPress Plugin