erschienen in LinuxEnterprise 7/2001, Software & Support Verlag, Frankfurt a.M.
Linux genießt zu Recht einen guten Ruf als sicheres Betriebssystem. Auf diesen Lorbeeren können sich Netzwerkadministratoren allerdings nicht ausruhen. Konfigurations- und Softwarefehler werden schnell zum Einfallstor für ungebetenen Besuch. Dies gilt natürlich besonders für Internet-Server und Unternehmensnetze. Aber auch kleine und mittlere Unternehmen werden immer öfter zum Ziel, seit eine DSL-Standleitung erschwinglich geworden ist. Diese Serie zeigt, wie sich jeder wirksamer vor Schäden durch Hacker und Script Kiddies schützen kann.
Natürlich denkt jeder beim Thema Sicherheit sofort an Firewalls und Intrusion Detection. Aber schon durch die geschickte Linux-Konfiguration wird das Risiko, zum Opfer zu werden, deutlich vermindert. Dieser erste Teil behandelt deshalb bewährte, wirksame Sicherheitsmaßnahmen mit geringem Aufwand, die nicht nur auf Firewalls und Internetservern genutzt werden können. Der zweite Teil der Serie beschreibt tiefere Eingriffe in das System, während im letzten Teil die Erkennung von Angriffen und Abwehrmaßnahmen im Vordergrund stehen. Setzt man alle Maßnahmen konsequent um, erhält man ein "hartes" Linux als sichere Basis für eine Firewall oder einen Internet-Server.
Die einfache Linux-Standardinstallation macht Umsteigern den Einstieg in dieses komplexe Betriebssystem sehr leicht, indem es grafische Benutzeroberflächen, Anwendungssoftware und Tools im Umfang mehrerer hundert Megabytes installiert und alle möglichen Netzwerkdienste startet. Auf einem alleinstehenden PC ist dies durchaus tolerierbar. Ein Unternehmen sollte dagegen den minimalistischen Ansatz wählen: Es wird nur installiert, was unbedingt für die Geschäftsprozesse benötigt wird: "Was nicht vorhanden ist, kann auch nicht zum Sicherheitsproblem werden oder Administrationskosten verursachen."
Eine gut geplante Installation ist die Voraussetzung für ein sicheres, stabiles System. Für eine Firewall oder einen Internet-Server wählt man die Minimalkonfiguration. Die SuSE-Distribution enthält bereits eine vordefinierte Konfiguration für Demilitarisierte Zonen (DMZ). Um jedes Risiko sicher auszuschließen, darf der betreffende Rechner während der Installation nicht mit dem internen Netzwerk und schon gar nicht mit dem Internet verbunden werden. Die während der Installation bei einigen Distributionen angebotene MD5-Verschlüsselung und Shadow-Passworte nehmen wir gerne an.
Für Serverdienste empfiehlt es sich, die Source-RPMs anstatt der Binary-RPMs zu installieren. Üblicherweise sind bei letzteren während der Kompilierung alle möglichen Optionen mit übersetzt worden, um die Installation und Anwendung der Software zu vereinfachen. Die wenigsten Möglichkeiten einer Software werden später auch wirklich genutzt. Deshalb gilt auch hier der bereits erwähnte minimalistische Grundsatz. So bleibt das System und seine Funktionen übersichtlich, die Zahl der möglichen Angriffspunkte verringert sich ebenso wie die Anzahl der Logbucheinträge. Unregelmäßigkeiten, die auf einen Eindringling hinweisen können, fallen schneller auf.
Der sicherste Aufbewahrungsort für ein Betriebssystem -insbesondere auf Firewalls- ist natürlich ein Read-Only-Medium wie die CD-ROM. Die individuelle Konfiguration würde dann auf einer Diskette platziert und kann dort durch den Schreibschutz gesichert werden. Bliebe noch das Problem der Hauptspeicherauslagerung (SWAPing), das sich durch eine RAM-Disk lösen lässt. Vom Standpunkt der Sicherheit ist dies eine unglückliche Lösung, da sich in den ausgelagerten Daten für Angreifer wertvolle Informationen verbergen können. Zwar gibt es den International Kernel Crypto Patch, den Gerätetreiber PPDD und das Crypto File System CFS, die aber bisher keinen Eingang in den offiziellen Kernel gefunden haben.
Leider wird immer häufiger selbst auf Servern nur noch eine Partition angelegt. Da das Dateisystem eine baumartige Struktur hat, kann ein schwerwiegender Fehler im Dateisystem große Abschnitte beeinträchtigen. In diesem Fall ist fast immer eine zeitaufwändige Neuinstallation nötig. Unterteilt man das Dateisystem aber in mehrere Teile, bleiben Datenverluste lokal begrenzt. Das Zurückspielen einer hoffentlich vorhandenen Sicherheitskopie einer einzelnen Partition geht wesentlich schneller von der Hand als eine Neuinstallation.
Über die notwendige Größe der einzelnen Partitionen gibt es eine Vielzahl von Meinungen. Sie hängt natürlich immer auch von der späteren Anwendung des Rechners ab. Eine Firewall benötigt beispielsweise keine eigene Home-Partition, während ein Proxy-Server eine eigene Cache-Partition haben sollte. In der Praxis haben sich diese Werte für eine Firewall mit Linux-Minimalkonfiguration bewährt:
/ 256MB
/boot 10MB
/usr 512MB
/tmp 256MB
/var 256MB
<swap> (mindestens Hauptspeichergröße)
Daneben machen mehrere Partitionen mit selbstständigen Dateisystemen das System sicherer. Durch Editieren der Datei/etc/fstab werden je nach Aufgabe der Partition die Rechte vergeben:
/dev/sda3 /usr ext2 defaults,ro,nodev 1 1
/dev/sda7 /tmp ext2 defaults,noexec,nosuid,nodev 1 2
/dev/sda8 /home ext2 defaults,noexec,nosuid,nodev 1 2
Damit sich nicht ohne Hindernisse neue oder manipulierte Programme in/usr ablegen lassen, wird mit dem Parameterro nur lesender Zugriff erlaubt und das Erzeugen von Gerätedateien mit nodevunterbunden. Das Schreiben auf die Partition /tmp darf nicht verhindert werden, weil viele Programme hier ihre temporären Daten zwischenlagern. Dafür verbieten wir dort das Ausführen von Programmen mitnoexec. Keinesfalls darf das Paket suidperlinstalliert sein, mit dessen Hilfe sich dieses Hindernis nehmen lässt. Für ein /home-Verzeichnis auf einem Server sind die gleichen Einstellungen wie für /tmpempfehlenswert.
Häufig wird für FTP- und DNS-Server eine weitere Partition eingerichtet, in der mit Hilfe deschroot-Mechanismus die Serversoftware abläuft. Die Partition wird zum Wurzelverzeichnis des Server-Prozess und auf alle übrigen Dateisysteme kann er nicht mehr zugreifen. Da er nun quasi eingesperrt ist, wird diese Technik auch als chroot jail bezeichnet.
Im Anschluss an die Basisinstallation werden notwendige Patches und Updates eingespielt. Die nötigen Dateien und Informationen lädt man über einen weiteren Rechner von den FTP-Servern der Distribution oder deren offiziellen Mirrors -und nur von dort. Am besten brennt man sie gleich auf eine CD, nachdem man die md5-Checksummen mit
md5sum <name-der-datei.rpm>
überprüft hat. Diese Checksumme erhält der eifrige Systemadministrator über die Update- und Security-Mailinglisten mitgeteilt, die er natürlich nicht nur abonniert hat, sondern auch regelmäßig liest. Diese Emails sind ihrerseits signiert, um die Authentizität sicherzustellen. Die absolute Gewissheit einer unmanipulierten Datei ergibt sich also erst, wenn auch diese Signatur überprüft wurde. Noch nicht installierte RPM-Pakete lassen sich außerdem mit
rpm -v --checksig --nogpg <name-der-datei.rpm>
testen. Wem dies nicht ausreicht, kann das in den SuSE-Announcements beschriebene Verfahren anwenden.
Ein besonderes Sicherheitsrisiko stellen Programmdateien mit gesetzem S-Bit dar. Sie sind mit
find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \;
leicht zu finden. Diesen Dateien des Minimalsystems wird das S-Bit entzogen:
-rwsr-xr-x 1 root shadow 34460 Jan 19 09:50 /usr/bin/chage
-rwsr-xr-x 1 root shadow 28184 Jan 19 09:50 /usr/bin/chfn
-rwsr-xr-x 1 root shadow 26000 Jan 19 09:50 /usr/bin/chsh
-rwsr-x--- 1 root trusted 37076 Jan 19 09:50 /usr/bin/gpasswd
-rwsr-xr-x 1 root root 21432 Jan 19 09:50 /usr/bin/newgrp
-rwsr-xr-x 1 root shadow 26780 Jan 19 09:50 /usr/bin/passwd
-rwsr-xr-x 1 root root 67236 Jan 25 15:20 /bin/mount
-rwsr-xr-x 1 root root 34568 Jan 25 15:20 /bin/umount
SUID und SGID |
---|
Programme mit gesetzem SUID-Bit (Set User Identification) werden immer mit den Rechten des Besitzers (Owner) ausgeführt. Ist dies der Superuser root, erhält der Anwender für die Dauer der Programmausführung dessen Rechte und kann auf Daten zugreifen und sie verändern. Angezeigt wird dies durch den Buchstaben "s" anstatt des "x" für eine ausführbare Datei in den Rechten: user@myhost $ ls -l /etc/shadow /etc/passwd /usr/bin/passwd Die Datei muss zusätzlich auch ausführbar sein. Obwohl die Datei /etc/shadow nur vom Superuser gelesen werden kann, schreibt das von jedem Benutzer ausführbare Programmpasswd das verschlüsselte Passwort in sie hinein. Dies ist nur möglich, weil der Benutzer kurzzeitig die Rechte des Superusers erhält. Das SGID-Bit entspricht in seiner Funktion weitgehend dem SUID-Bit. Anstatt auf der Anwender- wirkt es auf Gruppen-Ebene. Wird eine entsprechende Datei ausgeführt, gehen die Rechte der Benutzergruppe auf das Programm über. Ein gutes Beispiel ist der Befehl wall (Write all), der eine Nachricht auf alle angeschlossenen Terminals schreibt: user@myhost$ ls -l /usr/bin/wall Für die Dauer der Programmausführung erhält jeder Benutzer die Rechte der Gruppe tty. Die benötigt er, um in die zu dieser Gruppe gehörenden Terminal-Gerätedateien zu schreiben. Das kurze Umschalten in den Superuser-Modus ist natürlich eine Schwachstelle, die Angreifer nutzen könnten, um die vollständige Kontrolle über den Rechner zu erhalten. Sie übergeben dem Programm zum Beispiel einen überlangen Parameter. Wenn es die Programmierer versäumt haben, die Länge dieses Parameters vor dem Schreiben in den Hauptspeicher zu überprüfen, wird nun an dieser Stelle der Inhalt des Hauptspeichers überschrieben. Bei Intel-Prozessoren hat dies eine "Exception" zur Folge, mit deren Hilfe der Angreifer nun eine Superuser-Shell starten kann... |
In den Dateien /etc/passwd und /etc/groupfinden sich insbesondere bei der SuSE-Distribution zahlreiche Benutzeraccounts bzw. Gruppen, die für mitgelieferte Anwendersoftware benötigt werden. Sie verbleiben dort, auch wenn die Software nicht installiert oder gelöscht wurde. Hier nur einige Beispiele aus /etc/passwd:
informix:x:43:34:Informix Database Admin:/usr/lib/informix:/bin/bash
fixlohn:x:58:53:Linux Fincancial Suite fixlohn:/opt/fsuite/home/fixlohn:/bin/ksh
adabas:x:36:100:Adabas-D Database Admin:/usr/lib/adabas:/bin/bash
Wenn Sie sich sicher sind, können diese Accounts und Gruppen mit demuserdel- bzw. groupdel Kommando entfernt werden. Die Benutzergruppewheeldarf nicht gelöscht werden. Sie wird später noch benötigt, um die Anwendung des Befehls su zu verhindern.
Die Standardeinstellung für vom Anwender erzeugte Dateien ist die umask 022. In Folge hat seine Benutzergruppe und der Rest der Welt Leserechte auf alle neuen Dateien! Wünscht man eine globale Änderung dieses Problems, kann man in der Datei /etc/profile den Befehl umask auf den Wert 027 oder besser 077 ändern.
Je weniger Informationen der potenzielle Angreifer über das Netzwerk erhält, umso geringer sind seine Erfolgsaussichten. Die Dateien /etc/issue oder /etc/issue.netlöschen wir, da sie mitunter schon vor einem Login Informationen über das verwendete Betriebssystem und den Patchlevel geben.
Mit dem Programm su (substitute user) kann ein Benutzer mit Kenntnis des entsprechenden Passworts aus der Sicht des Systems seine Identität wechseln und Rechte als Superuser erhalten. Das kann verhindert werden: In der Datei /etc/pam.d/suwird diese Zeile auskommentiert:
#auth required /lib/security/pam_unix.so nullok #set_secrpc
und durch
auth required /lib/security/pam_wheel.so group=wheel
ersetzt. Ein Versuch, mit su - Superuser-Rechte zu bekommen, wird nach einigen Sekunden Wartezeit mit einer Fehlermeldung abgewiesen.
Es gibt Software für Linux, die aufgrund systembedingter Mängel oder ihrer Funktion nicht für sensible Bereiche geeignet ist. Mit ihrer Hilfe könnte ein Eindringling das Netzwerk leicht auskundschaften und weiter vordringen. Auf keinen Fall sollte in der SuSE-Distribution das Paket nkitbinstalliert sein, das die berüchtigten R-Befehle und Telnet enthält. Auch grafische Benutzeroberflächen oder FTP-Clients werden besser erst gar nicht installiert. Im grauen Kasten ist ein Vorschlag für eine Minimalkonfiguration abgedruckt. Einige Dateien müssen nun noch von Hand entfernt werden:
/usr/sbin/nscd
/usr/sbin/clnt.pcnfsd
/usr/sbin/rcpcnfsd
/usr/sbin/rpc.pcnfsd
/usr/sbin/rcrouted
/usr/sbin/rcxdm
Der Name Service Cache Daemon nscd ist überflüssig, da in Grenznetzen häufig der DNS-Server BIND8 als DNS-Proxy eingesetzt wird. Auch pcnfsd, rcroutedund rcxdm werden in einem Grenznetz nicht gebraucht.
Minimalkonfiguration für SuSE 7.1 | |
---|---|
aaa_dir-2001.1.17-0 | aaa_skel-2001.1.26-0 |
vpass-1.1-183 | autolog-0.35-192 |
base-2001.1.15-0 | bash-2.04-87 |
bc-1.06-10 | bdflush-1.5-294 |
bzip-1.0.1-5 | dump-0.4b20-4 |
compress-4.2.4-287 | cpio-2.4.2-295 |
cracklib-2.7-259 | cron-3.0.1-296 |
db-3.1.17-13 | devs-2001.1.2-3 |
diffutils-2.7-31 | e2fsprogs-1.19-7 |
file-3.32-35 | fileutils-4.0.35-3 |
findutils-4.1.6-14 | gawk-3.0.6-41 |
gdbm-1.8.0-225 | ash-0.2-294 |
glibc-2.2-7 | gppshare-2.95.2-149 |
scanlogd-2.2-5 | gzip-1.3-4 |
kbd-1.03a-39 | less-358-26 |
libz-1.1.3-284 | lilo-21.6-17 |
seccheck-1.6-4 | k_deflt_24-2.4.0-7 |
mktemp-1.5-150 | modutils-2.4.1-3 |
net-tools-1.57-6 | openssh-2.3.0p1-5 |
netcfg-2000.12.14-2 | secumod-1.6b-3 |
pam-0.72-169 | pam_devperm-2000.12.1-6 |
perl-5.6.0-39 | ps-2001.1.22-0 |
rpm-3.0.6-26 | sash-3.4-170 |
sh-utils-2.0-6 | shadow-20000902-34 |
syslogd-1.3.33-197 | sysvinit-2.78-143 |
terminfo-5.2-8 | tripwire-1.2-258 |
textutils-2.0.10-5 | timezone-2.2-7 |
util-linux-2.10q-7 | vim-5.7-42 |
yast-1.09-7 | ed-0.2-277 |
eject-2.0.2-185 |
Im Verzeichnis /etc/init.d finden sich die Shell-Skripte, die während des Bootvorgangs u.a. Netzwerkdienste starten. Die bereits genannten Programme sind zwar schon gelöscht, die dazugehörigen Skripte entfernen wir sicherheitshalber auch:
nfs
nscd
pcnfsd
routed (nicht zu verwechseln mit route!)
xdm
Alle übrigen Skripte haben merkwürdigerweise Leserechte für Jedermann, die wir mit
chmod 700 <init-skript>
korrigieren.
Der inetd ist für den Start von Netzwerk-Diensten verantwortlich, die er als Antwort auf eine Anfrage aus dem Netzwerk startet und dann wieder beendet. Diese Strategie führt auf frequentierten Servern natürlich zu Leistungseinbußen. Im nächsten Teil dieser Serie werden deshalb Alternativen zu inetd vorgestellt, die professionellen Ansprüchen hinsichtlich Leistung und Sicherheit genügen. Da er trotz dieser Nachteile häufig verwendet wird, beschränken wir uns vorläufig auf eine verbesserte Konfiguration, die für einen einzelnen, über eine Wählleitung mit dem Internet verbundenen PC oder kleinen Kommunikationsserver ausreicht. Sie findet sich in der Datei/etc/inetd.conf und hat häufig Leserechte für Jedermann, was wir sofort ändern:
chmod 600 /etc/inetd.conf
Dann kommentieren wir diese Dienste aus:
#time stream tcp nowait root internal
#time dgram udp wait root internal
#ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd
#telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
#shell stream tcp nowait root /usr/sbin/tcpd in.rshd -L
#login stream tcp nowait root /usr/sbin/tcpd in.rlogind
#talk dgram udp wait root /usr/sbin/tcpd in.talkd
#ntalk dgram udp wait root /usr/sbin/tcpd in.talkd
#finger stream tcp nowait nobody /usr/sbin/tcpd in.fingerd -w
#swat stream tcp nowait.400 root /usr/sbin/swat swat
Damit der inetd die neuen Einstellungen übernimmt, geben wir ihm abschließend das Signal zum Lesen seiner Konfigurationsdatei:
killall -HUP inetd
Sowohl SuSE 7.1 als auch Redhat 7.0 verwenden den von Wietse Venema entwickelten TCP-Wrapper tcpd. Anstatt einen Verbindungswunsch direkt an den Dienst zu übergeben, reichtinetd diesen zunächst an dentcpd weiter. Dieser prüft, ob die Verbindung von einem vertrauenswürdigen Rechner stammt. Trifft diese Bedingung zu, gibt der tcpd die Verbindung an den Netzwerkdienst weiter. Der TCP-Wrapper wird durch diese zwei Dateien kontrolliert. In/etc/hosts.deny wird mit der Zeile
ALL:ALL@ALL,PARANOID
jeder Zugriff auf den Rechner unterbunden, um dann das absolute Verbot in der Datei /etc/hosts.allow für bestimmte Hosts wieder zu lockern:
sshd:194.32.32.1 gw.pomme.fr
Einige Leser werden sicher angesichts dieses Themas gelangweilt die Augen verdrehen. Wie notwendig gute Passworte sind, wird durch die ständig steigende Zahl von Angriffen aus den eigenen Reihen eines Unternehmens deutlich. Nur etwa 20% aller Angriffe kommen tatsächlich aus dem Internet. In der Praxis werden aber selbst auf Servern als Superuser-Passwort der Name des Unternehmens oder andere leicht zu erratende Begriffe benutzt. Als Argument wird immer wieder genannt, dass sichere Passworte schwer zu merken seien. Eine "Eselsbrücke", die durchaus einen privaten Bezug haben kann, erleichtert die Erinnerung:
Luisa isst jedenMorgen 2! gekochteEier.
Als Passwort ergibt sich LijM2!gE. , das auch einer Überprüfung durch
echo 'LijM2!gE.' | vpass -nouser
standhält. Das Programm vpass aus der SuSE-Distribution testet das Passwort mit Hilfe dercracklib. Damit testet diese Distribution sinnvollerweise auch die Passworte der Benutzer. Cracklib enthält eine Reihe von Funktionen, die zu einfache Silbenkombinationen bemängelt und das Passwort gegen ein Lexikon bekannter Worte vergleicht. Idealerweise sollte es mindestens acht Zeichen haben und nach einem bestimmten Zeitraum ersetzt werden. Erzwingen lässt sich das durch das Editieren der Datei /etc/login.defs:
PASS_MIN_LEN 8
PASS_MAX_DAYS 30
Keinesfalls benutzen wir das Passwort auf anderen als den von uns administrierten Systemen oder gar für eines der Online-Multiuser-Ballerspiele.
Gelegentlich ist es sicher jedem schon einmal passiert: Nachdem die Konfigurationsarbeit als Superuser beendet ist, entfernt man sich vom Terminal ohne sich auszuloggen. Das kann Linux für uns nachholen. In der Datei .bashrc fügen wir diese Zeile hinzu:
TMOUT=300
Nach fünf Minuten der Inaktivität beendet sich die Bash-Shell selbst. Steht auch anderen Benutzern eine Shell zu Verfügung, kann diese Änderung in /etc/profilevorgenommen werden. Bei dieser Gelegenheit wird geprüft, ob die Restricted Shell /usr/bin/rbash für den gemeinen Anwender ausreicht. Sie verhindert u.a. das Verlassen des Benutzerverzeichnis.
In zweiten Teil der Serie sind Sicherheitsmaßnahmen auf Kernel- und Netzwerkebene das zentrale Thema. Es werden Kernelpatches und Daemons vorgestellt, die einige Sicherheitsschwächen beheben. Der Praxisteil zeigt anhand von beispielhaften Konfigurationen die vielen neuen Möglichkeiten auf.
Building Internet Firewalls, 2nd Edition, O'Reilly Verlag, Practical UNIX and Internet Security, 2nd Edition, O'Reilly Verlag
File System considerations in Linux: www.securityportal.com/lskb/10000000/kben10000036.html
Internet Firewalls FAQ: http://www.interhack.net/pubs/fwfaq/
Linux Security Administrators Guide: http://nic.com/~dave/Security/
Securing and Optimizing Linux: http://www.linuxdoc.org/guides.html
International Kernel Crypto Patch: http://www.kernel.org
PPDD: http://linux01.gwdg.de/~alatham/ppdd.html