https://kb.pocnet.net/index.php?title=Sendmail&feed=atom&action=historySendmail - Versionsgeschichte2024-03-28T12:10:56ZVersionsgeschichte dieser Seite in KnowledgebaseMediaWiki 1.35.11https://kb.pocnet.net/index.php?title=Sendmail&diff=933&oldid=prevPoC: /* Siehe auch */ Redundanter Link weg2010-12-13T10:20:03Z<p><span dir="auto"><span class="autocomment">Siehe auch: </span> Redundanter Link weg</span></p>
<p><b>Neue Seite</b></p><div>'''Sendmail''' ist ein noch immer oft benutzter Mail Transfer Agent. Der folgende Artikel soll einen Überblick über die Konfiguration und Debugging von Sendmail ermöglichen. Der Schwerpunkt liegt hierbei auf dem vom [[Benutzer:PoC|Autor]] erstellten Debian-Package, die Konfiguration anderer Pakete unterscheidet sich teilweise in Automatismen und Betriebsart von Sendmail.<br />
<br />
== Grundlegendes ==<br />
Sendmail kennt zwei Betriebsarten:<br />
* Standalone, Sendmail lauscht auf Port 25 (und ggfs. weiteren) und behandelt über Forks aus- und eingehende Mails, von der Annahme per SMTP bis zur Übergabe an den LDA (wie z.&thinsp;B. ''Procmail''),<br />
** Vorteile: Sehr einfache und übersichtliche Konfiguration, keine nennenswerte Verzögerung in der Mailzustellung wegen separatem Queuerunner.<br />
* Secure, damit werden bestimmte Konfigurationsdaten doppelt vorgehalten. Der SMTP-Dienst läuft unter einem nichtprivilegierten Benutzer und legt eingehende Mails in der Queue ab, während ein Queuerunner diese Queue regelmäßig abarbeitet. Dieser Runner läuft als ''root'', damit er lokale Postfächer bedienen kann.<br />
** Vorteile: Von Ferne ausnutzbare Sicherheitslücken beschränken sich auf den Benutzer, unter dem der SMTP-Dienst läuft (sicherer).<br />
<br />
In der weiteren Betrachungsweise wird nur der erste Modus behandelt.<br />
<br />
== Arbeitsweise ==<br />
Sendmail nimmt per SMTP oder per lokalem Aufruf Mails entgegen und erzeugt für diesen Vorgang einen Kindprozess. In dieser Phase wird bereits anhand verschiedener Parameter entschieden, ob die Mail überhaupt angenommen wird (dargestellte Reihenfolge willkürlich):<br />
* ist der eigene Host überhaupt als MX im DNS gelistet (<code>relay_based_on_MX</code>),<br />
* hat die per SMTP verbundene Gegenseite eine saubere DNS-Konfiguration (<code>require_rdns</code>),<br />
* ist die Domain des Absenders in irgend einer Form auflösbar via A oder MX-Records,<br />
* hat der Absender eine Domain angegeben oder nur den Namen (links vom @),<br />
* ist für die Empfängerdomain lokale Zustellung bzw. Relaying erlaubt (''local-host-names'', <code>access_db</code>),<br />
* ist für den lokalen Empfänger (links vom @) Zustellung erlaubt, bzw. existiert der Benutzer oder ein Alias in irgend einer Form (<code>blacklist_recipients)</code><br />
* Der ''Load'' der Maschine liegt unter einem festgelegten Schwellwert (Default: 12), siehe auch <code>confQUEUE_LA</code> und <code>confREFUSE_LA</code>.<br />
* Ggfs. weitere Checks, falls angegeben (Ratelimiting, Plattenplatz, DNSBL, Milter für Antispam und Antivirus), …<br />
<br />
Sind alle Checks abgearbeitet, wird die Mail angenommen und in der Queue ''/var/spool/mqueue'' abgelegt, gesplittet in eine Steuerdatei (''Qf…'') und die Datendatei (''df…''). In der Queue liegende Mails können einfach mit <code>mailq</code> eingesehen werden. Falls Sendmail ausserhalb des festgelegten Intervalls nochmals die Queue abarbeiten soll, kann das mit <code>sendmail -q</code> forciert werden.<br />
<br />
In beim Start angegebenen Intervallen (''/etc/default/sendmail'', z.&thinsp;B. <code>-q10m</code> alle 10 Minuten) wird die Queue abgearbeitet und versucht, in der Queue liegende Mails zuzustellen. Relevante Konfigurationsdateien sind hier ''/etc/passwd'' (lokale Benutzer), ''/etc/mail/mailertable'', ''/etc/mail/virtusertable'', ''/etc/mail/aliases'' sowie ''/etc/mail/local-host-names''.<br />
<br />
=== Debugging ===<br />
Für jede Transaktion, wird eine Zeile an Syslog übergeben. Eine Transaktion kann sein:<br />
* das Annehmen oder Ablehnen von Mails,<br />
* Zustellung einer Mail aus der Queue an das festgelegte Ziel.<br />
<br />
In Syslog sieht das dann so aus:<br />
Dec 11 16:06:00 leela sendmail[13290]: oBBF5xLw013290: from=<apps+kr4mnrqaykyn@facebookappmail.com>,<br />
size=4726, class=0, nrcpts=1, msgid=<c1e8a8595c9196993fa2ce92fef0ca1c@api.facebook.com>, proto=ESMTP,<br />
daemon=MTA, relay=outmail003.snc4.facebook.com [66.220.144.135]<br />
Dec 11 16:06:09 leela sendmail[13450]: oBBF5xLw013290: to=localuser2, delay=00:00:10, xdelay=00:00:00,<br />
mailer=local, pri=35226, dsn=2.0.0, stat=Sent<br />
<br />
Mit dem Aufruf <code>sendmail -bv ''mail@address.com''</code> kann festgestellt werden, über welche Wege Sendmail eine Mailzustellung vornehmen würde. Zwischenschritte wie Aliasauflösung usw. werden standardmäßig nicht dargestellt.<br />
server ~ # '''sendmail -bv root'''<br />
poc... deliverable: mailer local, user poc<br />
server ~ # '''sendmail -bv info@leitwerk.de'''<br />
info@leitwerk.de... deliverable: mailer relay, host [exchange.app.leitwerk.de], user info@leitwerk.de<br />
server ~ # '''sendmail -bv testuser@googlemail.de'''<br />
testuser@googlemail.de... deliverable: mailer esmtp, host googlemail.de, user testuser@googlemail.de<br />
<br />
Diese Tests können auch in die Irre führen: Wenn eine Konfigurationsänderung vorgenommen wurde, Sendmail aber zwischenzeitlich nicht neu gestartet wurde (sofern notwendig), funktioniert der manuelle Aufruf, eine versandte Testmail triggert Fehler.<br />
<br />
== Konfiguration ==<br />
Die Konfiguration von Sendmail erfolgt grundlegend in ''/etc/mail/'', in mehreren Konfigurationsdateien. Die Konfiguration ist in mehreren Arten von Dateien abgelegt, nämlich in<br />
* Hashtabellen, die bei jeder Transaktion gelesen werden und bei Änderungen daher keinen Neustart von Sendmail bedingen. Dafür müssen diese Dateien aus einer Textdatei nach Änderungen der Textdatei mit dem ''makemap''-Kommando neu erzeugt werden. Beispiele: ''access'', ''mailertable''.<br />
* Normalen Konfigurationsdateien, die nur bei einem Sendmail-Neustart eingelesen werden und dann im Speicher vorgehalten werden. Beispiele: ''local-host-names'', ''trusted-users''.<br />
* Der eigentlichen Sendmail-Konfigurationsdatei ''sendmail.cf''. Sie referenziert alle anderen Konfigurationsdateien und '''ist nicht dafür gedacht, von Menschen gelesen und bearbeitet zu werden'''.<ref>Auch wenn die ''sendmail''-Literatur das immer wieder suggeriert.</ref> Das ist auch gar nicht notwendig: Bearbeitet wird die Vorlagendatei ''sendmail.mc'', aus dieser wird über einen komplexen Mechanismus aus Includes und Makros (m4) die eigentliche Konfigurationsdatei erzeugt.<br />
<br />
Dadurch, dass die Konfigurationsdateien aus der ''sendmail.cf'' direkt referenziert werden, können diese in aller Regel nicht als existent vorausgesetzt werden. Selbst die Namensgebung muss nicht mit dem, was man so kennt übereinstimmen. Zudem bedeutet die bloße Existenz einer dieser Dateien nicht, dass sie von der ''sendmail.cf'' auch referenziert wird. Hier ist Sauberkeit und Vorsicht geboten, um später nicht über scheinbar obskure Fehler zu stolpern.<br />
<br />
=== Sendmail.mc ===<br />
Diese Datei ist in mehrere Abschnitte gegliedert:<br />
* Ostype,<br />
* Domain,<br />
* Feature(s),<br />
* Mailer definitionen.<br />
<br />
Je nach dem, welche Optionen hier aufgenommen werden, werden weitere externe Dateien referenziert oder bestimmte Verhaltensweisen von Sendmail aktiviert. Eine Beispieldatei sieht so aus:<br />
include(`/usr/share/sendmail/m4/cf.m4')dnl<br />
OSTYPE(`linux')dnl<br />
DAEMON_OPTIONS(`Port=smtp, Name=MTA, Family=inet6, M=E')dnl<br />
DAEMON_OPTIONS(`Port=submission, Name=MSA, Family=inet6, M=Ea')dnl<br />
CLIENT_OPTIONS(`Family=inet6, Addr=2001:6f8:1296:1:210:18ff:fe06:7c06')dnl<br />
DOMAIN(`generic')dnl<br />
FEATURE(`no_default_msa',`dnl')dnl<br />
FEATURE(`always_add_domain')dnl<br />
FEATURE(`access_db')dnl<br />
FEATURE(`blacklist_recipients')dnl<br />
FEATURE(`mailertable')dnl<br />
FEATURE(`virtusertable')dnl<br />
FEATURE(`relay_based_on_MX')dnl<br />
FEATURE(`use_ct_file', `/etc/mail/trusted-users')dnl<br />
FEATURE(`dnsbl',`ix.dnsbl.manitu.net',`"554 Rejected " $&{client_addr} " found in ix.dnsbl.manitu.net"')dnl<br />
FEATURE(`delay_checks')dnl<br />
HACK(`require_rdns')dnl<br />
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass/spamass.sock, F=T,T=S:4m;R:4m;E:10m')dnl<br />
include(`m4/clamav-milter.m4')dnl<br />
define(`confMILTER_MACROS_ENVRCPT',`r, v, Z, b')dnl<br />
define(`confMILTER_MACROS_EOM', `{msg_id}, {mail_addr}, {rcpt_addr}, i')dnl<br />
define(`confTO_QUEUEWARN', `1d')dnl<br />
define(`UUCP_MAILER_MAX', `0')dnl<br />
define(`confPRIVACY_FLAGS', `goaway')dnl<br />
define(`confAUTH_OPTIONS', `A')dnl<br />
TRUST_AUTH_MECH(`GSSAPI PLAIN LOGIN')dnl<br />
define(`confAUTH_MECHANISMS', `GSSAPI PLAIN LOGIN')dnl<br />
define(`confDONT_BLAME_SENDMAIL', `GroupReadableKeyFile')dnl<br />
define(`CERT_DIR', `/etc/ssl')dnl<br />
define(`confCACERT_PATH', `CERT_DIR/certs')dnl<br />
define(`confCACERT', `CERT_DIR/certs/ca-certificates.crt')dnl<br />
define(`confSERVER_CERT', `CERT_DIR/certs/leelaCert.pem')dnl<br />
define(`confSERVER_KEY', `CERT_DIR/private/leelaKey.pem')dnl<br />
define(`confCLIENT_CERT', `CERT_DIR/certs/leelaCert.pem')dnl<br />
define(`confCLIENT_KEY', `CERT_DIR/private/leelaKey.pem')dnl<br />
MAILER(`local')dnl<br />
MAILER(`smtp')dnl<br />
MAILER(`uucp')dnl<br />
<br />
* Über die erste Zeile ''include'' wird der komplette Makrozweig geladen, diese Zeile ist beim genannten Paket unabdingbar wichtig.<br />
* Über die ''Daemon-Options'' wird Sendmail IPv6-fit gemacht.<br />
* Die ''Client-Option'' dient dazu, [[Sendmail auf ausgehender IPA festsetzen|Sendmail zu zwingen, mit einer bestimmten Absenderadresse zu versenden]].<br />
* Die Bedeutung der übrigen Statements kann in der oben genannten README-Datei nachgelesen werden.<br />
<br />
Diese Konfiguration erlaubt grundlegend kein Relaying, es sei denn, im DNS ist der eigene Hostname als MX hinterlegt. Das erspart dem Administator, hier extra noch im Mailsystem herumzukonfigurieren (<code>relay_based_on_MX</code>). Ausnahmen können über die ''access_db'' definiert werden.<br />
<br />
=== Bedeutung der Konfigurationsdateien ===<br />
; access_db<br />
: ''/etc/mail/access'', Hashtabelle zur generellen Zugriffssteuerung, vergleichbar zu den Qmail-Konfigurationsdateien ''relaydomains'', ''tcprules.d/qmail-smtpd'' und teilweise smtproutes (SMTP-Auth für den SMTP-Client).<br />
; ct_file<br />
: ''/etc/mail/trusted-users'', Textdatei, in welcher lokale Benutzer referenziert werden, die sich als andere Benutzer ausgeben dürfen, ohne dass eine entsprechende Warnung in die Mailkopfzeilen eingebaut wird. Z.&thinsp;B. für Mailinglistensoftware oder Webmailsoftware notwendig.<br />
; mailertable<br />
: ''/etc/mail/mailertable'', Hashtabelle zur Verteilung Mails über die definierten Mailer, sofern der Default (MX-Lookup) nicht erwünscht ist. Für SMTP-Zielhosts, die '''nicht''' in eckigen Klammern stehen, wird trotzdem ein MX-Lookup vorgenommen und das Ergebnis zur Zustellung benutzt! Vergleichbar zur Qmail-Konfigurationsdatei ''smtproutes''.<br />
; virtusertable<br />
: ''/etc/mail/virtusertable'', Hashtabelle zur Verteilung von Mailadressen an '''lokale Benutzer'''. Damit kann ''info@domain1.de'' an z.&thinsp;B. ''infobla1'' zugestellt werden, während ''info@domain2.de'' an ''infobla2'' zugestellt wird. In den ''aliases'' oder als Benutzer selbst darf ''info'' nicht angelegt sein, weil diese Mechanismen Vorrang haben. Vergleichbar zur Qmail-Konfigurationsdatei ''virtualdomains''.<br />
<br />
In der Konfiguration implizit enthalten sind:<br />
; aliases<br />
: ''/etc/mail/aliases'', Hashtabelle zur Verteilung von Mails an einen anderen oder mehrere Empfänger. Kann als einzige Tabelle einfach mit <code>newaliases</code> neu aufgebaut werden. Vergleichbar zu ''/var/qmail/aliases/''.<br />
; local-host-names<br />
: ''/etc/mail/local-host-names'', zusätzlich zu dem eigenen Hostnamen als lokal (für die eigenen Benutzer) anzusehenden Domains. Vergleichbar zur Qmail-Konfigurationsdatei ''locals''.<br />
; service.switch<br />
: Konfigurationsdatei zum von Sendmail benutzten Name Service, unabhängig von der vom Betriebssystem vorhandenen Einstellung in ''/etc/nsswitch.conf''.<br />
<br />
Details zur Konfiguration können in ''/usr/share/sendmail/README'' nachgelesen werden.<br />
<br />
== Milter ==<br />
Milter sind Programme, die als '''M'''ail F'''ilter''' fungieren und üblicherweise über Unix Domain Sockets an Sendmail andocken. Siehe oben als Beispiel die Einbindung von Spamassassin über ''spamass-milter'', während Clamav über die vorgefertigte ''/etc/mail/m4/clamav-milter.m4'' eingebunden wird:<br />
INPUT_MAIL_FILTER(`clamav', `S=local:/var/run/clamav/clamav-milter.ctl, F=, T=S:4m;R:4m')dnl<br />
<br />
Details zur Einbindung sind in der jeweiligen Dokumentation der Milter nachzulesen, ob weitere Parameter notwendig sind, wie z.&thinsp;B. <code>confMILTER</code>-Parameter.<br />
<br />
== Fußnoten ==<br />
<references/><br />
<br />
== Siehe auch ==<br />
* [[Spamassassin]]<br />
<br />
== Weblinks ==<br />
* [http://www.sendmail.com/sm/open_source/ www.sendmail.org]<br />
* [http://www.gnu.org/software/m4/manual/index.html M4-Doku des GNU-Projektes]<br />
<br />
[[Kategorie:UNIX]]<br />
[[Kategorie:Internet]]</div>PoC