Jails: Daily Mails und Monitoring

m4rkus

Well-Known Member
Hallo,

wie schon im anderen Thread erklärt, bin ich gerade dabei die Best Practices zusammenzusuchen...

Ich habe ein Webserver-Jail, welches über eine lo0-alias-Adresse kommuniziert.
Versuche ich nun eine E-Mail zu schicken, wie es bspw. auch periodic(8) tut, rejected mein Mailanbieter diese, da sie natürlich von einer "internen" Adresse (10.0.0.1) kommen.

Deaktiviert man in der Regel den Mailversand über periodic(8) oder wie wird das gehandhabt?
Aus dem Bauch heraus sind ja die Infos über Festplatte usw. im ersten Moment erstmal uninteressant. Lediglich sicherheitsrelevante Informationen sollten irgendwo überprüft werden.

Ich hab gelesen, dass bspw. Monit usw. auch über jls Kommandos innerhalb der Jails ausführen - gibt es einen allgemeinen Ansatz die Dinge, die normalerweise täglich geprüft / gemeldet werden, darüber abzuhandeln?

Edit: Pakete prüfen wäre ja mittels pkg -j <id> audit -F möglich.
Sollte ich dann den Security-Run um das Kommando für jedes Jail erweitern?

danke und Gruß
Markus
 
Moin.

Normalerweise sollte ein Webserver-Jail E-Mails senden können. Auch wenn es dir primär nur um die periodic-Nachrichten geht, kann es ja durchaus einmal erforderlich sein, dass in der Website ein Kontaktformular erforderlich wird.

Damit das Jail nach draußen mailen kann, wird der ausgehende Verkehr auf Port 25 zur IP des Hostsystems umgeschrieben (NAT Regel in der pf.conf).

best practice
 
Ich mache es so:
1) Im Jail läuft ein nur auf localhost lauschender MTA, der Mails per Smarthost an den zentralen Mailserver schießt.
2) Ich filtere die Mails durch. Z.B. nach "Daily Security Run Outputs", die Ausgabe meiner Scripte und so weiter.
3) Die Mails kann ich dann auswerten.
 
Ich mache es so:
1) Im Jail läuft ein nur auf localhost lauschender MTA, der Mails per Smarthost an den zentralen Mailserver schießt.
2) Ich filtere die Mails durch. Z.B. nach "Daily Security Run Outputs", die Ausgabe meiner Scripte und so weiter.
3) Die Mails kann ich dann auswerten.

Kannst du dazu noch mal ein paar mehr Zeilen schreiben? Welchen MTA nimmst du? Wie ist die Konfiguration?

Danke und Gruß
Markus
 
Ich habe ssmtp in den Jails laufen der dann wiederum an meinen Mailserver leiten der auch in einer Jail läuft. Allerding haben meine Jails öffentliche Adressen.
 
Warum nicht die Logs der Jails über Sockets einsammeln auf dem Jailhost und periodic nur auf dem Jailhost laufenhaben?
 
Ich lasse gerne einen OpenSMTPD in den Jails laufen um Mails aus Cronjobs und sonstigen Skripten versenden zu können.
 
Also, ein vollständiger MTA ist für die meisten Einsatzzwecke übertrieben. Man fährt besser mit Tools wie ssmtp oder ab FreeBSD 11.0 dann dma [0] aus dem Basissystem. Ich nehme den vollständigen MTA hauptsächlich, da einige Jails "richtiges" Mail können müssen und ich ein großer Freund so weit es geht homogener Konfigurationen. Als MTA setze ich Exim ein, da ich ein großes Exim-Setup geerbt habe, es keinen Sinn machte es umzustellen und ich keine Motivation habe mehrere MTA bis in den Schlaf zu erlernen. Dazu sollte man sagen, dass ein richtiges Exim nichts mit dieser Vergewaltigung zu tun hat, die Debian und Konsorten als Exim verkaufen. Es kommt ohne m4 aus und hat eine zentrale, leicht verständliche Konfiguration. Zu Exim gibt es außerdem ein großes Handbuch [1].

Die /usr/local/etc/exim/configure versucht in diesem Geist auch gleich so viele Einsatzzwecke wie möglich abzudecken. Die Magie ist der 'smarthost_smtp' genannte Router, in Kombination mit den PLAIN- und LOGIN SMTP-Clients am Ende:

Code:
# ------------------------------------------------------------------- #
#  Exim MTA Konfiguration  #
#  fuer Version 4.8x  #
#  13.05.2013  #
# ------------------------------------------------------------------- #

# Dies Exim-Konfiguration besteht grob aus 7 Sektionen, deren Reihen-
# folge teilweise wichtig ist. Ebenso kann die Reihenfolge der Opti-
# onen in den Sektionen wichtig sein. Ich habe mich fuer eine grosse
# Datei entschieden, da dies meiner Meinung nach deutlich lesbarer als
# der "Debian-Stil" mit unzaehligen sich gegenseitig einbindenden
# Dateien ist. Alle Optionen sind ausfuerlich kommentiert, das sollte
# bitte beibehalten werden. Bei Fragen ist die extrem umfangreiche
# Doku immer sehr hilfreich. :)

# ------------------------------------------------------------------- #

# 1. Allgemeine Optionen
# ======================

# Dies sind allgemeine Optionen, die Exim als
# Ganzes betreffen. Teilweise handelt es sich
# um "echte" Einstellungen, teilweise sind es
# aber auch nur Makros, die spaeter erneut
# referenziert werden.

# Der Hostname der Maschine, auf welcher Exim
# laeuft. Wird er hier nicht explizit gesetzt,
# nutzt Exim den Hostnamen des Hosts. In allen
# Faellen muss der Hostname ein FQDN sein!
primary_hostname = workstation1.example.com

# Adresse auf die wir lauschen
local_interfaces = 127.0.0.1

# Eine Liste lokaler Domains, also Domains die
# wir als Master oder Slave verwalten. Die
# einzelnen Eintraege werden durch Doppelpunkte
# getrennt. Dies ist ein Makro.
domainlist local_domains = @

# Eine Liste aller Domains, fuer die wir Mails
# annehmen und weiterleiten (relayen), obwohl
# es sich nicht um eine lokale Domain handelt.
# Die Option ist mit grosser Vorsicht zu
# geniessen, denn man kann hier leicht alle
# Tueren fuer Spammer oeffnen. Die einzelnen
# Eintraege sind durch Doppelpunkte getrennt.
# Dies ist ein Makro.
domainlist relay_to_domains =

# Eine Liste aller Hostnamen, deren Mails wir
# ohne weitere Pruefung weiterleiten. Auch diese
# Option ist extrem gefaehrlich, denn man kann
# mit ihr leicht offene Relays bauen. Die
# einzelnen Eintraege werden durch Doppelpunkte
# getrennt. Dies ist ein Makro.
hostlist relay_from_hosts = localhost

# Name der ACL, welche vor dem Annehmen einer
# Mail (also nachdem zwar der Header aber noch
# kein Body empfangen wurde) ausgefuehrt wird.
acl_smtp_rcpt = acl_check_rcpt

# Name der ACL, die nach dem Empfang einer Mail
# (also nachdem der Body empfangen wurde) aus-
# gefuerht wird.
acl_smtp_data = acl_check_data

# Wenn wir eine Mail ohne FQDN uebergeben bekommen
# - also z.B. "root" statt "root@test.com" - wird
# diese Domain angehaengt um eine valide E-Mail
# zu generieren. Kann theoretisch auf jede Mail
# angewandt werden, in der praxis natuerlich nur
# fuer Mails von lokalen Nutzern relevant.
#qualify_domain = example.com

# Das gleiche wie bei "qualify_domain", lediglich
# fuer den Empfaenger. So wuerde z.B. aus "root"
# wieder "root@test.com" werden und die Mail kann
# zugestellt werden.
#qualify_recipient = example.com

# Der Nutzer, unter dem Exim laeuft
exim_user = mailnull

# Die Gruppe unter der Exim laeuft
exim_group = mail

# Liste der Nutzer unter der Exim
# (bis auf den Master!) niemals
# laufen wird.
never_users = root

# Hosts fuer die ein Rueckwaertsabfrage des
# Hostnames auf Basis der ermittelten IP
# durchgefuert wird. Es ist sehr sinnvoll
# dies fuer alle "*" IP-Adressen zu machen,
# damit sich sinnvolle Logs ergeben. Man
# kann es aber auf einzelne Subnetze
# begrenzen.
host_lookup = *

# Fuer welche Hosts IDENT Lookups durch-
# gefuehrt werden. Sie tun nicht weh und
# wenn wirklich jemand einen solchen Service
# betreiben sollte, fuehrt es zu besseren
# Logs.
rfc1413_hosts = *

# Wie lange bei IDENT Looksups gewartet
# wird, bevor Exim aufgibt. 5 Sekunden
# sind ein guter Wert, da die meisten
# Dienste in der Zeit antworten und es
# die Mail nicht zu lange aufhaelt.
rfc1413_query_timeout = 5s

# Wenn Bounce-Mails gefroren sind, wird nach
# 2 Tagen dennoch ein neuer Zustellversuch
# unternommen. Ist er nicht erfolgreich,
# werden die Fehler ignoriert und die Mail
# in den Muell geworfen.
ignore_bounce_errors_after = 2d

# Verwerfe gefrorene Mails nach dieser Zeit.
# 7 Tage sind ein guter wert, schon deutlich
# ueber den 72h der RFC, aber zugleich noch
# kurz genug um die Queue nicht zu verstopfen.
timeout_frozen_after = 7d

# Die maximale Groesse einer E-Mail. Dabei
# ist zu beachten, dass Exim die Groesse erst
# erkennen kann, wenn diese Menge Daten auch
# tatsaechlich uebertragen wurde.
message_size_limit = 200M

# ------------------------------------------------------------------- #

# 2. ACL
# ======

# ACL pruefen ob eine Mail angenommen wird oder
# nicht. Dabei werden sie von oben nach unten
# durchlaufen, sobald eine Regel greift wird sie
# sie auf die Mail angewandt und die Bearbeitung
# endet.

begin acl

# Die RCPT-ACL, also jene ACL die angewand wird,
# wenn der Header uebertragen wurde, der Body aber
# noch nicht. Sie kann die Mail korrekt ablehnen.
acl_check_rcpt:

  # Falls die Mail ueber einen Unix-Socket gekommen
  # is (also das Host-Feld leer ist!), nehmen wir sie
  # ohne weitere Pruefungen an.
  accept  control = dkim_disable_verify

  # Wir lehnen Mails ab, die ungewoehnliche Zeichen
  # in der Adresse haben und an uns gerichtet sind.
  # Trifft fast ausschliesslich nicht zustellbaren
  # Spam.
  deny  message  = Restricted characters in address
  domains  = +local_domains
  local_parts  = ^[.] : ^.*[@%!/|]

  # Wie oben lehnt auch diese Regel alle Mails ab, die
  # ungewoehnliche Zeichen beinhalten. Aber dieses mal
  # sind die Regeln etwas weniger streng, da alle nicht
  # an uns gerichteten Mails betroffen sind und dort
  # womoeglich einige obskure Zeichen zulaessig sind.
  deny  message  = Restricted characters in address
  domains  = !+local_domains
  local_parts  = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  # Mails an Postmaster werden fuer alle lokalen
  # Domains akzeptiert.
  accept  local_parts  = postmaster
  domains  = +local_domains

  # Mails von Hosts fuer die wir Relay sind, nehmen wir
  # an. Wir markieren sie als "submission", da es sich
  # wahrscheinlich um MUA handelt und wir die Mails
  # daher auf Standardkonformitaet pruefen und zur Not
  # anpassen wollen.
  accept  hosts  = +relay_from_hosts
  control  = submission
  control  = dkim_disable_verify

  # Mails ueber authentifizierte Verbindungen nehmen
  # wir in jedem Fall an. Wieder markieren wir sie
  # als "submission".
  accept  authenticated = *
  control  = submission
  control  = dkim_disable_verify

  # Alles war jetzt noch uebrig ist und angenommen werden
  # soll, ist entweder an uns gerichtet oder an eine
  # Domain zu der wir relayen. Entsprechend lehnen
  # wir alles andere ab.
  require message = relay not permitted
  domains = +local_domains : +relay_to_domains

  # Pruefung, ob der Empfaenger existiert. Lokal wissen wir
  # es, extern schauen wir ob wir den Server erreichen koennen.
  # Wenn nicht, lehnen wir ab.
  require verify = recipient

  # Alles war jetzt noch nach ist, ist legitim und
  # wird daher angeommen.
  accept

# Die Data-ACL, also jene ACL die auf komplett vorliegende
# Mails angewand wird. Da die Mail zu diesem Zeitpunkt schon
# angenommen ist, koennen wir sie nicht ablehnen und noch
# maximal einen Bounce generieren. Wird vor allem fuer
# Contentfilter genutzt.
acl_check_data:

  # Alles was bis hier gekommen ist
  # wird ohne weiteres zoegern
  # angenommen.
  accept

# ------------------------------------------------------------------- #

# 3. Router
# =========

# Router manipulieren E-Mails oder ordnen sie
# einem Transport zu. Anschliessend werden sie
# durch den Transport zugestellt. Eine Mail
# durchlaeuft alle Router von oben nach unten,
# sobald sie von einem Router angenommen wurden,
# werden sie an den Transport uebergeben.
begin routers

# Per Smarthost leiten wir blind
# alle Mails an den Hauptserver
# weiter.
smarthost:
  driver = manualroute
  transport = smarthost_smtp
  domains = *
  route_list = * mail.example.com
  no_more

# ------------------------------------------------------------------- #


# 4. Transports
# =============

# Transports werden von Routern aufgerufen und
# bearbeiten die Mail weiter, d.h. im Normalfall
# stellen sie diese zu.

begin transports

# Sendet E-Mails per SMTP
# an andere Server.
remote_smtp:
  driver = smtp

# Sendet Mails per SMTP an
# den Smarthost. Fuehrt dazu
# eine Authentifizierung durch.
smarthost_smtp:
  driver = smtp
  protocol=smtps
  hosts_require_auth = mail.example.com
  hosts_require_tls = mail.example.com

# ------------------------------------------------------------------- #

# 5. Retry
# ========

# Retries spezifizieren, wie lange das
# Zustellen einer nicht zustellbaren
# Mail in welchen Abstaenden versucht
# wird.

begin retry

# - Die ersten 2h alle 15 Minuten
# - Dann fuer 4 Tage erste 1h, jeweils um 1,5 erhoeht
# - Nach 4 Tagen jeweils alle 6h
*  *  F,2h,15m; G,16h,1h,1.5; F,4d,6h

# ------------------------------------------------------------------- #

# 6. Rewrite
# ==========

# Mit Rewrite-Rules kann man Exim die
# Absender und Empfaenger ein- und
# ausgehender Mails veraendern.

begin rewrite

# ------------------------------------------------------------------- #

# 7. Authenticators
# =================

# Authenticators erlauben es SMTP-Nutzern
# sich gegenueber dem Server zu authentifizieren.
# Muss jeweils fuer ein Protokoll definiert
# werden.

begin authenticators

login:
  driver = plaintext
  public_name = LOGIN
  client_send = ": smtp-username : smtp-paswort"
plain:
  driver = plaintext
  public_name = PLAIN
  client_send = "^smtp-username^smtp-passwort"

Anschließend wird in der /etc/mail/mailer.conf Sendmail durch Exim ersetzt:

Code:
sendmail /usr/local/sbin/exim
send-mail /usr/local/sbin/exim
mailq /usr/local/sbin/exim
newaliases /usr/local/sbin/exim
hoststat /usr/local/sbin/exim
purgestat /usr/local/sbin/exim

Ihn in der /etc/rc.conf einschalten:
Code:
# Sendmail
# --------
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

# Exim
# ----
exim_enable="YES"

Und - ganz wichtig - in /etc/aliases ein Alias als Zieladresse für die Systemmails eintragen. Ganz oben:
Code:
# Pretty much everything else in this file points to "root", so
# you would do well in either reading root's mailbox or forwarding
# root's email from here.

root: admin@example.com

0: https://www.freebsd.org/cgi/man.cgi?query=dma&manpath=FreeBSD+11-current
1: http://exim.org/exim-html-current/doc/html/spec_html/index.html
 
Zurück
Oben