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.
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“.
Ü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.
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.
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.
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.
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.
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.