Um Fedora Linux sicherer zu machen, habe ich hier eine Liste von Einstellungsmöglichkeiten zusammengestellt. Vorausgesetzt wird, dass der Leser mit Linux vertraut ist und das Arbeiten mit der Shell nicht scheut :-)

1. Bootvorgang

1.1 Bios

Im Bios sollte man die Bootreihenfolge so ändern, dass nur von Festplatte gestartet werden darf, auf der sich der Bootmanager befindet, z.B. grub oder lilo. Es sollte auch ein Setup-Kennwort gesetzt sein, damit sichergestellt ist, dass niemand die Bootreihenfolge verändern kann. (Schützt nicht vor physikalischen Angriffen!)

1.2 Grub mit Kennwort sichern

Durch das Setzen eines Kennwortes kann verhindert werden, dass Unbefugte dem Kernel Parameter übergeben können. Wenn man das Schlüsselwort lock innerhalb eines Abschnittes verwendet, kann dieser Menüpunkt nur mit Kennwort ausgeführt werden.

Mit grub-md5-crypt erzeugt man sich ein MD5 Hash von dem gewünschten Kennwort und trägt dieses dann in die /etc/grub.conf ein.

Beispiel einer /etc/grub.conf mit Kennwort:

default=0
timeout=3
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
password --md5 $1/

title Linux
    root (hd0,0)
    kernel /boot/vmlinuz ro root=/dev/sda1 vga=791

title Linux old
    lock
    root (hd0,0)
    kernel /boot/vmlinuz.old ro root=/dev/sda1

Der Menüpunkt “Linux” kann ohne Kennwort verwendet werden. Falls ein Parameter übergeben wird, oder falls “Linux old” aufgerufen wird, muss ein Kennwort angegeben werden. Weitere Informationen zu Grub finden Sie im Manual.

2. Netzwerk

2.1 Sichere Protokolle verwenden (oder von der richtigen Protokollwahl)

Deaktivieren Sie alle Dienste, die nicht gebraucht werden! Die Dienste die gebraucht werden, sollten nach Möglichkeit mit verschlüsselten Verbindungen arbeiten.

Beispiel:

Für telnet -> ssh Für ftp -> sftp Für http -> https Für pop3 -> pop3s Für imap -> imaps

2.2 tcp_wrappers

Die Dateien /etc/hosts.allow und /etc/hosts.deny bestimmen den Zugang der Dienste, die mit inetd ausgeführt werden (initd ist unter Fedora nicht mehr vorhanden, diese Einstellungen können aber auch von xinetd genutzt werden). Allen Rechnern, die in /etc/hosts.allow stehen wird Zugriff erlaubt, egal was in /etc/hosts.deny eingetragen ist. Wenn der Rechner in /etc/hosts.deny steht, dann wird der Zugriff verweigert. Wichtig: Wenn der Rechner nirgends aufgeführt ist, dann wird der Zugriff erlaubt!

Falls Sie nur vom lokalen Netz Zugriff auf Ihren Rechner erlauben, wäre folgendes einzutragen (im Beispiel wird das Subnetz 192.168.0. verwendet; ändern Sie dies gegebenenfalls ab, falls Sie ein anderes Subnetz verwenden):

# /etc/hosts.allow
ALL: LOCAL 192.168.0. 127.

# /etc/hosts.deny
ALL: ALL

2.3 xinetd

Mit xinetd werden Internet Dienste ausgeführt und deren Zugriffskontrolle geregelt. Folgende Einschränkungen können erfolgen:

  • nur von bestimmen Hosts
  • Bindung an eine bestimmte IP (Server)
  • Lastbegrenzung (Server)
  • Zeitbegrenzung
  • Protokollbegrenzung
  • nur bestimmte Benutzer

In /etc/xined.conf werden die Standardwerte festgelegt und im Verzeichnis /etc/xined.d/ wird für jeden Dienst eine Datei mit dessen Konfiguration angelegt.

Hier ein Beispiel für rsync:

# default: off
# description: The rsync server is a good addition to an ftp server, as it
# allows crc checksumming etc.
# Dies konfiguriert rsync mit den folgenden Einstellungen:
# - maximal 10 Verbindungen gleichzeitig
# - Begrenzung auf tcp
# - benutzen des Benutzer-cvs um diesen Dienst laufen zu lassen
# - Anbinden der Schnittstelle an nur 1 IP
# - Nur lokales Netz 192.168.0.0 kann diesen Dienst nutzen
# - Zulassen von Zugriff von 10.0.0.*
# - Begrenzung der Zeit von 9 Uhr bis 20 Uhr
# - max_load ist an der Maschine auf 1.0 gesetzt
service rsync {
  disable = yes
  socket_type     = stream
  wait            = no
  user            = root
  max_load  = 1.0
  protocol      = tcp
  instances   = 10
  protocol      = tcp
  bind             = 192.168.0.1
  only_from   = 192.168.0.0
  access_times   = 9:00-20:00
  server          = /usr/bin/rsync
  server_args     = --daemon
  log_on_failure  += USERID
}

Da xinetd mit root ausgeführt wird, sollten Sie die Dienste so weit es geht besser auf Init-Scripte verlegen. Die mit Fedora kommenden Programme nutzen bis auf wenige Ausnahmen alle schon Init-Scripte.

2.4 sysctl

Sysctl-Optionen sind Kernelparameter, die über das /proc Dateisystem konfiguriert werden können. Wenn Sie die Optionen die /etc/sysctl.conf schreiben, werden diese automatisch bei jedem Systemneustart wieder gesetzt (wenn Sie die Optionen direkt im /proc Dateisystem ändern, werden diese nach dem Neustart zurückgesetzt sein). Die Sysctl-Optionen, die zur Verfügung stehen, hängen stark von der Kernelkonfiguration ab. Hier wurde Vanilla Kernel 2.4.23 mit grsecurity Patch verwendet.

# Enables packet forwarding
net.ipv4.ip_forward=0

# Disables the magic-sysrq key
kernel.sysrq = 0

# Anti-spoofing
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1

# Quell-Routing deaktivieren
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0

# TCP SYN Cookies Schutz aktivieren
net.ipv4.tcp_syncookies = 1

# ICMP Umleitungen deaktivieren
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_redirects = 0

# Martians Erkennung wird protokolliert
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.all.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1

# PID zum Core Dateinamen hinzufügen
# (nur hilfreich für das Debuging von Multi-threaded Anwendungen)
kernel.core_uses_pid = 0

# grsecure settings
kernel.grsecurity.dmesg = 1
kernel.grsecurity.audit_mount = 1
kernel.grsecurity.execve_limiting = 1
kernel.grsecurity.fifo_restrictions = 1
kernel.grsecurity.forkfail_logging = 1
kernel.grsecurity.linking_restrictions = 1
kernel.grsecurity.signal_logging = 1
kernel.grsecurity.timechange_logging = 1
kernel.grsecurity.rand_ip_ids  = 1
kernel.grsecurity.rand_isns = 1
kernel.grsecurity.rand_pids = 1
kernel.grsecurity.rand_rpc = 1
kernel.grsecurity.rand_tcp_src_ports = 1
kernel.grsecurity.grsec_lock = 1

Die letzte Zeile bei den Grsecurity Optionen bewirkt, dass die Einstellungen (Grsecurity) nicht mehr veränderbar sind. Erst wenn grsec_lock=0 gesetzt wird und dann ein Rechner-Neustart gemacht wird, können die Grsecurity Optionen wieder verändert werden. Für die Testphase empfiehlt es sich grsec_lock=0 zu setzen.

Um die Einstellungen der /etc/sysctl.conf zu aktivieren, muss der Netzwerkdienst neu gestartet werden:

/etc/init.d/network restart

3. Firewall

Ich empfehle den Einsatz von Shorewall, weil sie eine benutzerfreundliche und übersichtliche Schnittstelle zu iptables darstellt und trotzdem die volle Funktionalität von iptables bereitstellt.

Laden Sie das Programm über https://sourceforge.net/projects/shorewall/files/ herunter und speichern Sie die Datei in /tmp.

Nun zur Installation:

rpm -Uvh /tmp/shorewall-VERSION.rpm

Nach der Installation muss die Konfiguration durchführt werden. Die Dateien, die Sie dazu anpassen müssen, finden Sie in /etc/shorewall. Eine ausführliche Einführung finden Sie auf sourceforge.net.

Nachdem Sie die Konfiguration abgeschlosssen haben, müssen Sie noch die Datei /etc/shorewall/startup_disabled löschen.

Nun sollten Sie mit shorewall check die Konfiguration auf Syntaxfehler überprüfen (check wird offiziell nicht von shorewall unterstützt). Wenn kein Fehler gefunden wurde, können Sie nun mit shorewall start die Firewall aktivieren.

Wenn Sie Shorewall installieren, sollten Sie darauf achten, dass die Firewall, die mit Fedora kommt, deaktiviert ist, um mögliche Konflikte auszuschliessen. Gehen Sie hierbei wie folgt vor:

rpm -e redhat-config-securitylevel redhat-config-securitylevel-tui
chkconfig iptables off

4. Partitionen / Dateisysteme

4.1 Mounter der Partitionen

Durch folgende Optionen können Sie das Einbinden der Partionen in der /etc/fstab beeinflussen:

  • ro - Read only / kein Schreiben auf der Partition möglich
  • noexec - Verhindert das Ausführen von Dateien von dieser Partition
  • nosuid - Ignoriert das SUID bit und behandelt es einfach wie eine normale Datei
  • nodev - Ignoriert Geräte

Wenden Sie diese Opionen an, wo Sie nur können. Ein Beispiel /etc/fstab:

/dev/sda1 / ext3 rw,suid,dev,exec,auto,async,nouser 1 1
/dev/sda3 /tmp ext3 rw,auto,async,nouser,nodev,nosuid,noexec 0 0
/dev/sda5 /var ext3 rw,suid,exec,auto,async,nouser,nodev 0 0
/dev/sda6 /home ext3 rw,exec,auto,async,nouser,nodev,nosuid 0 0
/dev/sda7 /usr ext3 rw,suid,exec,auto,async,nouser,noatime,nodev,ro 0 0

proc /proc proc defaults 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/sda2 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro 0 0

Diese Einstellungen kann man leicht umgehen (ausgenommen ro), indem man einen nicht-direkten Pfad ausführt. Wenn /tmp auf noexec gesetzt wird, stoppt man damit etwa 99% aller Script-Kiddies, da deren Exploits so gestaltet sind, daß sie direkt von /tmp ausgeführt werden (allerdings kann das zu Problemen bei der Ausführung einiger Scripte führen).

Anmerkung: In dem Beispiel oben wird die /usr Partition im Lese-Modus eingebunden. Wenn Sie neue Software installieren, müssen Sie diese im Schreib-Modus einbinden (und danach natürlich wieder auf Lese-Modus umstellen). Ändern Sie dafür die Einstellung in der /etc/fstab und führen Sie danach ein mount -oremount /usr aus.

4.2 Festplattenverschlüsselung

Festplattenverschlüsselung mit loop-AES. Über den Einsatz von verschlüsselten Partition sollte nachgedacht werden.

4.3 quota

Um Quota nutzen zu können, muss der im Kernel Quota support aktiviert sein und das Dateisystem Quota unterstützen (wie z.B. ext2 oder ext3).

Für alle Partitionen, die Sie mit Quota nutzen wollen, müssen Sie den Eintrag in der /etc/fstab anpassen:

/dev/sdc1 /tmp ext3 notail,noatime,nodev,nosuid,noexec,usrquota,grpquota 0 0
/dev/sdd1 /home ext3 notail,noatime,nodev,usrquota,grpquota 0 0

usrquota wird eingetragen, wenn benutzerbezogenes Quota verwendet werden soll, grpquota für gruppenbezogenes Quota.

Erstellen Sie nun auf allen Partitionen, die Quota unterstützen sollen und in der /etc/fstab mit den erforderlichen Einstellungen stehen, die Quota-Dateien quota.user und quota.group (im Wurzelverzeichnis der jeweiligen Partition):

touch /home/quota.user
touch /home/quota.group
chmod 600 /home/quota.user
chmod 600 /home/quota.group

Um die Änderungen zu aktivieren, sollten Sie den Rechner neu starten, oder die jeweiligen Partitionen neu mounten. Danach können Sie die Quotas für die Benutzer und Gruppen festlegen.

# Quotas für Benutzer "alex" bearbeiten
edquota -u alex
# Quotas für die Gruppe "users" bearbeiten
edquota -g users

4.4 Immunisieren von Dateien

Schützen Sie wichtige Dateien durch Immunisierung. Diese Dateien können dann nicht mehr bearbeitet oder gelöscht werden.

chattr +i /etc/grub.conf
chattr +i /etc/services

Falls Sie eine immunisierte Datei später wieder ändern müssen, wenden Sie auf die jeweilige Datei chattr -i an.

5. Kernel

5.1 grsecurity patch

Der Grsecurity-Patch erweitert den Kernel um viele sicherheitsbezogene Optionen (z.B. ACLs, Abschalten von Fähigkeiten, Zufälligkeiten im Netzwerk, um es zu erschweren das Betriebssystem zu erraten). Hier die komplette Liste der Features. Um den Patch nutzen zu können, müssen Sie sich für den Vanilla Kernel entscheiden, da der Patch nicht mit dem Kernel funktioniert, der mit Fedora kommt.

Nachdem Sie den Patch eingespielt haben, sollten Sie folgende Punkte unter dem Hauptmenüpunkt Grsecurity setzen (wählen Sie customized):

  Address Space Protection --->
  - Address Space Layout Randomization
  - Randomize kernel stack base
  - Randomize mmap() base
  Filesystem Protections --->
  - Linking restrictions
  - FIFO restrictions
  - Chroot jail restrictions (mit allen Unterpunkten)
  Kernel Auditing --->
  - Log execs within chroot
  - (Un)Mount logging
  - Signal logging
  - Fork failure logging
  - Time change logging
  Executable Protections --->
  - Enforce RLIMIT_NPROC on execs
  - Dmesg(8) restriction
  - Randomized PIDs
  Network Protections --->
  - Larger entropy pools
  - Truly random TCP ISN selection
  - Randomized IP IDs
  - Randomized TCP source ports
  - Randomized RPC XIDs
  Sysctl support --->
  - Sysctl support

Da “Sysctl support” aktiviert wurde, können Sie die meisten Optionen über die /etc/sysctl.conf steuern (siehe oben). Wichtig: wenn Sie keine Sysctl Optionen setzen, sind die meisten Grsecurity Features nicht aktiv!

5.2 Kernelkonfiguration

Der Vorteil eines selbst kompilierten Kernels ist, dass er speziell für das aktuelle System angepasst ist. Es sollten also all die Optionen aktiviert werden, die man mit diesem System braucht, auf dem der Kernel laufen soll - aber nicht mehr! Durch diese Beschränkung wird der Kernel wesentlich schlanker als der Kernel, der mit Fedora kommt. Wenn man der Gefahr aus dem Weg gehen will, dass das System durch modifizierte Kernelmodule angreibar ist, sollte man sich für einen monolitischen Kernel entscheiden (eine Verwendung von Modulen ist mit diesem Kernel nicht möglich). Es empfiehlt sich dann aber, sich auf das allernötigste zu beschränken, da der Kernel sehr gross werden kann.

6. Dienste absichern

6.1 NFS (Port 111, 2049)

NFS gilt als ein sehr unsicherer Dienst. Die Authenifizierung findet ausschließlich über IPs bzw. Hostnamen statt. Wenn Sie NFS einsetzen wollen/müssen, sollten Sie sicherstellen, dass Sie den Zugriff des Portes auf das lokale Netzwerk einschränken (mit einer Firewall oder iptables).

Noch einige Tipps zur Anwendung:

  • Exportieren Sie NIE Ihr Root-Dateisystem
  • Wenn möglich, exportieren Sie das Verzeichnis nicht mit Schreibrechten
  • Verzeichnisse, die Sie freigeben, wenn möglich auf eigene Partition, die Sie mit den Optionen nosuid, nodev, oder/und noexec versehen können
  • Exportieren Sie kein Verzeichnis mit freigegebenen Root-Rechten

6.2 Samba (Port 137, 138, 139, 445)

Samba sollte nicht über das Internet benutzt werden. Schränken Sie den Zugriff des Portes auf das lokale Netzwerk ein (mit einer Firewall oder iptables). In der Konfigurationsdatei /etc/samba/smb.conf sollten folgende Einstellungen gemacht werden:

[global]
# An ein Interface binden
interfaces = eth0 192.168.0.1/32

# Sicherstellen, dass die Passwörter verschlüsselt werden
# (verschlüsselte Kennwörter schliessen leider die Benutzung von PAM aus)
encrypt passwords = yes

directory security mask = 0700

# Kommunikation von 192.18.0.* erlauben
hosts allow = 192.168.0.

# Benutzerauthentifizierung aktivieren
# (Also nicht den "Share-Mode" benutzen)
security = user

# Priviligierte Accounts verbieten
invalid users = root

# Richtlinie für Passwörter
min password length = 8
null passwords = no

6.3 FTP (Port 20, 21)

Wenn möglich, sollten Sie auf das FTP Protokoll verzichten, da es die Daten unverschlüsselt versendet und empfängt (weichen Sie auf ssh aus). Anonyme Logins werden auch gerne von Angreifern gesucht, um Warez zu verbreiten.

Ich empfehle pure-ftpd einzusetzen, da es sehr viele sinnvolle Erweiterungen bezüglich Sicherheit aufweisen kann. Benutzen Sie mit pure-ftpd virtuelle Benutzer (niemals Systemkonten) indem Sie die AUTH-Option aktivieren. Fügen Sie hierzu folgende Zeile in die /etc/pure-ftpd.conf:

PureDB /etc/pureftpd.pdb

Um Benutzer anzulegen verwenden Sie das Programm /usr/bin/pure-pw.

6.4 HTTP (Port 80, 443)

Apache kommt hier zum Einsatz. Auch hier gibt es einige sicherheitsbezogene Einstellungen, die Sie in die /etc/httpd/conf/httpd.conf eintragen sollten:

# Lassen Sie ihn auf die richtige IP hören
Listen 127.0.0.1
BindAddress 127.0.0.1

# Dateien mit der Endung "inc" dürfen nicht geöffnet werden (vor allem beim Einsatz von PHP wichtig)
<Files ~ "\.inc$">
  Order allow,deny
  Deny from all
</Files>

# Version verstecken
ServerTokens Prod

RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]

Falls sensible Daten über den Webserver geschickt werden (z.B. bei einem Shop-System), empfiehlt es sich das HTTPS Protokoll zu verwenden. Installieren Sie hierzu das Paket mod_ssl und führen Sie die Konfiguration in /etc/httpd/conf.d/ssl.conf durch.

Durch den Einsatz von mod_security können Cross-Site-Scripting Attacken und SQL Injections verhindert werden. Laden Sie dazu dier tar.gz Datei des Herstellers herunter und extrahieren Sie die Datei in ein Verzeichnis Ihrer Wahl. Wechseln Sie dann in das Verzeichnis, in der sich die mod_security.c für Ihren Webserver befindet (unterstützt werden Apache 1.3.x und 2.0.x). Mit folgendem Befehlt kompilieren und installieren Sie das Modul (Voraussetzung hierfuer ist, dass Sie httpd-devel RPM Paket installiert haben): e kommt hier zum Einsatz. Auch hier gibt es einige sicherheitsbezogene Einstellungen, die Sie in die /etc/httpd/conf/httpd.conf eintragen sollten:

apxs -cia mod_security.c

Nachdem das Modul erfolgreich installiert wurde, koennen Sie die Konfiguration vornehmen. Es bietet sich an, eine eigene Datei dafür zu verwenden. Ich empfehle dafür /etc/httpd/conf.d/security.conf zu verwenden. Ein Beispiel dieser Konfiguration finden sie hier:

  # /etc/httpd/conf.d/security.conf
  # Konfigurationsdatei für mod_security

  # Turn the filtering engine On or Off
  SecFilterEngine On

  # Make sure that URL encoding is valid
  SecFilterCheckURLEncoding On

  # Only allow bytes from this range
  # SecFilterForceByteRange 32 126

  # The audit engine works independently and
  # can be turned On of Off on the per-server or
  # on the per-directory basis. "On" will log everything,
  # "DynamicOrRelevant" will log dynamic requests or violations,
  # and "RelevantOnly" will only log policy violations
  SecAuditEngine RelevantOnly

  # The name of the audit log file
  SecAuditLog logs/audit_log

  SecFilterDebugLog logs/modsec_debug_log
  SecFilterDebugLevel 0

  # Should mod_security inspect POST payloads
  SecFilterScanPOST On

  # Action to take by default
  SecFilterDefaultAction "deny,log,status:500"

  # Prevent OS specific keywords
  SecFilter /etc/passwd

  # Prevent path traversal (..) attacks
  SecFilter "\.\./"

  # Weaker XSS protection but allows common HTML tags
  SecFilter "<[[:space:]]*script"

  # Prevent XSS attacks (HTML/Javascript injection)
  #SecFilter "<(.|\n)+>"

  # prevent SQL injection attacks
  #SecFilter "'"
  #SecFilter "\""

6.5 DNS (Port 53)

Bind ist bekannt für seine schlechte Programmierung und seine vielen Sicherheitslöcher in der Vergangenheit. Verwenden Sie also dieses Programm wohlüberlegt. Um es abzusichern, setzen Sie folgende Einstellungen in /etc/named.conf Abschnitt Options ein:

  # Setzen Sie hier Ihre IP ein
  listen-on port 53 { 127.0.0.1; 192.68.0.1; };
  listen-on-v6 { none; };
  version "My version is so secret that I even don't know what I'm running on";

Überprüfen Sie Ihre Konfiguration mit named-checkconf /etc/named.conf.

6.6 SSH (Port 22)

Auch ssh bedarf einiger Nachbesserungen. Für ssh fügen Sie folgende Zeilen in /etc/ssh/sshd_config ein:

  # Nur Protokoll 2 zulassen
  Protocol 2
  # Anmeldung von root nicht zulassen
  PermitRootLogin no
  # Authentifizierung mit Kennwort verbieten
  PasswordAuthentication no

Wenn Sie diese Einstellungen machen, wird nur noch SSH Protokol 2 zugelassen und der Benutzer root kann sich über ssh nicht mehr anmelden. Anstelle dessen sollte man sich mit einen normalen Benutzeraccount anmelden und mit dem Befehl “su” zu root wechseln. Die obige Einstellung erlaubt auch keine Kennwortauthentifikation. Dass bedeutet, dass man sich nicht mehr mit einen Kennwort anmelden kann, sondern einen Key verwenden muss. Stellen Sie sicher, dass die Authentifikation mit Ihrem Key funktioniert, bevor Sie die Einstellungen aktivieren!

Anschliessend ein /etc/init.d/ssh restart nicht vergessen!

7. Sonstiges

7.1 su einschränken

Mit den Standardeinstellungen darf jeder Benutzer su ausführen. Wenn Sie die folgende Zeile in /etc/pam.d/su einfügen, dürfen diesen Befehl nur die Benutzer verwenden, die der Gruppe wheel angehören:

auth required /lib/security//pam_wheel.so use_uid

Anmerkung: Die Zeile ist auskommentiert schon vorhanden.

7.2 Kennwörter (sichere Kennwörter auswählen, Lebensdauer)

Schlecht gewählte Kennwörter sind meistens die größte Schwachstelle in einem System. Um starke Kennwörter zu nutzen, sollten bestimmte Voraussetzungen erfüllt sein:

  • Es sollte mindestens 8 Zeichen lang sein
  • Es sollte aus Buchstaben und Zahlen bestehen
  • Es sollte Groß- und Kleinbuchstaben beinhalten
  • Es sollte mindestens 1 Sonderzeichen enthalten
  • Es darf nicht in Wörterbüchern vorkommen (möglichst auch keine Teile daraus)
  • Es sollte nicht länger als 90 Tage im Einsatz sein (ca. 3 Monate)
  • Für jeden Dienst sollte ein anderes Kennwort verwendet werden
  • Ein in der Vergangenheit verwendetes Kennwort nicht nochmal verwenden

Es gibt ein Projekt, Automated Password Generator, welches bei der Erstellung starker Kennwörter behilflich ist.

Erhöhen Sie die Standardlänge eines Kennwortes in /etc/login.defs von 5 auf 8. Somit gewährleisten Sie auch Benutzern, die nicht so sicherheitsbewusst denken, einen besseren Schutz:

PASS_MIN_LEN 8

7.3 Inakive Benutzerkonten und Gruppen entfernen

Entfernen Sie alle Benutzerkonten und Gruppen, die nicht mehr verwendet werden. Damit bleiben die Einträge (Benutzer, Gruppen) überschaubar und verringert den Missbrauch eines Accounts: um so weniger Accounts, um so weniger Angriffspunkte existieren auf dieser Ebene (Sie sollten sich bewusst sein, dass die meisten Einbrüche aus dem internen Netz erfolgen). Nach der Installation enthält Fedora schon einige Benutzer, die Sie auch entfernen sollten, wenn Sie nicht einen Dienst verwenden, der diese Benutzer voraussetzt.

# Gopher wird nicht benutzt
userdel gopher
# Es ist kein Newsserver auf dem Rechner installiert
userdel news

7.4 Benutzerrechte einschränken

Die Kontrolle von Ressourcenbegrenzungen kann sehr effektiv sein, wenn es darum geht eine lokale DoS Attacke zu verhindern oder die maximal erlaubten Logins für eine Gruppe oder einen Benutzer zu handhaben.

Das geschieht in der /etc/security/limits.conf

# keine Core-Dateien erzeugen
*    soft core      0
*    hard core      0

*   -   maxlogins   10

# Reservierten Speicher für Gruppe users einschränken
@users hard rss       10000

# Prozesse für Gruppe users einschränken
@users soft nproc 20
@users hard nproc 35

Wenn Sie die Speicher und Prozesseinschränkung auf alle Benutzer erweitern, kann es zu Problemen mit Datenbanken oder Webservern kommen. Wenn die Einstellungen auf einen System vorgenommen werden, auf dem X-Windows läuft, sollten rss und nproc gegenenfalls höher angesetzt werden.

7.5 Automatisches abmelden einer Verbindung in der bash-shell

Setzen Sie hierzu die gewünschte Zeit (in Sekunden) in der /etc/profiles für eine systemweite Festlegung. Wenn Sie einen benutzerspezifischen Wert setzen wollen, verwenden Sie die .bashrc im jeweiligen Homeverzeichnis.

# Für 2 Stunden (60602) export TMOUT=7200

7.6 Sinnvolle Programmauswahl und Aktualität der Software

Generell gilt: Alle Pakete, die nicht benötigt werden, vom System entfernen. Dadurch verringern sich die Softwarefehler oder Schwachstellen, die möglicherweise darin enthalten sein könnten und das System wird auch überschaubarer. Software von unbekannter Herkunft sollte nicht installiert werden.

Um das System leichter zu aktualisieren, sollten Sie, wenn möglich immer RPM-Pakete bevorzugen. Die Aktualität ist ein wichtiger Punkt hinsichtlich der Sicherheit eines Systems. Wenn möglich sollten immer stable Versionen eingesetzt werden (keine Betas oder gar Alphas!).

Um nun nicht täglich alle Programme manuell überprüfen zu müssen, ob vielleicht ein Update verfügbar ist, empfiehlt es sich apt für RPM-Pakete einzusetzen. apt erstellt einen Katalog von all Ihren RPM-Paketen und vergleicht diesen mit sogenannten Repositories. Wenn ein neues Paket vorhanden ist, wird dieses automatisch aktualisiert. Es gibt viele dieser Repositories, eine gute Auswahl wird von ATrpms mitgeliefert. Um apt zu installieren, laden Sie von ATrpms folgende Pakete herunter und speichern Sie diese in /tmp:

  • atrpms
  • apt
  • libapt

Ok, nun die Installation:

rpm -e yum # wird nicht mehr benötigt
rpm -Uvh /tmp/atrpms-VERSION.rpm
rpm --rebuilddb
rpm -Uvh libapt-VERSION.rpm apt-VERSION.rpm

Ersetzen Sie VERSION mit der von Ihnen heruntergeladenen Version. Wenn Sie nun zukünftig Ihr System aktualisieren wollen, brauchen Sie nur folgenden Befehl einzugeben:

apt-get update && apt-get upgrade

Falls neue Pakete zur Verfügung stehen, werden diese unter Berücksichtigung der Paketabhängigkeiten automatisch aktualisiert.

7.7 root E-Mails mit Alias belegen

Da Sie auf keinen Fall als root die System E-Mails lesen sollten, empfiehlt es sich ein Alias auf root in /etc/mail/aliases zu setzen, indem Sie folgende Zeile hinzufügen (ersetzen Sie “alex” mit demjenigen Login-Namen, der die E-Mails erhalten soll):

root: alex

7.8 Security through obscurity

Eine weitere Möglichkeit mehr Sicherheit zu erlangen ist, dass man falsche Version oder Programmnamen vortäuscht oder diese versucht zu verstecken. Ob das aber wirklich mehr Sicherheit bringt, ist Ansichtssache. Was sich bewährt hat, ist die Änderung von Standardports auf eine andere Portnummer (wie z.B. Port 22 (ssh) auf Port 34 (falls dieser frei ist). Dadurch erreicht man, dass die Tools der Script-Kiddies meistens nicht mehr greifen.

7.9 Know your System

Um wirklich ein sicheres System zu erstellen, muss man sein System sehr gut kennen. Viele neuere Linux Distributionen liefern zwar schon ein gutes Grundgerüst, aber die indivduelle Anpassung muss man immer noch selbst durchführen.

Man sollte sich im klaren sein, dass Sicherheit kein Zustand, sondern ein fortlaufender Vorgang ist.

8. Protokollierung und Auswertungen

8.1 Datei- und Verzeichnisdiagnose

Dateien oder Verzeichnisse, die keinem Benutzer oder keiner Gruppe zugeordnet sind, können auf einen Eindringling deuten. Mit folgendem Befehl erhalten Sie eine Liste all dieser Dateien auf Ihrem System:

find / -nouser -o -nogroup >unowned.txt

Da .rhosts Dateien nicht auf Ihrem Rechner zum Einsatz kommen sollten, sollten auch keine dieser Dateien zu finden sein:

find /home -name .rhosts >rhosts.txt

Welt/Gruppen-Schreibbare Dateien und Verzeichnisse stellen eine Sicherheitslücke dar, die sich ein Angreifer zu Nutze machen kann (durch Veränderung oder löschen).

# Findet Dateien
find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \; 2>/dev/null >writable.txt

Findet Verzeichnisse

find / -type d \( -perm -2 -o -perm -20 \) \ -exec ls -ldg {} \; 2>/dev/null >>writable.txt

Überprüfen Sie die Berechtigungen und berichtigen Sie Zugriffsrechte.

SUID/SGID Dateien (Dateien bei denen das superuser bit gesetzt wurde) bieten normalen Benutzern die Möglichkeit Dinge zu tun, die eigentlich root vorbehalten sind. Diese Dateien stellen ein großes Risiko dar, denn wenn in diesen Dateien ein Sicherheitsloch vorhanden ist, erlangt darüber der Benutzer root-Berechtigung. Diese Dateien sind gefährlich und sollten unter allen Umständen vermieden werden. Erstellen Sie so eine Liste der SUID/SGID Dateien:

find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \; 2>/dev/null >suidfiles.txt

Wenn sie Programme aufgelistet bekommen, die Sie nicht benötigen, deinstallieren Sie diese.

Viele dieser Befehle sollten nicht von normalen Benutzern verwendet werden, sondern nur von root. Folgende Befehlsreihe schaltet das suid für einige Programme ab:

chmod a-s /bin/traceroute
chmod a-s /bin/traceroute6
chmod a-s /bin/ping6
chmod a-s /sbin/netreport

Um eine komfortablere Überprüfung durchzuführen, installieren Sie sxid. sxid schickt Ihnen eine Mail der vorhandenen suid Dateien zu, die sich verändert haben.

Aide ist ein Host basierendes Eindringlingserkennungssystem, welches von allen Datein einen Stempel erstellt und diese Stempel täglich mit den Dateien vergleicht, ob diese sich verändert haben. Erstellen Sie die Konfigurationdatei /etc/aida.conf:

  @@define TOPDIR /

  # Der Ort der Datenbank die gelesen werden soll.
  database=file:/var/lib/aide/aide.db

  # Der Ort der Datenbank, die erstellt werden soll.
  database_out=file;/var/lib/aide/aide.db.new

  verbose=20
  report_url=stdout

  # Regeldefinition
  All=R+a+sha1+rmd160

  Norm=s+n+b+md5+sha1+rmd160

  @@{TOPDIR} Norm
  !@@{TOPDIR}var/lib/aide
  !@@{TOPDIR}etc/aide.conf
  !@@{TOPDIR}usr/src
  !@@{TOPDIR}daten
  !@@{TOPDIR}dev
  !@@{TOPDIR}proc
  !@@{TOPDIR}root
  !@@{TOPDIR}tmp
  !@@{TOPDIR}var/log
  !@@{TOPDIR}var/run
  !@@{TOPDIR}var/lib/rpm
  !@@{TOPDIR}etc/samba/secrets.tdb
  =@@{TOPDIR}home Norm

Passen Sie die Konfigurationsdatei Ihren Gegebenheiten an. Ausführliche Dokumentation finden Sie auf der Herstellerseite. Nach der Konfiguration sollten Sie Ihre Datenbankdatei erstellen, indem Sie aide -i ausführen und dann die Datei /var/lib/aide/aide.db.new nach /var/lib/aide/aide.db kopieren. Um aide wöchentlich automatisch auszuführen, rufen Sie crontab -e auf und fügen folgende Zeile ein:

0 1 * * mon /usr/bin/aide -u

Beachten Sie, dass ich die -u (Update) Option benutze statt -C (überprüfen). Denn -u überprüft auch die Dateien und überschreibt nicht die Originaldatenbankdatei. So müssen Sie nur eine Datei kopieren, wenn Veränderungen festgestellt werden. Durch den crontab-Eintrag erhalten Sie dann wöchentlich eine E-Mail mit den gefundenen Änderungen. Überprüfen sie diese einfach um zu sehen, ob Sie es selbst waren oder ein Angreifer die Veränderungen gemacht hat, bevor sie diese kopieren!

8.2 chkrootkit

chkrootkit überprüft den Rechner auf eventuell vorhandene Rootkits. Es werden über 50 verschiedene Rootkits erkannt. Um eine automatische, wöchentliche Überprüfung durchzuführen, geben Sie crontab -e als root ein und fügen Sie folgende Zeile hinzu:

  0 20 * * mon /usr/bin/chkrootkit

8.3 IDS (Snort)

Ein IDS soll automatisch feststellen, ob ein Einbruch stattfindet oder stattgefunden hat, und diesen melden. Bei einer manuellen Überprüfung wäre es möglich, dass man den Einbruch zu spät oder vielleicht gar nicht erkennt, da z.B. sehr viele Protokolldateien berücksichtigt werden müssen, und das rund um die Uhr. Als IDS empfehle ich Snort. Wenn Sie das RPM-Paket installiert haben, passen Sie unbedingt die Variable HOME_NET in /etc/snort/snort.conf Ihrem Netzwerk an.

Ausgabebeispiel von snort-Einträgen in /var/www/messages:

[[Bild:Snort_output.png]]

8.4 Honeypots

Honeypots sind virtuelle Systeme, die Angreifern vorgaukeln, kompromittiert zu sein oder Schwachstellen aufweisen. Es lassen sich sogar komplexe Netzwerke simulieren. Wenn ein Angreifer sich in einer Honeypot befindet, kann sein Verhalten beobachtet werden und gleichzeitig wird ersichtlich, wie das System darauf reagiert. Die angesammelten Daten haben einen sehr hohen Informationswert.

Eine gute Software für die Bereitstellung eines Honeypots ist Honeyd.

9. Realtime Tests

Vorstellung der Werkzeuge

  • dsniff DSniff beinhaltet eine ganze Sammlung von mächtigen Tools: dsniff, filesnarf, mailsnarf, msgsnarf, urlsnarf and webspy sniffen Netzwerkverkehr mit; mit arpspoof, dnsspoof und macof kann Netzwerkverkehr gefälscht werden und sshmitm und webmitm ermöglichen Man-in-the-Middle-Attacken bei SSH and HTTPS Verbindungen.

  • Wireshark (früheres Ethereal) Wireshark protokolliert und analysiert Netzwerkverkehr, und stellt den Inhalt detaillert in einer GUI dar. Viele Verschiedene Protokolle werden dekodiert und mit Legende angezeigt.

  • hping hping kann nahezu beliebige TCP/IP-Pakete erzeugen und ist damit ein ideales Netzwerk- und Firewall-Diagnose-Tool für Profis. Mit speziellen TCP-, UDP- oder Raw-IP-Pings oder -Traceroutes kann man z. B. einfache Firewalls durchdringen und die Infrastruktur dahinter erkunden.

  • John the Ripper John the Ripper knackt schwache Passwörter mit Wörterbuchattacken oder per Brute Force. Es können Unix-Passworte und Windows-LanManager-Passworte untersucht werden. Der Erfolgt hängt sehr stark vom verwendeten Wörterbuch ab (Wörterbücher finden Sie auf der Uni Marburg Webseite). Um z.B. die Stärke der Login-Kennwörter mit john zu testen, gehen Sie wie folgt vor:

# Klartext Kennwörter erzeugen
unshadow /etc/passwd /etc/shadow >/root/kennwoerter.txt

# Kennwörter testen
john -i /root/kennwoerter.txt

# Klartext Kennwörter wieder löschen
rm -f /root/kennwoerter.txt

Die erratenen Kennwörter finden Sie dann im aktuellen Verzeichnis in der Datei john.pot.

  • Nessus Nessus ist ein modular erweiterbarer Schwachstellenscanner der verschiedene Betriebsysteme und Server auf eine Vielzahl von Sicherheitslöchern untersucht. Die Reports können in verschiedene Formaten ausgegeben werden. Nessus verwendet Plug-Ins, welche in der Skriptsprache NASL geschrieben ist. Nessus ist Client-Server-orientiert, die Scan-Engine kann von einem beliebigem, entfernten System mit einer gesonderten GUI bedient werden.

  • Nikto Nikto ist ein Tool zum Testen von Webservern, insbesondere zum Auffinden von 2000 verwundbaren CGI-Verzeichnissen und Skripten. Nikto basiert auf der Bibliothek ‘libwhisker’ und ist in Perl geschrieben.

  • nmap nmap ist ein Portscanner für UDP und TCP, der auch das Betriebssystem anhand der Antwortpakete erkennt. Nmap beherrscht eine Vielzahl von unterschiedlichen Scan-Arten.

Beispielaufruf: nmap -sV -O localhost

  • THC-Amap amap überprüft anhand einer Dummy-Verbindung, welche Services auf einem Port laufen und entdeckt damit auch Dienste auf fremden Ports.

  • Versuche in ein System einzudringen (Workshop)

Weiterführende Informationen

Aktualisiert: