linux:hardening

Hardening

  • Bastille: Paket zur menugeführten Absicherung des Systems. Benötigt perl-tk.

Daneben sollte man natürlich auch (täglich) Logs überwachen (z.B. mit logwatch) und die letzten Logins in

/var/log/lastlog

Mit Hilfe des Befehls lastlog lässt sich der Inhalt von /var/log/lastlog in ein angenehm lesbares Format umleiten.

  1. aktuelle Sicherheitspatches einspielen
    1. regelmäßig auf neue Patches überprüfen (automatisch oder Sicherheits-Mailinglisten abonnieren, :!: vor allem bei Webanwendungen die meist nicht reglmäßig aktualisiert werden)
    2. zeitnah einspielen (so schnell wie möglich)
  2. Physikalischen Zugriff verhindern: Seperater und abgeschlossener Raum, BIOS Passwort, Start von Diskette/CD abschalten, Bootmanager absichern und Festplattenverschlüsselung)
  3. Partitionierung: /var /home /tmp am besten auf eigene Partitionen (keine hardlinks möglich!!!)
  4. Dienste sollten nicht als root laufen! (oder höchstens als root starten und dann die Privilegien abgeben bzw. den eigentlichen Dienst unter einem eingeschränkten Benutzer laufen lassen)
    1. unnötige Dienste abschalten (Verringerung der Angriffsfläche): Auf offene Ports überprüfen
      netstat -lnptu
      1. Internetsuperserver
        1. veralteter inetd noch nötig?
        2. xinetd sicher konfigurieren
    2. (gefährdete) Dienste absichern:
      1. nur auf einer bestimmten IP lauschen, auf andere Ports wechseln
      2. evtl. Port-knocking einsetzen (Beispiel SSH)
      3. sicheren FTP-Server einsetzen: vsftp oder pure-ftpd
    3. unsichere Dienste nicht für kritische Aufgaben (Login) zulassen:
      1. FTP
      2. Telnet
      3. veraltete r-Dienste (rsh, rlogin, …)
  5. nur notwendige Benutzerkonten einrichten
    1. regelmäßig die Passwörter der Benutzer auf unsichere Passwörter überprüfen
    2. Login-Shells bei Benutzern von Diensten auf /usr/sbin/nologin setzen
    3. leere Passwörter nicht erlauben
  6. Kernel absichern
    1. eigenen (minimalen) Kernel bauen
    2. spezielle Sicherheitspatches (z. B. grsecurity)
  7. Sicherheitsmodelle einsetzen
  8. Firewall einrichten
    1. Nur benötigte Dienste/Ports durchlassen, den Rest verwerfen.
    2. IP-Spoofing durch entsprechende Regeln verhindern
  9. Integritätschecker, z.B. tripwire als cronjob laufen lassen. Die Signaturen sollten auf einem sicheren Drittsystem gelagert werden bzw. read-only gemountet sein (z. B. auf einer CD oder Diskette mit Schreibschutz)
  10. IDS einrichten (Snort, …)
  11. Die Benutzung von Shadow ist meist schon aktiviert (shadowconfig on)
  12. Protokolle (Logfiles) sichern:
    1. Loghost einrichten oder
    2. Logfiles absichern: Mit Secure Logging von Core-Wisdom können Sie Logfiles auch in mySQL-Datenbanken ablegen oder per Fingerabdruck gegen Veränderung sichern.
    3. msyslogd oder
    4. logrotate → Log per mail
  13. regelmäßig nach suid-Programme suchen:
    1. automatisch mit Programmen:
      1. sxid schickt eine tägliche Report über dazugekommene suid/sgid per mail zu
    2. manuell:
      1. root-suids:
        find / -perm -4000 2>/dev/null
      2. allgemein suids:
        find / -perm +6000
      3. sgid-programme:
        find / -perm -2000 2>/dev/null
      4. volle Ausgabe mit allen Rechten bekommt man mit:
        ls -lad --full-time `find / -perm +6000`
  14. Systemressourcen für Benutzer begrenzen
    1. quota setzen
    2. FIXME (andere)
  15. sinnvolle Dateirechte setzen
    1. /var/log/lastlog und /var/log/faillog nicht world-readable (sondern chmod 770)
    2. restriktive umask setzen (z.B. 077)
  16. Banner (Versionsnummern etc.) von Diensten abschalten
    1. in /etc/motd die Kernelversion nicht anzeigen lassen, stattdessen Warnungen für Angreifer
    2. SSH: Im Sourcecode
    3. Webserver:
  17. evtl. Zugriffe auf bestimmte Rechner beschränken
    1. in /etc/hosts.deny ALL: ALL eintragen und in /etc/hosts.allow einige Rechner (incl. localhost!) erlauben
  18. PAM anpassen
  19. Ereignisüberwachung
    1. Systemprotokolle regelmäßig lesen
    2. monitoring betreiben
  • cruft untersucht das komplette Dateisystem nach Dateien, die eigentlich nicht vorhanden sein sollten, beziehungsweise nach Dateien, die sich nicht mehr im Dateisystem finden lassen. Hierzu wird im Wesentlichen auf die Informationen vom Paketmanager (aus den Dateien im Verzeichnis /var/lib/dpkg/info/) zugegriffen. cruft überwacht aber auch darüber hinausgehende Informationen wie beispielsweise die „alternatives“-Informationen, die lost+found-Verzeichnisse in einem ext2/3-Dateisystem und die Heimatverzeichnisse der Benutzer.
  • sxid
  • chkrootkit

Beim Mounten (Einhängen in das Dateisystem) von ext2-Partitionen gibt es diverse Optionen, die dem Kommando mount übergeben werden oder die direkt in die Datei /etc/fstab eingetragen werden können. Ein solcher Eintrag könnte beispielsweise wie folgt aussehen:

/dev/hda7 /tmp ext2 defaults,nosuid,noexec,nodev 0 2

Die Optionen finden sich in der vierten Spalte. Die Option nosuid ignoriert gesetzte SUID- und GUID-Bits auf dieser Partition. Eine gesetzte Option noexec verhindert, dass auf dieser Partition befindliche Programme ausgeführt werden können, und nodev ignoriert Device-Dateien. Dabei ist zu beachten:

Dies bezieht sich nur auf ext2-Dateisysteme.

Auch solche Optionen können relativ leicht umgangen werden.

Hierzu ein Beispiel:

fr@sushi:/tmp# mount | grep tmp
/dev/hda3 on /tmp type ext2 (rw,noexec,nosuid,nodev)
fr@sushi:/tmp# ./date
bash: ./date: Keine Berechtigung
fr@sushi:/tmp# /lib/ld-linux.so.2 ./date
Sun Jul 29 14:40:32 CEST 2001

Viele Tools, die von Hackern benutzt werden, versuchen im Verzeichnis /tmp Dateien anzulegen und diese auszuführen. Mit der Option noexec kann man dem Angreifer zumindest das Leben etwas schwerer machen.

  • Da mittlerweile viele Distributionen tmpfs benutzen, muss der Eintrag in der /etc/fstab so aussehen:
tmpfs           /tmp            tmpfs   rw,noexec               0       0
  • tmpfs arbeitet wie eine Ramdisk indem es für die tempären Dateien zuerst den Arbeitsspeicher benutzt und erst wenn es eng wird auslagert.

Nachdem das System mit allen benötigten Programmen eingerichtet ist, kann mit einigen weiteren Aktionen die Sicherheit des Systems weiter erhöht werden.

Jede Person, die Zugang zur Tastatur des Systems hat, kann eine Administrator-Shell bekommen und beispielsweise alle Passwörter ändern, indem am Bootprompt dateiname- des-bootkernels init=/bin/sh eingegeben wird. Um dies zu verhindern, kann ein Passwort für den Boot-Loader gesetzt werden. Dies kann global für alle Boot-Images geschehen oder individuell für jedes einzelne.

Wenn Lilo als Bootloader verwendet wird, muss die Datei /etc/lilo.conf um die Einträge password und restricted erweitert werden:

image=/boot/2.2.14-vmlinuz

          label=Linux
          read-only
          password=hackme
          restricted

Danach muss lilo noch einmal aufgerufen werden. Sorgen Sie dafür, dass die Datei /etc/lilo.conf nur vom Administrator gelesen werden kann, da das Passwort unverschlüsselt in der Konfigurationsdatei steht; dies erreichen Sie mit dem Kommando chmod 600 /etc/lilo.conf. Die Option restricted bewirkt, dass nur nach einem Passwort gefragt wird, wenn der Benutzer versucht, zusätzliche Parameter am Bootprompt anzugeben. Die Auswahl verschiedener, bereits in der Konfiguration eingetragener Kernel ist weiterhin möglich. Wird der Eintrag restricted weggelassen, fragt Lilo in jedem Fall nach einem Passwort.

Die genannten Einträge können am Anfang der Konfigurationsdatei allgemein gültig für alle Kernel in der Konfiguration angegeben werden oder aber innerhalb eines Abschnitts der Konfigurationsdatei nur für bestimmte Kernel.

Wird auf dem System GRUB verwendet, so müssen folgende Zeilen der Datei /boot/grub/menu.lst hinzugefügt werden:

timeout 3

password hackme

Die Option timeout sorgt nach der angegebenen Zeit dafür, dass der Standardeintrag gebootet wird.

Die Einteilung des verfügbaren Festplattenplatzes hängt von der Verwendung des Systems ab. Hierzu sollten Sie einige Dinge beachten:

Jede Partition, auf die die Benutzer des Systems Schreibzugriff haben, sollte auf einer eigenen Partition liegen, beispielsweise in den Bereichen /home und /tmp. Dies verhindert, dass ein Benutzer das Root-Dateisystem (/) unbenutzbar macht und das gesamte System in einen instabilen Zustand bringt. Es bleibt natürlich ein gewisser Platz (meist fünf Prozent, dieser Wert kann bei ext2/3 mit tune2fs, Parameter -m [Zahl] Prozent oder Anz. reserv. Blöcke mit -r [zahl] angepasst werden) für den Administrator reserviert, doch kann so anderen Benutzern das Arbeiten mit dem System unmöglich gemacht werden.

Es sollte für jeden Bereich, der automatisch mit Daten gefüllt wird (beispielsweise /var und hier insbesondere das Verzeichnis /var/log), eine eigene Partition vorgesehen werden. Auf Debian-Systemen sollte /var großzügiger bemessen werden, da unter /var/cache/apt/archives Pakete temporär abgelegt werden, wenn die Installation über das Netz erfolgt. Weiterhin finden sich unter /var/lib/dpkg viele Dateien, die für das Paketmanagement benötigt werden.

Wenn Software installiert werden soll, die nicht in der Debian-Distribution enthalten ist, sollten auch diese Bereiche auf eigenen Partitionen liegen; diese werden dann bei einer Neuinstallation des Systems nicht überschrieben. Nach dem „File Hierarchy Standard“ (FHS) sind dies /opt oder /usr/local.

Um sicherzustellen, dass sich keine Pakete mit Sicherheitslücken auf dem System befinden, kann das Paket task-harden installiert werden. In diesem Paket sind verschiedene Task-Pakete aufgeführt, die wiederum mit entsprechenden Anhängigkeiten belegt sind. Die „harden-Pakete“ werden laufend aktualisiert und, sicherheitskritische Software wird durch entsprechende Abhängigkeiten, die in diesen Paketen festgelegt sind, von der Verwendung ausgeschlossen. Es kann also durchaus passieren, dass die Installation dieses Pakets dazu führt, dass ein benötigter Dienst gelöscht wird.

Das Debian-Team ist dabei der Meinung, dass es besser ist, einen Dienst eine Zeit lang nicht zur Verfügung zu stellen, statt einem Angreifer einen Angriffspunkt zu liefern.

Das Paket task-harden besitzt definierte Abhängigkeiten zu diversen anderen Paketen, die auch gesondert installiert werden können. Diese decken kleinere Bereiche ab, so dass es möglich ist, einzelne Dienste oder bestimmte Systeme gezielt zu schützen. Diese Pakete sind:

harden - Makes your system hardened.

harden-3rdflaws - Avoid packages with security problems.

harden-clients - Avoid clients that are known to be insecure.

harden-development - Development tools for creating more secure programs.

harden-doc - Useful documentation to secure a Debian system.

harden-environment - Hardened system environment.

harden-localflaws - Avoid packages with security holes.

harden-nids - Harden a system by using a network intrusion detection system.

harden-remoteaudit - Audit your system from this host.

harden-remoteflaws - Avoid packages with security holes.

harden-servers - Avoid servers that are known to be insecure.

harden-surveillance - Check services and/or servers automaticly.

harden-tools - Tools to enhance or analyze the security of the local system.

Hier sollten einige Einstellungen zum Benutzer-Login und zur grundsätzlichen Konfiguration vorgenommen werden.

FAIL_DELAY 10

Diese Variable sollte auf einen höheren Wert gesetzt werden, um „Brute-Force“-Angriffe auf einem Terminal zu erschweren. Wenn ein falsches Passwort eingegeben wird, muss der Benutzer 10 Sekunden warten, bis ein neuer Login-Versuch gestartet werden kann. Dies frisst einiges an Zeit, wenn versucht wird, ein Passwort zu erraten. Diese Einstellung gilt nur, wenn getty benutzt wird; bei mingetty beispielsweise ist diese Einstellung ohne Wirkung.

FAILLOG_ENAB yes

Mit dieser Variablen werden fehlgeschlagene Logins im Logfile verzeichnet. Dies ist wichtig, wenn „Brute-Force“-Angriffe aufgezeichnet werden sollen.

LOG_UNKFAIL_ENAB yes

Wenn die Variable FAILLOG_ENAB auf yes gesetzt wird, so sollte auch diese Variable auf yes gesetzt werden. Diese Einstellung schreibt auch unbekannte Benutzernamen bei einem Login-Versuch ins Logfile. Es ist darauf zu achten, dass die entsprechende Logdatei nicht von allen Benutzern gelesen werden kann, da Benutzer häufig anstelle des Benutzernamens das Passwort eingeben. Damit andere Benutzer die Logdatei nicht lesen können, sind die Zugriffsrechte beispielsweise auf 640 zu setzen.

SYSLOG_SU_ENAB yes

Diese Einstellung verzeichnet die Benutzung des Kommandos su im Syslog.

SYSLOG_SG_ENAB yes

Diese Einstellung erfüllt die gleiche Funktion wie die vorhergehende, jedoch für das Kommando sg (Ausführen eines Kommandos mit der ID einer anderen Benutzergruppe).

MD5_CRYPT_ENAB yes

Wie schon beschrieben, reduzieren MD5-verschlüsselte Passwörter die Gefahr des Erschleichens eines Passwortes durch entsprechende Software. Wenn auf dem System noch „slink“ (Debian 2.1) eingesetzt wird, sollten Sie vor dem Aktivieren dieser Option einen Blick in die Dokumentation werfen. Ansonsten wird diese Einstellung über PAM realisiert.

PASS_MAX_LEN 50

Wenn MD5-Passwörter in der PAM-Konfiguration aktiviert sind, so sollte diese Variable auf den gleichen Wert wie dort gesetzt werden.

Viele Funktionen des Kernels können während der Laufzeit verändert werden, beispielsweise indem mit dem Kommando echo ein Wert in die entsprechende Datei geschrieben wird, oder mit dem Kommando sysctl. Mit dem Kommando sysctl -A kann angezeigt werden, welche Einstellungen verändert werden können und welche Optionen verfügbar sind. In seltenen Fällen muss etwas verändert werden, aber auf diesem Weg kann die Sicherheit des Systems erhöht werden.

/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts = 0

Wird diese Variable auf den Wert 1 gesetzt, so verhält sich das System nach außen wie ein Windows-System, wenn ein Broadcast-ping-Kommando das System erreicht.

/proc/sys/net/ipv4/icmp_echo_ignore_all = 0

Wenn ICMP-Pakete auf der vorgeschalteten Firewall nicht geblockt werden sollen, so ist diese Variable auf den Wert 0 zu setzen.

/proc/sys/net/ipv4/tcp_syncookies = 1

Diese Option ist ein zweischneidiges Schwert: Einerseits schützt sie gegen „Syn-Flooding-Attacken“, andererseits entspricht dies nicht den RFCs. Diese Option beschäftigt die angreifende Seite ebenso mit „Syn-Floods“, so dass diese gleichermaßen beschäftigt ist. Diese Option kann auch in /etc/network/options verändert werden, indem die Option syncookies auf yes gesetzt wird.

/proc/sys/net/ipv4/conf/all/log_martians = 1

Mit dieser Option werden Pakete mit unerlaubten Adressen, beispielsweise wegen eines fehlerhaften Routings, im Netzwerk protokolliert.