Mailserver auf Open Relay testen

Wer einen eigenen Mailserver betreibt und testen möchte ob er sich nicht ein Open Relay (ein Mailserver den jeder zum Senden von Mails benutzen kann) erstellt hat, kann das ganze testen.

mailradar.com/openrelay/

mailradar.com/openrelay/

Ein solcher Test ist auf http://www.mailradar.com/openrelay/ zu finden. Er probiert verschiedene Methoden aus, um mit dem angegebenen Mailserver eine Mail zu versenden. Wenn dies in allen Fällen fehl schlägt, ist der Server sauber konfiguriert.

Aufsetzen eines Mailservers unter Ubuntu

Möchte man einen Mailserver auf seinem eigenen Server aufsetzen, so kann man sich durch hunderte Seiten Dokumentationen wühlen. Allerdings geht das ganze auch einfacher. Für einen Mailserver benötigen wir dabei einen MTA (Mail Transfer Agent) und einen IMAP/POP3 Server. Als MTA wird in diesem Fall Postfix und als IMAP/POP3 Server Dovecot genutzt werden. Dankenswerterweise liefert Ubuntu bereits das Paket „dovecot-postfix mit, welchen nur installiert werden muss:

apt-get install dovecot-postfix

Bei der anschließenden Installation werden einige Fragen gestellt. So sollte man bei einem dezidierten Server die Konfigurationsart „Internet-Site“ wählen. In der abschliesenden Frage sollte der Domainname des Servers eingetragen werden. Dieser muss dabei nicht mit dem Domainnamen der späteren Mailadressen übereinstimmen. So könnte der Domainname „mail.example.com“ sein, während die spätere Mailadresse „test@example.org“ lautet.

Mailserver schauen nach ob der Name der IP Adresse (Reverse DNS) auch zum Mailserver passt. Nutzt man zum Beispiel die IP-Adresse 192.168.10.1 und deren Reverse DNS Name lautet „mail.example.com“ so muss auch der Hostname „mail.example.com“ lauten. Den Hostnamen kann man in der „/etc/hosts“ Datei konfigurieren. Auch ein Blick in die „/etc/postfix/main.cf“-Datei lohnt sich. Der Hostname (myhostname) sollte hier der gleiche sein. Auch das Überprüfen der Option „mydestination“ ist empfohlen.

Der Mailserver soll für verschiedene Domains zuständig sein. Außerdem sollen bei diesem Setup keine Unix Accounts für die Nutzer angelegt werden, die Verwaltung der Nutzer erfolgt virtuell. Auch auf Datenbanken zur Speicherung der Nutzer wird verzichtet, da sich dies erst ab zirka 100 Domains lohnt. Im ersten Schritt wird die Datei „/etc/postfix/main.cf“ um folgende Einträge erweitert:

dovecot_destination_recipient_limit = 1

virtual_mailbox_domains = /etc/postfix/virtual_domains
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_alias_maps = hash:/etc/postfix/virtual_alias
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = dovecot
mailbox_size_limit = 0

Anschließend wird der Nutzer erzeugt, welcher Zugriff auf alle lokalen Mailboxen hat:

groupadd -g 5000 vmail
useradd -s /usr/sbin/nologin -u 5000 -g 5000 vmail
usermod -aG vmail postfix
mkdir -p /var/mail/vhosts
chown -R vmail:vmail /var/mail/vhosts

Postfix wird bei der Gelegenheit in Zeile 3 auch der Gruppe „vmail“ hinzugefügt. In den letzten beiden Zeilen wird der Ordner für die lokalen Mailboxen erzeugt und dem Nutzer „vmail“ zugewiesen. Danach geht es an die Konfiguration der virtuellen Mailboxen:

nano /etc/postfix/virtual_domains

In der Datei „virtual_domains“ werden die Domains festgelegt für welche das System zuständig ist. Dabei wird jede Domain zeilenweise eingetragen:

example.com
example.org

Das Mapping der jeweiligen Mailadressen zu den Mailboxen findet in der Datei „/etc/postfix/vmailbox“ statt:

nano /etc/postfix/vmailbox

Dort werden auch wieder zeilenweise die jeweilige Mailadresse zu der Mailbox zugeordnet.

webmaster@example.com example.com/webmaster
seeseekey@example.com example.com/seeseekey

Die jeweiligen Pfade der Mailbox sind dabei nicht absolut, sondern setzen sich aus dem in „virtual_mailbox_base“ definierten Pfad und dem jeweiligen Mailboxpfad zusammen. Der Slash am Ende der Mailboxdefinition führt dazu das Postfix als Speicherverfahren „maildir“ anstatt „mbox“ benutzt, wobei „maildir“ vorgezogen werden sollte. Weiterleitungen von einer Mailadresse an eine andere, werden in der Datei „/etc/postfix/virtual_alias“ definiert:

abuse@example.com seeseekey@example.com
abuse@example.org seeseekey@example.com

Postfix benötigt einige binäre Lookuptabellen, welche nach jeder Änderung mittels:

postmap /etc/postfix/vmailbox
postmap /etc/postfix/virtual_alias

erzeugt werden müssen. Nun muss der LDA (Local Delivery Agent) in der „/etc/postfix/master.cf“-Datei konfiguriert werden. Dieser nimmt die Mail vom MTA entgegen und speichert sie in den lokalen Mailboxen. Dazu fügen wir am Ende der Datei die Zeilen:

dovecot   unix  -       n       n       -       -       pipe
  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}

hinzu. Nachdem die Mailboxen über Postfix fertig konfiguriert worden sind, geht es an die Detailkonfiguration von Dovecot. In der Datei „/etc/dovecot/conf.d/10-auth.conf“ wird die Option „#disable_plaintext_auth = yes“ auskommentiert, damit keine Klartextauthentifikation möglich ist. Am Ende der Datei kommentieren wir die Zeile:

!include auth-system.conf.ext

aus und stattdessen die Zeile:

!include auth-passwdfile.conf.ext

ein. Anschließend wird die Datei „auth-passwdfile.conf.ext“ bearbeitet. Die Datei sollte nach der Bearbeitung in etwa so aussehen:

passdb {
  driver = passwd-file
  args = scheme=sha512-crypt username_format=%u /var/mail/vhosts/passwd
}

userdb {
  driver = passwd-file
  args = username_format=%u /var/mail/vhosts/passwd
}

Im nächsten Schritt wird der LDA in Dovecot konfiguriert. In der Datei „/etc/dovecot/conf.d/15-lda.conf“ ergänzen wir dem „lda“-Block so das er anschließend wie folgt aussieht:

protocol lda {
  # Space separated list of plugins to load (default is global mail_plugins).
  #mail_plugins = $mail_plugins

  hostname = mail.example.com
  postmaster_address = postmaster@example.com
  auth_socket_path = /var/run/dovecot/auth-master
  mail_plugins = cmusieve
}

Nun muss noch der Speicherort der Mailboxen bekanntgegeben werden. Dazu wird in der Datei „/etc/dovecot/conf.d/10-mail.conf“ die „mail_location“ von:

mail_location = mbox:~/mail:INBOX=/var/mail/%u

in

mail_location = maildir:/var/mail/vhosts/%d/%n

geändert. Um Probleme mit der Authentifikation von Postfix zu vermeiden muss die Datei „/etc/dovecot/conf.d//10-master.conf“ angepasst werden. Hier wird der Block:

unix_listener auth-userdb {
    #mode = 0666
    #user =
    #group =
}

in

unix_listener auth-master {
    mode = 0666
    user =
    group =
}

geändert. Nach einem Neustart der Dienste:

sudo service dovecot restart
sudo service postfix restart

sollte das Mailsystem funktionieren. Ist das wider Erwarten nicht der Fall, so empfiehlt sich ein Blick in die Logdateien „/var/log/mail.err“ und „/var/log/mail.log“. Wenn die Informationen in diesen Dateien zu ungenau sind, hilft es in der Konfigurationsdatei „/etc/dovecot/conf.d/10-auth.conf“ die Optionen:

auth_verbose = yes
auth_debug = yes

zu setzen. Dadurch ist die Ausgabe wesentlich ausführlicher. Möchte man einen neuen Nutzer anlegen so erzeugt man zuerst die passende Zeile für die „passwd“-Datei im „vhosts“-Verzeichnis:

echo info@example.com:$(doveadm pw -p "geheim123" -s sha512-crypt):5000:5000::/var/mail/vhosts/example.com/info/

Nun muss der entsprechende Eintrag in der „/etc/postfix/vmailbox“ angelegt werden und einige Befehle ausgeführt werden:

postmap /etc/postfix/vmailbox
mkdir -p /var/mail/vhosts/example.com/info
chown -R vmail:vmail /var/mail/vhosts
sudo service dovecot restart
sudo service postfix restart

Natürlich kann man sich für das anlegen neuer Nutzer auch ein entsprechendes Skript schreiben. Nach dem Neustart der Services ist das neue Postfach eingerichtet und kann genutzt werden.

Weitere Informationen gibt es unter:
http://www.postfix.org/VIRTUAL_README.html
http://www.werthmoeller.de/doc/microhowtos/postfix/postfix_virtual_users/
http://www.asconix.com/howtos/debian/postfix-dovecot-mailserver-debian-howto

Datensparsamkeit in der Praxis

Um so weniger Daten anfallen, um so weniger Daten können andere Staaten und Firmen sammeln. Aus diesem Grund sollte man mit seinen persönlichen Daten sparsam umgehen. Es fängt bei den kleinen Dingen an, wie Onlineshops, welche nach einer Telefonnummer verlangen. Hierzu sagte c‘t Redakteur Axel Kossel einmal:

Aus meiner Erfahrung heraus: Mich hat noch nie ein Shop angerufen; wenn irgendwas nicht lieferbar ist, kommt eine E-Mail. Trotzdem wollen viele Shops unbedingt meine Telefonnummer wissen. Da trag ich irgendeine Fantasie-Nummer ein; das sind Daten, die nicht benötigt werden.

Wer hier nicht irgendeine Nummer angeben möchte kann den Service „Frank geht ran“ nutzen, welcher unter frank-geht-ran.de zu finden ist. Dieser Dienst weißt den Anrufer darauf hin, das der Angerufene keine Werbeanrufe wünscht. Gleiches gilt auch für Dinge wie das Geburtsdatum und Adressen wenn sie nicht unbedingt nötig sind.

Zur Datensparsamkeit gehört natürlich noch mehr außer fingierten Telefonnummern. So sollte man Kundenkarten, wie Payback und Co., meiden. Auch das Bezahlen mit mit EC- oder Kreditkarte hinterlässt Datenspuren. Hier ist man mit dem guten alten Bargeld wesentlich anonymer.

Möchte man sich im Web bei Diensten anmelden, aber seine Mailadresse für sich behalten, so bieten sich Einwegmail Dienste an. Ein solcher Dienst ist unter wegwerfemail.de zu finden. Auch Freemailer sind mit Vorsicht zu genießen. Hier empfiehlt es sich ein Webhosting Paket zu buchen, damit man seine Mail unter Kontrolle hat. Natürlich kann man auch selber einen Mailserver aufsetzen. Auch hier ist es eine Frage von Aufwand und Nutzen.

Eine beliebte Variante bei einem eigenen Webhosting Paket ist es, sich für jeden Kontakt (Amazon, Facebook, Twitter, usw.) eine Mailadresse nach dem Schema „amazon@example.org“ anzulegen und diese nur für den jeweiligen Dienst zu nutzen. Wenn der entsprechende Dienst, oder die Firma die Mailadressen nun an anderen verteilt ist sofort ersichtlich wo der Übeltäter zu suchen ist.

Für den Browser bieten sich AddOns wie Adblock Edge, HTTPS EveryWhere, RequestPolicy und NoScript an, da sie einem mehr Kontrolle und Sicherheit bieten, was im Endeffekt wieder der Datensparsamkeit zu Gute kommt.

Mails von anderen Postfächern einsammeln

Seit einiger Zeit möchte ich gerne von Diensten wie Google Mail und Co. wegkommen. Dazu tragen mittlerweile auch die Enthüllungen aller PRISM und Tempora bei. Ein Feature welches sich bei Google Mail als sehr praktisch erwiesen hat, ist das Einsammeln von der Mails anderer Mailkonten. Nun ist es nicht so das es sich bei diesem Feature um Magie handelt, so das es Nahe lag das ganze in PHP nachzubauen:

<?php
  //Licensed under AGPL
  //by seeseekey

  //Configuration
  //Accounts to collect
  $collectAccounts["test@example.org"]["server"]="{mail.example.org/novalidate-cert}INBOX";
  $collectAccounts["test@example.org"]["username"]="user";
  $collectAccounts["test@example.org"]["passwort"]="secret";

  $collectAccounts["spam@example.org"]["server"]="{mail.example.org/novalidate-cert}INBOX";
  $collectAccounts["spam@example.org"]["username"]="user";
  $collectAccounts["spam@example.org"]["passwort"]="secret";

  //Target server
  $targetServer = "{mail.example.org/ssl/novalidate-cert}";
  $targetUsername = "user";
  $targetPassword = "secret";

  //Operate
  $mboxTarget = imap_open($targetServer, $targetUsername, $targetPassword) or die ("Failed with error: " . imap_last_error());

  //Quellpostfächer öffnen
  while (list($key,$value) = each($collectAccounts))
  {
    $mboxSource = imap_open($value["server"], $value["username"], $value["passwort"]) or die ("Failed with error: ".imap_last_error());
    $mailboxInformation = imap_check($mboxSource);
    $overviewSourceMailBox = imap_fetch_overview($mboxSource, "1:{$mailboxInformation->Nmsgs}", 0);

    //Create folder
    imap_createmailbox($mboxTarget, imap_utf7_encode("$targetServer$key"));

    foreach ($overviewSourceMailBox as $overview)
    {
      $message = imap_fetchheader($mboxSource, $overview->msgno) . imap_body($mboxSource, $overview->msgno);

      if(!imap_append($mboxTarget, mb_convert_encoding("$targetServer$key" . "" . "", "UTF7-IMAP", "ISO-8859-1"), $message,""))
      {
        die ("Error: ". imap_last_error());
      }

      //Mark mail from source mailbox as deleted
      imap_delete($mboxSource, $overview->msgno);
      }

    //Delete all marked mails and close connection to source mailbox
    imap_expunge($mboxSource);
    imap_close($mboxSource);
  }

  imap_close($mboxTarget);
?>

In dem Skript gibt man dabei oben die Konten an von welchen eingesammelt werden soll. Daneben wird natürlich auch das Zielkonto definiert. Der erste Parameter von „$collectAccounts“ definiert dabei den Ordner in welchen die Mails im Zielkonto geschoben werden. Der Quellcode ist auf GitHub zu finden und steht unter der AGPL.

Twitter und die Probleme mit Unicode URLs

Wenn man bei Twitter einen Account anlegt, und diesen mit einer Mailadresse verbinden will, ist das im Normalfall kein Problem. Interessant wird das ganze wenn man dort eine Mail nach dem Schema „example@entität.org“ angeben möchte. In dieser Adresse sind Unicodezeichen enthalten, in diesem Fall das „ä“.

Die nicht funktionierende Unicode Variante

Die nicht funktionierende Unicode Variante

Diese akzeptiert Twitter nicht als „richtige“ Mailadresse. Abhilfe schafft die die Umwandelung in Punycode z.B. mit dem Tool unter http://idnaconv.phlymail.de. Damit lautet die Entsprechung der Beispieladresse „example@xn--entitt-fua.org“.

Mit der Punycode Umschreibung funktioniert es auch mit Twitter

Mit der Punycode Umschreibung funktioniert es auch mit Twitter

Diese umgeschriebene Adresse wird dann auch von Twitter akzeptiert.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Punycode