Inhalt

7. Skripte: Automatisierung & Sicherheit

In den vorherigen Kapiteln wurde erklärt, wie man E-Mails versenden und empfangen kann. Man will nun aber nicht das Versenden der Mails ständig von Hand starten, sondern dies zu bestimmten Zeiten automatisch ausführen. Hierzu genügt ein einfaches Script und ein Eintrag in die Datei /etc/crontab.
Man kann auch einen Eintrag in der Datei /etc/ppp/ip-up vornehmen. Diese Datei wird bei jeder Onlineverbindung ausgeführt. Ich bevorzuge jedoch die Script- Methode.

7.1 Mail

Hier ist ein Script, das eine Onlineverbindung herstellt, mit fetchmail Mails empfängt, mit sendmail Mails versendet und danach die Onlineverbindung wieder beendet:
#!/bin/sh
#
# Mailserver-HOWTO
#
# Dirk Bender 07.07.2003
#
# Eintrag in der Messages:
date +"%b %d %T Verarbeite E-mails..." >> /var/log/messages

# ISDN-Verbindung herstellen:
isdnctrl dial ippp0
#
# kurz warten:
sleep 10
#
# Mails empfangen:
/usr/bin/fetchmail -a >>/var/log/fetchmail 2>&1
#
# Mails versenden:
sendmail -q
#
# Offline gehen:
isdnctrl hangup ippp0
#
# Noch ein Eintrag in die Messages:
date +"%b %d %T Verarbeitung der E-Mails beendet" >> /var/log/messages
Einige Provider erlauben erst nach erfolgreicher POP3- Anmeldung das Versenden von E-Mails. Daher ist es wichtig, daß fetchmail zuerst ausgeführt wird, da hierbei die POP3- Anmeldung beim Provider erfolgt.
 
Modem-Benutzer müssen das Script noch entsprechend anpassen. Flatrate-Nutzer können logischerweise auf die Einwahl verzichten. Das Script kann nun z.B. unter /root/bin/email gespeichert, ausführbar gemacht (chmod 700 /root/bin/email) und bei Bedarf gestartet werden.

7.2 Crontab

Um den Start zu automatisieren genügt ein Eintrag in die Datei /etc/crontab. Das Beispiel 1 startet das Script jeden Tag um 5:00 Uhr Morgens, das zweite von 5:00 bis 20:00 Uhr alle 15min:
# 1. E-Mails einmal täglich senden u. empfangen
0     5    * * *   root    /root/bin/email


# 2. E-Mails alle 15min senden u. empfangen
*/15  5-20 *  *  *      root    /root/bin/email

Um den neuen Eintrag zu aktivieren muß der Cron-Dämon neu gestartet werden!

7.3 Firewall

In dieser Howto gehe ich ja davon aus, dass der Mailserver rein für ein internes Netzwerk benutzt wird und nur eine Verbindung zum Internet aufbaut um die Mails abzurufen bzw. zu versenden. Je nach Konfiguration der Firewall sollte der POP3-Port (110) für Zugriffe von außen gesperrt werden. Falls man es doch ermöglichen möchte dass Mails von außen abgerufen werden, muß man sich darüber im klaren sein, dass die Passwörter im Klartext übermittelt  werden.
Weiterhin sollte Telnet von außen nicht erlaubt werden. Wenn Telnet also für die Benutzer zum Ändern der Passwörter aktiviert wird sollte der Port in der Firewall für Zugriffe vom Internet gesperrt werden.
Ich werde hier kein Firewall-Script erkären - dafür gibt es ja andere Howtos ;). Meine Firewall in diesem Beispiel richtet sich nach dem sichereren Prinzip: Alles sperren was nicht ausdrücklich erlaubt ist. In diesem Fall brauche ich POP3 garnicht zu sperren. Wichtig sind die drei Einträge Defaults, Telnet und lokales Netz:

Dieses Skript kann als Grundlage benutzt und weiter ausgebaut werden. Da ich mich mit iptables selbst noch nicht so gut auskenne sind Verbesserungsvorschläge sehr willkommen:
#!/bin/sh

# Iptables
FW="/usr/sbin/iptables"

# Netz
NETINT="aaa.bbb.ccc.ddd/24"

# Devices
DEVINT="eth0"
DEVEXT="ppp0"

# IP- Forwarding aktivieren
echo 1 > /proc/sys/net/ipv4/ip_forward

# vorhandene Regeln löschen
$FW -F
$FW -X
$FW -t nat -F

# Defaults
$FW -P INPUT DROP
$FW -P FORWARD DROP
$FW -P OUTPUT ACCEPT

# Pakete vom lokalen Rechner erlauben (u.a. wg. Mail)
$FW -A INPUT -s 127.0.0.1 -i lo -p tcp -j ACCEPT

# DNS- Anfragen
$FW -A INPUT -i $DEVEXT -p udp --sport domain -j ACCEPT
$FW -A FORWARD -p tcp --dport domain -j ACCEPT
$FW -A FORWARD -p udp --dport domain -j ACCEPT

# Ping
$FW -A INPUT -s $NETINT -i $DEVINT -p icmp -j ACCEPT
$FW -A FORWARD -s $NETINT -i $DEVINT -p icmp -j ACCEPT
$FW -A FORWARD -p icmp -j ACCEPT

# Masquerade
$FW -t nat -A POSTROUTING -o $DEVEXT -j MASQUERADE

# Pakete die schon zu einer Verbindung gehören erlauben
$FW -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$FW -A FORWARD -i $DEVEXT -o $DEVINT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ... leitet alle Port 80- Anfragen an Squid
$FW -A PREROUTING -t nat -i $DEVINT -p tcp --dport http -j REDIRECT --to-port 3128

# SSH
$FW -A INPUT -p tcp --dport ssh -j ACCEPT
$FW -A FORWARD -o $DEVEXT -p tcp --dport ssh -j ACCEPT

# Telnet (nur vom internen Netz; wg. Passwörtern)
$FW -A INPUT -i $DEVINT -s $NETINT -p tcp --dport telnet -j ACCEPT
$FW -A INPUT -p tcp --dport telnet -j DROP
$FW -A INPUT -p udp --dport telnet -j DROP

# lokales Netz (ich erlaube alles)
$FW -A INPUT -s $NETINT -i $DEVINT -p tcp -j ACCEPT
$FW -A INPUT -s $NETINT -i $DEVINT -p udp -j ACCEPT


Inhalt