Durchfuehrung von sicherheitsbezogenen Tätigkeiten

Wichtung: 4

Beschreibung: Die Kandidaten sollen in der Lage sein, die Systemkonfiguration zu überprüfen, so dass die Host-Sicherheit mit den lokalen Sicherheitsrichtlinien im Einklang ist.

Wichtigste Wissensgebiete:
Einrichten von tcpwrappers.
Auffinden von Dateien mit gesetztem suid/sgid-Bit.
Überprüfen von Softwarepaketen.
Setzen oder Löschen von Passwörtern und Passwort-Verfallszeiten.
Updaten von Programmen entsprechend den Empfehlungen der CERT, BUGTRAQ und/oder den Sicherheitswarnungen des Distributors.
Grundlegende Kenntnisse von iptables.
Fähigkeit nmap und netstat zu benutzen um offene Ports auf einem System zu erkennen.

Liste wichtiger Dateien, Verzeichnisse und Anwendungen:
/proc/net/ip_*
find
iptables
passwd
socket
nmap
netstat

Programme mit SUID/SGID Bit finden

Die SUID/SGID-Bits wurden bereits in einem vorherigen Kapitel näher erläutert. Das SUID-Bit kann nur bei ausführbaren Dateien gesetzt werden und sorgt dafür, dass ein Benutzer, der die ausführbare Datei startet, dieses nicht unter seinen eigenen, sondern unter den Rechten des eigentlichen Besitzers macht.

Substitute GroupID Bit (SGID): Dieses Recht gilt einerseits für ausführbare Dateien und andererseits für Verzeichnisse. Hat ein ausführbares Programm dieses Recht gesetzt, so gilt der gleiche Mechanismus, wie beim Substitute UserID Bit, nur diesmal eben die Gruppenmitgliedschaft betreffend.

Um nun alle Dateien mit einem SUID oder SGID Bit zu finden, kann man das Programm find in Verbindung mit der Option -perm nutzen. Letzteres wird dazu genutzt, um Dateien über bestimmte Rechte zu finden. Ein Zugriffsrecht von 4XXX bedeutet, dass das SUID-Bit gesetzt ist, ein 2XXX gibt an, daß das SGID-Bit gesetzt ist. Die Summe davon (6XXX) wären beide Bits gesetzt.

// Finden von Dateien mit SUID
find / -perm -4000 -user root

// Finden von Dateien mit SGID
find / -perm -2000 -group root

iptables, ipchains - Linux-Firewall

LPI setzt für die LPIC-1-Prüfung grundlegende Kenntnisse über die Firewall-Technik unter Linux voraus. Eingehende und ausgehende Verbindungen können mithilfe von ipchains oder iptables kontrolliert werden. Die eigentliche Firewall, also das Programm, das Pakete durchlässt oder abweist, ist kein separates Programm sondern der Kernel selbst. Bis zum Kernel 2.2 wurde ipchains eingesetzt. Dieses wurde durch iptables abgelöst.

Iptables ist eine Paketfilter-Firewall, welche jedes eingehende und ausgehende Paket analysiert und anhand entsprechender Regeln durchlässt, weiterleitet oder blockt. Hieraus lassen sich auch die drei Standard-Regelketten herleiten:

output-Regelkette = Alle Pakete, die den Rechner verlassen
input-Regelkette = Alle Pakte, die empfangen werden
forward-Regelkette = Alle Pakete, die weitergeleitet werden sollen

Wie bereits erwähnt, wird jedes Paket analaysiert. Hier können folgende Merkmale überprüft werden, um die Authentität zu gewährleisten:

- IP-Adresse des Sender
- IP-Adresse des Empfängers
- Port des Senders
- Port des Empfängers
- SYN und ACK-Flag
- Netzwerkschnittstelle

Anhand dieser Merkmale ist es nun möglich, ein Paket genaustens zu analysieren und mit einer Regelkette weiterzuverarbeiten. Auf ein eingehendes oder ausgehendes Paket kann man wiefolgt reagieren:

ACCEPT - Ein Paket wird akzeptiert
DENY - Ein Paket wird abgewiesen. Keine Fehlermeldung
REJECT - Ein Paket wird mit Fehlermeldung abgewiesen

Firewall-Grundeinstellung: Alles annehmen oder alles verbieten?

Bei der Frage "Wie soll die Firewall grundsätzlich Pakete behandeln?" hat man zwei Antwortmöglichkeiten: Entweder man aktiviert grundsätzlichen jeglichen Datentransfer und schließt dann bestimmte Ports oder man schottet das System komplett ab und schaltet die benötigten Ports frei. Letzteres ist natürlich die sichere Variante, erfordert aber deutlich aufwendigere Konfiguration. Hier das Prinzip einer Firewall, die grundlegend erst einmal alles durchlässt:

***BILD***

Wichtige Protokolle und der Verbindungsaufbau

Wenn Daten über das Netzwerk verschickt werden (E-Mail, Daten, SSH-Verbindungen), so bauen in der Regel die beiden Rechner eine Verbindung miteinander auf. Eine Verbindung wird bsp. schon aufgebaut, wenn man eine Internet-Seite aufruft. Ein Rechner kann natürlich nicht nur eine einzige Verbindung aufbauen. Damit die Verbindungen eindeutig einer Anwendung zugewiesen werden können, werden Verbindungen über einen bestimmten Port abgewickelt.

Bei den Ports muss man unterscheiden zwischen den reservierten Ports von 0 bis 1023 und den frei wählbaren Ports von 1024 bis 65535. Wenn man nun beispielsweise eine E-Mail über SMTP schicken möchte, so baut der E-Mail-Client über einen beliebig freien Port aus 1024 bis 65535 mit dem Port 21 (Standard-Port von SMTP) auf. Somit existiert eine eindeutige Verbindung:

Lokal: Port 5364 <--> Remote: Port 21.


Mit Netstat kann man sich die Verbindungen anzeigen lassen:

Aktive Verbindungen

Proto Lokale Adresse Remoteadresse Status
TCP stks2942:1061 localhost:microsoft-ds HERGESTELLT
TCP stks2942:1307 localhost:1308 HERGESTELLT
TCP stks2942:1308 localhost:1307 HERGESTELLT
TCP stks2942:1310 localhost:1311 HERGESTELLT

UDP, TCP und ICMP

ICMP steht für Internet Control Message Protocol. Die meisten ICMP-Pakete enthalten Diagnose-Informationen, sie werden vom Router zur Quelle zurückgeschickt, wenn der Router Pakete verwirft, z. B. weil das Ziel nicht erreichbar ist, die TTL abgelaufen ist usw. Auch das Programm ping baut auf ICMP auf. Siehe http://de.wikipedia.org/wiki/Icmp

UDP bedeutet User Datagram Protocol und ist verbindungslose Protokoll auf der Transportschicht des OSI-Referenzmodells. Die Betonung liegt hier auf dem Wort "verbindungslos", was so viel bedeutet, dass keine Flusssteuerung durchgeführt, keine Empfangsbestätigung erwartet wird und kein Verbindungsaufbau erfolgt. Die UDP-Pakete werden gesendet, ohne wirklich zu wissen, ob sie auch wirklich ankommen. Dadurch ist UDP schneller, aber wesentlich unsicherer. Siehe http://de.wikipedia.org/wiki/UDP.

TCP ist anders als UDP verbindungsorientiert, es erfolgt also zuerst ein Verbindungsaufbau (Handshake) und dann werden Daten gesendet/empfangen. Hier spielen das ACK-Bit und das SYN-Bit eine entscheidende Rolle. Das Handshake läuft nach folgendem Prinzip ab:

1.) Client schickt Paket an Server: Empfänger-IP, Empfänger-Port (z.B. 21), Eigene IP, Eigener Port (z.B. 5314), SYN


2.) Server schickt Paket zurück: Empfänger-IP, Empfänger-Port (z.B. 5314), Eigene IP, Eigener Port (z.B. 21), SYN + ACK


3.) Client antwortet: Empfänger-IP, Empfänger-Port (z.B. 21), Eigene IP, Eigener Port (z.B. 5314), ACK

Filterregeln mittels iptables

Syntax der Filteregeln:

ipchains   -A Regelkette -i Interface -p Protokoll \
-s Absenderadresse Absenderport \
-d Empfängeradresse Empfängerport -j Policy

Grundlegende Regeln

-A <chain> <regel> = Anfügen einer neuen Regel (input, output oder forward) am Ende einer Chain/Tabelle
-D <chain> <regel> = Löschen einer Regel aus einer Chain/Tabelle
-R <chain> <nr> <regel> = Ersetzen einer Regel durch eine neue
-I <chain> <nr> <regel></regel> = Einfügen einer Regel in eine Tabelle/Chain
-F [<chain>] = Alle Regeln einer Chain löschen
-Z [<chain>] = Löschen der Zähler einer Chain
-P <chain> <ziel> = Standardverhalten einer Chain festlegen
-E <chain><chain-neu> = Umbenennen einer Chain

-i Interface = Die Netzwerkschnittstelle für die die Regel gilt
-p Protokoll = Das verwendete Protokoll (icmp, tcp, udp)
-y = Das SYN-Flag muss gesetzt, das ACK-Flag nicht gesetzt sein
! -y = Das ACK-Flag muss gesetzt sein
-s IP-Adresse [ Portnummer ] = Absenderadresse (Source)
-d IP-Adresse [ Portnummer ] = Empfängeradresse (Destination)
-j Policy = Policy dieser Regel (ACCEPT, REJECT, DENY, MASQ)

# Beispielskript von www.pro-linux.de
# Alle Regeln aller Chains in der "filter" Tabelle löschen
#
iptables -F

#
# Pakete an lokale Prozesse
# -------------------------
#

# Policy (Standardverhalten am Regelende): Paket verwerfen
iptables -P INPUT DROP

# TCP-Pakete aus dem lokalen Netz durchlassen
iptables -A INPUT -p tcp -s 192.168.1.0/24 -j ACCEPT

# TCP-Pakete ohne SYN-Flag wegwerfen (an dieser Stelle Unsinn!)
# (Info: SYN-Flag ist nur beim Ersten Paket einer TCP-Verbindung gesetzt)
iptables -A INPUT -p tcp ! --syn -j DROP

# TCP-Pakete an Ziel-Port 113 (auth) erlauben
iptables -A INPUT -p tcp --dport 113 -j ACCEPT

# UDP-Pakete aus lokalem Netz passieren lassen
iptables -A INPUT -p udp -s 192.168.1.0/24 -j ACCEPT

# UDP-Pakete von Name-Servern durchlassen
iptables -A INPUT -p udp --sport 53 -j ACCEPT

# ICMP-Pakete (z.B. Ping) aus lokalem Netz erlauben
iptables -A INPUT -p icmp -s 192.168.1.0 -j ACCEPT

# ICMP-Pakete (z.B. Ping) generell verbieten
iptables -A INPUT -p icmp -j DROP

#
# Pakete, die geroutet werden
# ---------------------------
#

# Policy (Standardverhalten am Regelende): Paket verwerfen
iptables -P FORWARD DROP

# Pakete aus lokalem Netz erlauben und routen
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

#
# Pakete von lokalen Prozessen
# ----------------------------
#

# Policy (Standardverhalten am Regelende): Paket durchlassen
iptables -P OUTPUT ACCEPT

#
# sonst keine Einschränkungen -- wir stellen nichts an :-)

socket - Verbindung aufbauen und testen

Das Programm socket erlaubt es, auf beliebigen Ports Client- und Serversockets aufzubauen. Damit ist es möglich, die eigenen Ports zu überprüfen, ob Verbindungen darüber aufgebaut werden können.

// Verbindungsaufbau über Port 21 (smtp)
# socket -v 192.168.2.5 smtp

// Server-Socket auf Port 8644 erzeugen (localhost)
# socket -sl 8644

nmap - Ports überprüfen

nmap ist ein Port-Scanner-Tool, mit dessen Hilfe man Ports eines entfernten (und auch des eigenen) Rechners testen kann. nmap bietet umfangreiche Funktionen, welche den Umfang dieses Artikels sprengen würde. Daher empfiehlt sich ein Blick in die Manpage von man. Trotzdem ein kleines Beispiel:

user@linux $  nmap -sP 192.168.0.0/24
Starting nmap V. 2.3BETA6 by Fyodor (fyodor@dhp.com, www.insecure.org/nmap/)
Host rechner1.home.net (192.168.0.1) appears to be up.
Host rechner2.home.net (192.168.0.2) appears to be up.
Host rechner3.home.net (192.168.0.3) appears to be up.
Host rechner4.home.net (192.168.0.4) appears to be up.
Host rechner5.home.net (192.168.0.5) appears to be up.
Nmap run completed -- 256 IP addresses (5 hosts up) scanned in 1 second

Weitere Informationen

http://www.pro-linux.de/t_netzwerk/iptables.html
http://www.linux-praxis.de/lpic1/lpi102/1.114.1.html
http://www.selflinux.org/selflinux/html/nmap.html