Mail-Server mit sendmail

Auf dem Firewallrechner krypton, der auch unser Mailserver ist, läuft sendmail in der Version 8.12.4. als Dämon. D.h., wir nehmen Mails aus dem internen Netzwerk an, leiten sie entweder lokal weiter, oder stellen sie in die Warteschlange. Dazu vergeben wir den Nutzern die e-mail Adresse user@mail.laas.priv. Das ist wichtig, damit die lokalen Mails korrekt zugestellt werden. Andererseits sollen die Absenderadressen maskiert werden, wenn die Mails nach draußen gehen, da mail.laas.priv kein gültigen Nameservereintrag aufweist.

Die Konfiguration von sendmail ist kompliziert. Zuerst werden wir festlegen, von welchen Rechnern wir Mails akzeptieren. Das ist wichtig, um Spammern und Mißbrauch vorzubeugen. Im lokalen Netz kann man dies sicherlich vernachlässigen, aber nicht Internet. Wir editieren dazu die Datei /etc/mail/access. Das Netzwerk 127 bezeichnet den Mailserver selbst. Alle Mail von dort wird bedenkenlos akzeptiert. Aus dem internen Netz nehmen wir Mails ans und leiten sie an die entsprechende Stelle weiter.

127               OK
192.168.0         RELAY
#cyberspammer.com  550 We don't accept mail from spammers

Die auskommentierte Zeile zeigt beispielhaft, wie man bestimmten Hosts oder Netzwerken verbieten, Mail über unseren Server zu verbreiten. Wird die Datei verändert, so ist das Kommando

makemap hash -f /etc/mail/access.db < /etc/mail/access

auszuführen. Damit wird die access-Datenbank neu erstellt.

Absenderadressen einstellen

Jetzt wollen wir festlegen, wie die Absenderadressen geändert werden, wenn die Mail das lokale Netzwerk verläßt. Dazu bearbeiten wir die Datei /etc/mail/genericstable. Das Format ist sehr einfach, links steht der Ntuzer, rechts (durch Tabs getrennt), die Ersetzung. Wenn also root eine Mail versendet, so erscheint als Absender laas@laas.de. Lokale Mail muß man an user@mail.laas.de adressieren.

#
# map outgoing sender addresse from foo to bar@domain.com:
# foo                bar@domain.com
#
root                 laas@laas.de
laas                 webmaster@laas.de
mig                  webmaster@turtlebeach.de

Analog wie zur Access-Datenbank muss aus der Textdatei eine für sendmail lesbare Datenbank generiert werden.

makemap hash -f /etc/mail/genericstable.db < /etc/mail/genericstable

Hauptkonfiguration

Der Hauptteil der Konfiguration findet in /etc/mail/sendmail.cf statt. Mit dem Makroprozessor m4 kann man sich aus /etc/mail/laas.mc eine eigene Konfigurationsdatei erstellen lassen. Die Administrierung von sendmail ist mit den Makrodateien sehr viel einfacher. Ich gebe hier meine Makrodatei an, in der Hoffnung, dass sie ausreichend kommentiert ist.

dnl  Mit dnl beginnt ein Kommentar bis zum Zeilenende und
dnl  wird nicht ausgewertet.
dnl  Einsetzen in `'-Paare Verhindert die Makro-Expansion.
dnl
define(`LIBDIR',`/usr/share/sendmail')
include(LIBDIR/m4/cf.m4)
VERSIONID(`linux for www.laas.priv')dnl
OSTYPE(`linux')dnl
dnl
dnl  Speichere einige Statistiken in dieses File (siehe dazu
dnl  man mailstats)
dnl
dnl define(`STATUS_FILE', /etc/mail/sendmail.st)dnl
dnl
dnl  use this user id if we do not use some specific local user
dnl  (e.g. for delivering error messages)
dnl
define(`confDEF_USER_ID', `daemon:daemon')dnl
dnl
dnl  verwende Procmail zum Zustellen der lokalen Mails:
dnl
define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl
dnl
dnl  Emails werden in diesem Verzeichnis zwischengelagert,
dnl  bevor sie an den naechsten Host weitergegeben werden:
dnl
define(`QUEUE_DIR', `/var/spool/mqueue')dnl
dnl
dnl  Fehlermeldungen werden auch an diese Adresse weitergeleitet:
dnl
define(`confCOPY_ERRORS_TO', `postmaster')dnl
dnl
dnl  Versende Fehlermeldungen nicht im MIME-Format:
dnl
dnl define(`confMIME_FORMAT_ERRORS', `False')dnl
dnl
dnl  Die Standardgroesse fuer UUCP sind 100kB. Das ist zu wenig.
dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
dnl
dnl  Der Standard Zustell-Modus (delivery-mode)
dnl  `i': interactive
dnl  `b': background (asynchonous)
dnl  `q': queue
dnl  `d': delay
dnl  siehe auch `man sendmail` fuer Details
dnl
define(`confDELIVERY_MODE', `b')dnl
dnl
dnl  Wer mit Dial-on-Demand und einem Modem arbeitet, kann hier eine
dnl  Verzoegerung einstellen, die Sendmail warten soll, bis die Leitung
dnl  steht.
dnl
dnl define(`confDIAL_DELAY', `10s')dnl
dnl
dnl  Nach welchem Zeitraum soll Sendmail eine Warnung versenden, dass
dnl  eine Mail noch nicht abgearbeitet werden konnte:
dnl
define(`confTO_QUEUEWARN', `8h')dnl
dnl
dnl  Wann soll eine Mail als unzustellbar zurueckgeschickt werden?
dnl
define(`confTO_QUEUERETURN', `7d')dnl
dnl
dnl keine Ident-Abfragen durchfuehren
dnl
define(`confTO_IDENT', `0s')dnl
dnl
dnl Anzahl der Kindprozesse auf 5 begrenzen
dnl Anzahl der Verbindungen auf 3 begrenzen
dnl
dnl define(`confMAX_DAEMON_CHILDREN', `5')dnl
dnl define(`confCONNECTION_RATE_THROTTLE', `3')dnl
dnl
dnl  Wir werden eingehende Mails ab einer Load von 2 empfangen, aber
dnl  nur in die Warteschlange stellen. Ab 10 werden die Mails abgelehnt.
dnl
define(`confQUEUE_LA', `2')dnl
define(`confREFUSE_LA', `10')dnl
dnl
dnl  Oft ist es sinnvoll das SMTP expn und verfy mit "noexpn" und "noverfy"
dnl  abzuschalten. Wer viele User hat kann noch "restrictrunq" und
dnl  "restrictmailq" aktivieren.
dnl  "authwarnings" warnt mit dem Header "X-Authentication-Warning"
dnl  wenn ein User z.B. "sendmail -bs" verwendet. Pine-User werden dies
dnl  vermutlich deaktivieren wollen.
dnl  "noreceipts" ignoriert alle "Return-Receipt-To:"-Header
dnl
define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn')dnl
dnl
dnl  Erstelle das Verzeichnis /var/mqueue/.hoststat und Sendmail schreibt
dnl  Status-Infos ueber den Empfaenger-Rechner hinein. Das beschleunigt
dnl  oft die Mail-Auslieferung auf grossen Mailservern.
dnl
define(`confHOST_STATUS_DIRECTORY', `.hoststat')dnl
dnl
dnl  Lasse zu, dass jene User den Sender-Header modifizieren.
dnl  fuer diese Absender wird die X-Authentication-Warning unterdrueckt
dnl
define(`confTRUSTED_USERS', `mdom wwwrun')dnl
dnl
dnl define(`confCT_FILE', `/etc/mail/sendmail.ct')dnl
dnl FEATURE(`use_ct_file')dnl
dnl
dnl  Definiere den Smarthost entweder hier, oder in /etc/mail/mailertable
dnl  ein Smarthost ist der Empfaenger-Host fuer alle EMails, die nach
dnl  draussen gehen
dnl
dnl define(`SMART_HOST', `smtp:smtprelay.t-online.de')
dnl define(`SMART_HOST', `smtp:mail.puretec.de')dnl
dnl define(`SMART_HOST', `smtp:mail.3-point.de')dnl
define(`SMART_HOST', `mail.epost.de')dnl
dnl
dnl  aktiviere diesen Eintrag, wenn Du eine Dial-up-Verbindung zum Internet
dnl  hast, dann werden alle Mails gespoolt, und erst mit "sendmail -q"
dnl  versandt.
dnl
define(`confCON_EXPENSIVE', `True')dnl
define(`SMTP_MAILER_FLAGS',`e')dnl
dnl
dnl  sendmail will give all hostnames to your DNS server and replace the
dnl  names with the FQDN ones. as nearly all email-programs use the full
dnl  hostname and you will probably also just use full hostnames as
dnl  destination addresses, you could disable this "feature".
dnl  this is also used for dial-on-demand connections where we don't want
dnl  to trigger a connection just for a DNS query.
dnl
dnl FEATURE(`nodns')dnl nodns ist seit Sendmail 8.7 deaktiviert.
FEATURE(`nocanonify')dnl
dnl
dnl  if you really have to disable DNS lookups and only want to use /etc/hosts,
dnl  you have to create the file /etc/service.switch with the two lines
dnl  "hosts files" and "aliases files" in it.
dnl  please configure a real DNS server and do not use this mis-feature.
dnl  you might instead also use /etc/mail/mailertable with IP addresses.
dnl
define(`confSERVICE_SWITCH_FILE', `/etc/mail/service.switch')dnl
define(`confHOSTS_FILE', `/etc/hosts')dnl
dnl
dnl  fuege die lokale Domain hinzu, wenn sie im Absender fehlt.
dnl  Beispiel: "From: michael" wird zu "From: michael@mail.laas.priv"
dnl
dnl FEATURE(`always_add_domain')dnl
FEATURE(`accept_unresolvable_domains')dnl
dnl
dnl  specify the sender email address for all outgoing mail from the local
dnl  machine. most people also want to use "masquerade_envelope" to also
dnl  change the envelope addresses.
dnl  use "allmasquerade" to also change the recipient addresse. don't use
dnl  this feature, if you don't have the full /etc/aliases and the full
dnl  /etc/passwd on your host.
dnl
MASQUERADE_AS(`laas.de')dnl
FEATURE(`masquerade_envelope')dnl
dnl FEATURE(`allmasquerade')dnl
dnl
dnl Diese Domains werden maskiert
dnl
GENERICS_DOMAIN(`mail.laas.de')dnl
dnl
dnl  Verwende Procmail fuer die Zustellung von lokalen Mails
dnl
dnl FEATURE(`local_procmail')dnl
dnl
dnl  Die Definitionsdatei fuer das Mail-Routing der ausgehenden Mails:
dnl
FEATURE(`mailertable', `hash -o /etc/mail/mailertable.db')dnl
dnl
dnl  Diese Dateien werden fuer das Umschreiben der Absender-
dnl  (genericstable, ausgehende Mails) und Empfaenger-Adressen
dnl  (virtusertable eingehende Mails) verwendet.
dnl
dnl FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable.db')dnl
FEATURE(`genericstable', `hash -o /etc/mail/genericstable.db')dnl
dnl
dnl  Drei Moeglichkeiten das Relaying zu regeln:
dnl
dnl FEATURE(`relay_based_on_MX')dnl
dnl FEATURE(`relay_entire_domain')dnl
FEATURE(`access_db', `hash -T /etc/mail/access.db')dnl
dnl
dnl in /etc/mail/local-host-names alle Namen des Rechners eintragen (FQDN)
dnl
FEATURE(`use_cw_file')dnl
dnl
dnl Aktivierung vom MSP (Message Submit Program)
dnl FEATURE(`msp')dnl
dnl
dnl Liste von Verschluesselungsmechanismen, die mit SMTP_AUTH verwendet werden koennen
dnl
define(`confAUTH_MECHANISMS', `PLAIN')dnl
dnl
dnl maximale Anzahl von Bits, die zur Verschluesselung verwendet werden
dnl
define(`confAUTH_MAX_BITS', `1024')dnl
dnl
dnl diesen Mechanismen vertraut sendmail
dnl
TRUST_AUTH_MECH(`CRAM-MD5 DIGEST-MD5 LOGIN PLAIN')dnl
dnl
dnl Angabe, unter welchen Nutzer sendmail laufen soll
dnl
dnl define(`confRUN_AS_USER', `smmsp')dnl
dnl
dnl Nutzer, denen sendmail vetraut
dnl
dnl define(`confTRUSTED_USER', confRUN_AS_USER)dnl
dnl
dnl sendmail soll die Netzschnittstellen nicht probieren
dnl
dnl define(`confDONT_PROBE_INTERFACES', `True')dnl
dnl
dnl Datenbank, die die Authentifizierungsinformationen enthaelt, falls man mehrere Mailserver zur Authentifizierung benutzt
dnl
dnl FEATURE(`authinfo',`hash -T /etc/mail/authinfo.db')
dnl
dnl WICHTIG: die Regel authinfo in der erzeugten sendmail.cf entfernen
dnl ansonsten geht SMPT_AUTH auswaerts nicht
dnl
dnl FEATURE(`no_default_msa')dnl turn off default entry for MSA
dnl DAEMON_OPTIONS(`Name=MSA, M=E')dnl
dnl
dnl Angaben zu den Zertifikaten und den zugehoerigen Schluesseln
dnl
dnl define(`confCACERT_PATH', `/etc/mail/ca')dnl
dnl define(`confCACERT', `/etc/mail/ca/cacert.pem')dnl
dnl define(`confSERVER_CERT', `/etc/mail/server.crt')dnl
dnl define(`confSERVER_KEY', `/etc/mail/server.key')dnl
dnl define(`confCLIENT_CERT', `/etc/mail/server.crt')dnl
dnl define(`confCLIENT_KEY', `/etc/mail/server.key')dnl
dnl
dnl Der AmaVis-Viren-Scanner benoetigt auf jeden Fall die naechsten Zeilen
dnl vor den Definitionen der anderen Mailer!!!
dnl
dnl define(`LOCAL_MAILER_PATH', `/usr/sbin/amavis')dnl
dnl define(`LOCAL_MAILER_ARGS', `amavis $f $u /usr/bin/procmail -Y -a $h -d $u')dnl
dnl for security reasons on some systems procmail is not suid.
dnl so we have to add the "o" flag and remove the "S"-flag
dnl see BUGS for details on this issue
dnl MODIFY_MAILER_FLAGS(`LOCAL', `-m')dnl
dnl MODIFY_MAILER_FLAGS(`LOCAL', `+o')dnl
dnl MODIFY_MAILER_FLAGS(`LOCAL', `-S')dnl
dnl Ende Amavis Stuff
dnl Mlocal,     P=/usr/sbin/amavis, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL, R=EnvToL/HdrToL,
dnl T=DNS/RFC822/X-Unix,
dnl A=amavis -f $u /usr/bin/procmail -Y -a $h -d $u
dnl
dnl Dies sind die verfuegbaren Mailer. Standardeinstellung ist nur SMTP.
dnl In /etc/mail/mailertable werden die anderen Eintraege aktiviert.
dnl
MAILER(`local')dnl
dnl MAILER(`procmail')dnl
MAILER(`smtp')dnl
dnl MAILER(`uucp')dnl
dnl MAILER(`bsmtp')dnl
dnl MAILER(`fido')dnl

Der Aufruf

m4 laas.mc > /etc/mail/sendmail.cf

produziert die Konfigurationsdatei, die der Mail Transfer Agent sendmail versteht. Nach einem Neustart sollte sendmail funktionieren.

Amavis Virenscanner

Viren haben in der letzten Zeit traurige Berühmtheit erlangt. Zum einen sind sie viel infektiöser geworden, zum anderen steigt der wirtschaftliche Schaden durch Datenverlust oder Ausfall von Systemen.

Viren verbreiten sich in letzter Zeit vermehrt über das Internet, und speziell über elektronische Nachrichten. Eine Ursache ist sicherlich, dass vermehrt Anhänge mit Dokumenten, Archiven etc. versendet werden. Um die Mails dahingehend zu überprüfen, verwende ich amavis, ein Interface zwischen den MTA's (z.B. sendmail) und diversen frei verfügbaren Virenscannern. Auf der Homepage sowie im Archiv findet man eine sehr gute Installationsanleitung.

Nach der Installation von amavis muß sendmail noch dazu überredet werden, den Virenscanner auch zu benutzen. Dies passiert durch die folgenden Zeilen in der mc-Datei, die dann erneut zur sendmail.cf umgewandelt werden muss.

dnl
dnl Amavis
define(`LOCAL_MAILER_PATH', `/usr/sbin/amavis')dnl
define(`LOCAL_MAILER_ARGS', `amavis $f $u /usr/bin/procmail -Y -a $h -d $u')dnl
dnl
dnl wenn procmail nicht suid ist, diese Zeilen aktivieren
dnl see BUGS for details on this issue
dnl MODIFY_MAILER_FLAGS(`LOCAL', `-m')dnl
dnl MODIFY_MAILER_FLAGS(`LOCAL', `+o')dnl
dnl MODIFY_MAILER_FLAGS(`LOCAL', `-S')dnl
dnl Ende Amavis Stuff

Im Beispiel befindet amavis sich in /usr/sbin und ruft danach /usr/bin/procmail auf. Die Pfade sind den eigenen Gegebenheiten abzupassen.

Spamschutz mit spamassassin

Spam, ungewollte Werbemails, sind nervig und verbrauchen Bandbreite, was besonders schmerzt, wenn man keine Flarate hat und für jede zusätzliche Minute bezahlen muss. Leider hilft es in den meisten Fällen nicht, dem Werbenden zu antworten und auf Einstellung der Werbung zu pochen. Der Spammer weiß dadurch, dass die Adresse benutzt wird und wird in der Regel fleißig weiter Mails schicken.

spamassassin ist ein intelligenter Filter mit enormen Einstellungsmöglichkeiten, White- und Blacklisten usw. Die Installation ist schnell erledigt, danach erstellt oder modifiziert man die Datei /etc/procmailrc. Diese Datei ist die globale Konfigurationsdatei für procmail. Die nächsten Zeilen sollten am Anfang stehen dieser Datei stehen.

:0fw:spam.lock
| spamc

:0e
{
  EXITCODE=$?
}

Zu beachten ist, dass diese Lösung nur funktioniert, wenn der spamd-Dämon von spamassassin gestartet ist. Am einfachsten kann das in einem Startskript automatisch erfolgen.

Die Beispielkonfiguration findet man unter /usr/share/spammassassin, die man nach /etc/mail/spamassassin kopiert, wo spamassassin sie sucht. Dort finden sich auch die gesamten Regeln, die beliebig erweitert werden können. Spamassassin verliert keine Mails, sondern markiert sie einmal im Kopf jeder Mail sowie im Titel. Anhand dieser Merkmale kann man die Mails dann gesondert sortieren.

SMTP_AUTH

Einige Mailserver wie z.B. epost.de kann man als Relay benutzen, wenn man sich vorher authentifiziert. Dazu legt man zuerst die Datei /etc/mail/default-auth-info an, in der die Nutzerdaten wie folgt eingetragen werden.

Login
Login
Passwort
Mailserver

Der Login muss wirklich zweimal angegeben werden. Im Falle von epost.de heißt der Mailserver mail.epost.de. In die laas.mc werden die folgenden Zeilen eingefügt.

dnl
dnl Diese Mechanismen vertraut sendmail
dnl
TRUST_AUTH_MECH(`CRAM-MD5 DIGEST-MD5 LOGIN PLAIN')dnl
dnl
dnl Diese Mechanismen kann sendmail benutzen
dnl
define(`confAUTH_MECHANISMS', `PLAIN LOGIN CRAM-MD5 DIGEST-MD5')dnl
dnl
dnl Schluessellaenge
dnl
define(`confAUTH_MAX_BITS', `1024')dnl
dnl
dnl In dieser Datei stehen die Authentifizierungsinformationen
dnl
define(`confDEF_AUTH_INFO', `/etc/mail/default-auth-info')dnl
dnl
dnl Hier muss der Mailserver stehen, an dem man sich authentifizieren moechte
dnl Eventuell ist diese Zeile schon vorhanden und muss abgeaendert werden
dnl
define(`SMART_HOST', `mail.epost.de')dnl

Leider reicht dies noch nicht. Sendmail hat in der Version 8.12.4. einen Fehler, der es normalerweise nicht erlaubt, sich erfolgreich an einem Mailserver zu authentifizieren. Nach einer Übersetzung der mc-Datei mit dem Makroprozessor m4 muss als Workaround noch direkt die sendmail.cf bearbeitet werden. Dazu sucht man sich die Regel authinfo und entfernt diese. Die Zeilen, die entfernt werden müssen, sollten in etwa so aussehen.

Sauthinfo
R$*      $: $1 $| $>D <$&{server_name}>   <>
R$* $| $*   $: $1 $| $>A <$&{server_addr}>   <>
R$* $| $*   $: $1 $| <$(access AuthInfo: $: ? $)> <>
R$* $| $*   $@ no          no authinfo available
R$* $| <$*> <> $# $2

Danach hat die Authentifizierung bei mir anstandslos funktioniert.