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:
- Defaults:
standardmäßig ist INPUT und FORWARD gesperrt
- Telnet: ich erlaube nur
Zugriffe aus dem lokalen Netz
- lokales Netz: ich gehe
davon aus dass aus meinem lokalen Netz
keine Dummheiten gemacht werden
und erlaube daher von diesem alles (Mail,Samba usw. sind offen)
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