3.4. Sicherheit

Ein Computer ist umso sicherer, je weniger Dienste auf ihm laufen. Dann hat er eine geringere Angriffsfläche. Am besten ist es, wenn die nicht benötigten Dienste ganz deaktiviert werden und man sich nicht komplett auf die Firewall verlässt. Außerdem nützt die Firewall gar nichts, wenn der verwendete Server eine Sicherheitslücke hat. Daher sollte in regelmäßigen Abständen die Software upgedatet werden.

3.4.1. Firewall

Die Firewall, die auf dem Server eingerichtet werden soll, schützt den Server zum einen vor dem Internet und zum anderen vor dem lokalen Netzwerk. Immer wenn der Server online ist, ist er auch im Internet sichtbar - und daher auch angreifbar. Die Firewall soll so konfiguriert sein, dass sie nur die unbedingt benötigten Dienste erlaubt. Alles andere wird blockiert.

Das Firewall-Script wird hier nicht abgedruckt. Es ist aber im Anhang zu finden. Zunächst einmal wird das Script nach /usr/local/sbin/firewall kopiert. /etc/init.d/firewall ist ein symbolischer Link darauf. Und /etc/rc[2345].d/S10firewall sind ebenfalls symbolische Links, aber relative mit ../init.d/firewall als Ziel.

Jetzt ist das Firewall-Script fertig installiert. Beim Systemstart wird es automatisch geladen. Manuell kann dies mit /etc/init.d/firewall start nachgeholt werden. Die Firewall kann mit /etc/init.d/firewall stop komplett deaktiviert werden.

Die Firewall besteht unter Linux aus mindestens zwei Teilen: INPUT und OUTPUT. Ein ankommendes Paket kommt immer nach INPUT, ein vom Server generiertes und ihn verlassendes Paket durchläuft immer die Firewallregeln in OUTPUT. Für beide Teile kann eine Standardreaktion eingestellt werden, wenn keine Firewallregel zutrifft. Bei INPUT werden alle Pakete verworfen und bei OUTPUT wird alles erlaubt.

Die Firewall startet mit sich gleich den Proxy-Manager (/usr/local/sbin/proxy-manager). Der Proxy-Manager verwaltet die Internet-Freigabe und schreibt in die Datei /var/state/internet-freigabe, welche Computer bis zu welchem Zeitpunkt freigeschaltet sind. Das selbstgeschriebene squid-redirector-Script (/usr/local/sbin/squid-redirector) benutzt diese Information und leitet entweder zur richtigen Internet-Adresse weiter (genauer: zu squidGuard) oder zeigt eine Fehlermeldung an. Siehe auch Abschnitt 4.3, „proxymanager“.

3.4.2. inetd

Über den speziellen Server "inetd" werden bei Bedarf weitere Server gestartet. Da viele Dienste gar nicht benötigt werden, sollten sie ganz deaktiviert werden. Die Konfigurationsdatei zu "inetd" heißt /etc/inetd.conf. Mit einem "#" am Anfang der Zeile werden bestehende Einträge auskommentiert. Mindestens zwei Einträge sollten aber belassen werden: der smtp-Dienst und der pop3-Dienst. Ohne diese Dienste können die Clients keine Mails mehr verschicken und empfangen. Eine minimale Konfigurationsdatei sieht daher so aus:

#
# /etc/inetd.conf
#

smtp   stream  tcp  nowait  mail  /usr/sbin/exim   exim -bs
pop-3  stream  tcp  nowait  root  /usr/sbin/tcpd
                                  /usr/sbin/in.qpopper -f /etc/qpopper.conf

Mit /etc/init.d/inetd restart wird die Konfiguration übernommen.

3.4.3. netstat und nmap

netstat und nmap sind zwei Tools, mit denen die Sicherheit ein wenig ausgelotet werden kann. nmap muss gegebenenfalls mit apt-get install nmap nachinstalliert werden.

3.4.3.1. netstat

netstat zeigt aktuelle Netzwerkverbindungen und geöffnete Ports an. Dazu muss netstat -tuanp aufgerufen werden. "-t" steht dabei für das Protokoll TCP, "-u" für UDP, "-a" zeigt alle Einträge an (nicht nur bestehende Verbindungen) und "-n" zeigt alle Ports und IP-Adressen numerisch an. "-p" zeigt zusätzlich - wenn vorhanden - das Server-Programm an.

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address    Foreign Address  State   PID/Program name
tcp        0      0 0.0.0.0:37       0.0.0.0:*        LISTEN  201/inetd
tcp        0      0 0.0.0.0:9        0.0.0.0:*        LISTEN  201/inetd
tcp        0      0 0.0.0.0:139      0.0.0.0:*        LISTEN  213/smbd
tcp        0      0 0.0.0.0:13       0.0.0.0:*        LISTEN  201/inetd
tcp        0      0 0.0.0.0:110      0.0.0.0:*        LISTEN  201/inetd
tcp        0      0 0.0.0.0:79       0.0.0.0:*        LISTEN  201/inetd
tcp        0      0 0.0.0.0:111      0.0.0.0:*        LISTEN  113/portmap
tcp        0      0 0.0.0.0:80       0.0.0.0:*        LISTEN  240/apache
tcp        0      0 0.0.0.0:113      0.0.0.0:*        LISTEN  201/inetd
tcp        0      0 0.0.0.0:21       0.0.0.0:*        LISTEN  201/inetd
tcp        0      0 0.0.0.0:631      0.0.0.0:*        LISTEN  206/cupsd
tcp        0      0 0.0.0.0:23       0.0.0.0:*        LISTEN  201/inetd
tcp        0      0 0.0.0.0:25       0.0.0.0:*        LISTEN  201/inetd
udp        0      0 0.0.0.0:517      0.0.0.0:*                201/inetd
udp        0      0 0.0.0.0:518      0.0.0.0:*                201/inetd
udp        0      0 192.168.0.3:137  0.0.0.0:*                208/nmbd
udp        0      0 0.0.0.0:137      0.0.0.0:*                208/nmbd
udp        0      0 0.0.0.0:9        0.0.0.0:*                201/inetd
udp        0      0 192.168.0.3:138  0.0.0.0:*                208/nmbd
udp        0      0 0.0.0.0:138      0.0.0.0:*                208/nmbd
udp        0      0 0.0.0.0:111      0.0.0.0:*                113/portmap

Bei TCP steht unter State "LISTEN", das heißt, dass hier ein Dienst auf neue Verbindungen wartet.

3.4.3.2. nmap

nmap ist ein sogenannter Portscanner. Er kann zum Beispiel dazu benutzt werden, eine Firewall zu testen. nmap zeigt dabei dann alle offene Ports an. Am besten wird nmap von verschiedenen Rechnern im Intranet und Internet ausgeführt. Ein Beispielaufruf:

server:~# nmap 192.168.0.1

Starting nmap V. 2.54BETA31 ( www.insecure.org/nmap/ )
Interesting ports on server.adabolo.homelinux.net (192.168.0.1):
(The 1545 ports scanned but not shown below are in state: closed)
Port       State       Service
22/tcp     open        ssh
25/tcp     open        smtp
37/tcp     open        time
53/tcp     open        domain
80/tcp     open        http
139/tcp    open        netbios-ssn
444/tcp    open        snpp
4557/tcp   open        fax
4559/tcp   open        hylafax

Nmap run completed -- 1 IP address (1 host up) scanned in 1 second

Auf den angezeigten Ports ist eine Verbindung möglich. Das heißt, dass dieser Dienst erreichbar ist.

3.4.4. Backup

Um die Datensicherheit des Servers zu verbessern (wenn Software-RAID eingerichtet wurde, besteht schon eine Sicherheit), soll wöchentlich ein Backup der Home-Verzeichnisse (alles unterhalb von /home/) erstellt werden. Dieses Backup kann dann auf ein externes Medium gesichert werden (z.B. DVD).

Zuerst muss das Script /usr/local/sbin/userdir-backup.sh erstellt werden:

#!/bin/sh
# Liste der alten Backup-Dateien erstellen...
filelist=`ls /usr/local/samba/admin/userdir-backup/userdir-backup-*`

tmpfile= `mktemp /tmp/backup-filelist.XXXXXX`

echo 'Backup home-directories (/home) ...'
echo
tar cv /home 2> $tmpfile | bzip2 | split -b 2047m - \
  /usr/local/samba/admin/userdir-backup/userdir-backup-`date +%Y%m%d`.tar.bz2.

if [ $? -ne 0 ]; then
  # es ist ein Fehler aufgetreten
  cat $tmpfile
else
  # kein Fehler
  # jetzt die (ganz) alten Backups löschen
  rm /usr/local/samba/admin/userdir-backup/old/*
  # die alten Backups verschieben
  mv $filelist /usr/local/samba/admin/userdir-backup/old/
fi

echo `cat $tmpfile | wc -l` files backup up.
rm $tmpfile

df -h

Zunächst muss dieses Script noch mit chmod 700 /usr/local/sbin/userdir-backup.sh ausführbar gemacht werden. Wenn dieses Script ausgeführt wird, dann werden unterhalb von /usr/local/samba/admin/userdir-backup/ (also im Verzeichnis "userdir-backup" in der Samba-Freigabe "admin") mehrere Dateien erstellt, die eine maximale Größe von 2 GB haben (2047 MB). Die Namen der Dateien sind folgendermaßen aufgebaut: userdir-backup-%datum.tar.bz2.%endung. Datum ist z.B. "20031019", also zuerst das Jahr, der Monat und dann der Tag. Die Endung wird hochgezählt und beginnt mit "aa". Die erste Datei hat also die Endung "aa", die zweite "ab", die dritte "ac" usw.

Um das Backup zurückzusichern müssen diese Dateien zunächst wieder zu einer sehr großen einzelnen Datei zusammengeführt werden. Diese Datei ist aber möglicherweise zu groß, deshalb werden - wie beim Sichern - mehrere Befehle auf einmal angewandt: Mit cat userdir-backup-%datum.tar.bz2.* | bunzip2 | tar xv kann das Backup zurückgesichert werden. Diese Befehlskette muss aber im Root-Verzeichnis (/) ausgeführt werden oder man muss das entpackte Home-Verzeichnis entsprechend verschieben.

Damit das Backup-Script nun wöchentlich ausgeführt wird, muss ein sogenannter Crontab-Eintrag erstellt werden. Mit folgendem Crontab-Eintrag wird das Script jeden Sonntag (5. Wert: 0) um 04:00 Uhr (2. Wert: 4; 1. Wert: 0) als Benutzer "root" ausgeführt.

0 4 * * 0 root /usr/local/sbin/userdir-backup.sh

Dieser Eintrag wird der Datei /etc/crontab als letzte Zeile hinzugefügt. Damit ist das Backup-Script fertig installiert.

3.4.5. sudoers

Da Linux ein Multiuser-Betriebssystem ist, haben gewöhnliche Benutzer nur wenige Rechte. Im Gegensatz dazu hat der Superuser, der Administrator oder "root", alle Rechte. So darf beispielsweise nur der Administrator das Passwort eines x-beliebigen Benutzers ändern. Manche CGI-Programme für die Weboberfläche benötigen genau dieses Recht (Passwort ändern oder Passwort zurückstellen). Damit dies trotzdem realisierbar ist, gibt es ein Programm, mit dessen Hilfe man andere Programme als root ausführen kann. Dieses Programm heißt "sudo" und muss wahrscheinlich mit apt-get install sudo noch nachinstalliert werden.

Alle CGI-Programme laufen unter dem Benutzer www-data. Diesem Benutzer soll nun erlaubt werden, einige Programme als root auszuführen. Mit visudo wird die Konfigurationsdatei /etc/sudoers bearbeitet. Sie muss folgenden Inhalt haben:

#
# /etc/sudoers
#

# Host alias specification
Host_Alias LOCAL = 127.0.0.1, 192.168.0.1

# User alias specification
User_Alias WWW = www-data

# Runas alias specification
Runas_Alias USERS = root, homepage

# Cmnd alias specification
Cmnd_Alias COMMANDS = /usr/sbin/usermod, /usr/local/sbin/generate_apache_auth,\
                      /usr/bin/smbpasswd, /usr/local/sbin/change-aliases,\
                      /usr/local/sbin/proxy-manager, /usr/local/sbin/firewall,\
                      /usr/local/sbin/mirror-hp.sh, /usr/sbin/groupadd,\
                      /usr/sbin/useradd, /bin/chown, /bin/ln, /bin/mkdir,\
                      /usr/sbin/setquota,\
                      /usr/local/sbin/make_mozilla_config.pl, /usr/bin/passwd,\
                      /usr/local/sbin/chpw.pl, /usr/local/sbin/rmusr.pl,\
                      /usr/local/sbin/user-status, \
                      /usr/local/sbin/user-status3, /usr/sbin/userdel, \
                      /usr/sbin/groupdel, /bin/rm, /bin/mv

# User privilege specification
root ALL = (ALL) ALL
WWW LOCAL = (USERS) NOPASSWD: COMMANDS
#www-data ALL=(ALL) NOPASSWD: ALL

Der Benutzer "www-data" kann jetzt mit sudo /usr/sbin/useradd neuer_benutzer zum Beispiel einen neuen Benutzer hinzufügen, was sonst nur root dürfte.