© Maksim Kabakou - Fotolia.com

Ein gehärteter Linux Kernel mit PaX und Grsecurity

Pax Tux
Das Linux-Maskottchens in der PaX Variante.

Einen eigenen, sicheren Linux Kernel mit PaX und Grsecurity zu kompilieren hat eine Menge Vorteile, insbesondere bei öffentlich erreichbaren Servern. Ich kann jedem nur empfehlen, seinen Computer mit diesen beiden Kernel-Patchsammlungen zu härten.

In der IT-Sicherheit gibt es das Prinzip, optimiert-minimalistisch vorzugehen. Minimalistisch bedeutet, dass die Anzahl der Services, Anwendungen und Dateien auf einem Server und auf dem Netzwerkpfad auf dem Weg dorthin quantitativ möglichst gering gehalten werden sollte. Jedes Netzwerkgerät, jede Firewall, jeder Virenscanner und jedes Intrusion Detection System das sich in einem Netzwerk oder auf einem Computer befindet, kann prinzipiell Schwachstellen enthalten und angreifbar sein.

Optimiert vorzugehen bedeutet, das die notwendigen Tools hochsicher konfiguriert worden, in einer sicheren Umgebung kontrolliert laufen und, wenn möglich, gehärtet worden sind.

Zusammenfassung: Viele Tools zur Absicherung sind oftmals unsicherer als wenige, hoch optimierte und gehärtete Komponenten!

Auf jedem Linux Server ist ein Linux-Kernel vorhanden, es handelt sich daher um eine notwendige Komponente, die es im Folgenden zu härten gilt.

Was ist ein Kernel?

Der Kernel ist der "essentielle Kern" eines jeden Betriebssystems. Es ist der "unterste Teil" des Betriebssystems, der jedoch mit den höchsten Rechten läuft. Sollte dieses Grundwissen über den Kernel nicht vorhanden sein, empfehle ich jedem, sich vor einer Härtung mit PaX & Co. ein grundlegendes Wissen zu der Thematik anzueignen. Ein falsch konfigurierter, selbst kompilierter, gehärteter Kernel kann anfälliger sein, als der Kernel der Distribution!

Was ist PaX?

PaX beinhaltet eine Reihe von Patches, die für den Linux Kernel entwickelt worden sind. Die Patches bieten eine Reihe Vorteile, neue Funktionalitäten und einige Verbesserung vorhandener Kernel-Features. Als Schutz vor Exploits bietet PaX beispielsweise eine verbesserte ASLR (Address Space Layout Randomization).

Was ist Grsecurity?

Grsecurity sind weitere Patches für den Linux Kernel. PaX und Grsecurity wurden für eine Zusammenarbeit entwickelt und bedingen einander. Die Hauptfeatures von Grsecurity sind:

  1. Ein RBAC-System (eine Rollenbasierte Zugriffskontrolle)
  2. Memory Execution Prevention (NX-Bit), Memory Randomization (ASLR) und eine Verhinderung des Ausnutzens von Buffer-Overflows (über die PaX Patches)
  3. Trusted Path Execution.
  4. Zusätzliche chroot (Change Root) Härtung
  5. Randomisierungen (TCP/IP Stack und Prozess-IDs)
  6. Eingeschränkte Sichtbarkeit von Prozessen (z.B. den Kernel Threads)

Die Funktionalitäten lassen sich über Sysctl konfigurieren.

Was ist der Sinn der Kernel-Härtung, wo liegen die Vorteile?

Zur Konfiguration eines Servers oder Clients mit dem Ziel der maximal möglichen Sicherheit ist es notwendig, einige Arbeiten am Kernel vorzunehmen. Die Konfigurationen der Standardkernel der Distribution wie zum Beispiel Suse oder Ubuntu sind für die meisten Nutzer verhältnismäßig sicher konfiguriert und für den alltäglichen Gebrauch vollkommen ausreichend. Die meisten Distributionen liefern einige Tools wie beispielsweise Apparmor oder SELinux zur weiteren Absicherung mit.

Eine Härtung mit Grsecurity oder PaX ist sinnvoll, um sein System gegen etwas ausgefeiltere und gezielte Attacken abzusichern. Die Distributionskonfigurationen sind meist nicht für hochsichere Umgebungen optimiert, sondern für ein ausgewogenes Verhältnis aus Sicherheit, Komfort und Performance.

Schritt für Schritt: Systemhärtung mit Grsecurity und PaX

In meinem Schritt-für-Schritt HowTo zur Kompilierung des Linux Kernels habe ich bereits erläutert, wie ein Linux Kernel heruntergeladen, konfiguriert, kompiliert und installiert wird. Schritte, die in diesem Artikel bereits erklärt worden sind, werde ich in diesem Artikel nennen, jedoch nicht näher erläutern. Weitere Schritte, zum Beispiel zur Optimierung oder Anpassung des Kernels an das System sind ebenfalls möglich, diese werden in diesem Artikel jedoch nicht noch einmal wiederholt.

# Linux Kernel und GPG Signatur von https://www.kernel.org/ downloaden
# Download entpacken
unxz '/pfad/zur/datei/linux-3.2.50.tar.xz'

# Download verifizieren
gpg --verify '/pfad/zur/datei/linux-3.2.50.tar.sign'

Im nächsten Schritt wird der dazugehörige Grsecurity Patch und die dazugehörige Signatur heruntergeladen. Grundsätzlich sollten nur nur die Stable-Releases für den produktiven Einsatz genutzt werden: https://grsecurity.net/download_stable.php

Grsecurity Download von der Webseite
Grsecurity Stable Download Page

Im Falle des Screenshots sollten anschließend zwei weitere Dateien auf dem Computer sein:

  • grsecurity-2.9.1-3.2.50-201308202017.patch
  • grsecurity-2.9.1-3.2.50-201308202017.patch.sig

Hierbei ist zu beachten, dass der Patch exakt zur heruntergeladenen Kernelversion passen muss! Im nächsten Schritt wird der Download verifiziert:

# Grsecurity Patch verifizieren
gpg --verify '/home/greyuser/Downloads/grsecurity-2.9.1-3.2.50-201308202017.patch.sig'

Weitere Schritte:

# System vorbereiten
sudo apt-get install patch bin86 kernel-package build-essential libncurses5-dev gcc-*-plugin-dev

# In eine Rootshell wechseln
sudo -i

# Arbeitsverzeichnis anlegen
mkdir /usr/src/linux/

# Ins Arbeitsverzeichnis wechseln
cd /usr/src/linux/

# tar Datei kopieren
cp /pfad/zur/datei/linux-3.2.50.tar ./linux-3.2.50.tar

# tar Datei entpacken
tar -xvf linux-3.2.50.tar

# Ins entpackte Verzeichnis wechseln
cd ./linux-3.2.*

Anschließend wird der Quellcode des Kernels mit Grsecuriy gepatcht:

# Kernel patchen
patch -p1 < /home/silveruser/grsecurity-2.9.1-3.2.50-201308202017.patch

Abschließende Schritte vor der Konfiguration:

# Aktuelle Konfiguration übernehmen
cp /boot/config-$(uname -r) ./.config

# Konfiguration upgraden
make oldconfig

# Graphisches Konfigurationsmenü öffnen
make menuconfig

Grsecurity konfigurieren: Der schnelle Weg

Es ist möglich, Grsecurity und PaX mit Voreinstellungen zu konfigurieren. In der Anwendung menuconfig dazu den Punkt "Security Options" und anschließend "Grsecurity" auswählen.

Linux Menuconfig Security
In der Linux Menuconfig den Punkt Security...
Linux Menuconfig Security > Grsecurity ausgewählt
...anschließend das Item Grsecurity auswählen.

Für die schnelle, automatische Konfigurationsmethode auf einem Server könnte das Menü beispielsweise wie folgt konfiguriert werden:

Linux Menuconfig Security > Grsecurity > Details ausgewählt
Der Menuconfig Unterpunkt Security options -> Grsecurity -> Details ist geöffnet.

Die Punkte sollten selbsterklärend sein. Ein Wort zu "Virtualisierung": Dieser Punkt ist "None", wenn das Betriebssystem nicht aktiv etwas mit der Virtualisierung zu tun hat. Ist das System beispielsweise in VMware Workstation oder VMware vSphere Gast, wird nicht "Gast" ausgewählt, sondern "None".

Grsecurity konfigurieren: Der "harte" Weg

Neben der automatisierten Vorgehensweise gibt es noch die Möglichkeit der manuellen Konfiguration. Ich möchte im folgenden zu einigen Punkten etwas sagen und Konfigurationsmöglichkeiten nennen. Die Screenshots zeigen eine Konfigurationsmöglichkeit auf, die ich für Server empfehlen würde.

PaX

Linux Menuconfig Security > Grsecurity > PaX ausgewählt
Security Options -> Grsecurity -> PaX

Die Aktivierung des Punktes "Enable various PaX features" ist erforderlich, um PaX zu aktivieren.

Linux Menuconfig Security > Grsecurity > PaX > PaX Control ausgewählt
Security Options -> Grsecurity -> PaX -> PaX Control

Durch die Deaktivierung des Punktes "Support soft mode" wird PaX systemweit standardmäßig aktiviert.

Linux Menuconfig Security > Grsecurity > PaX > Non-Executable Pages ausgewählt
Security Options -> Grsecurity -> PaX -> Non-Executable Pages

Die Aktivierung von "Restrict mprotect()" ist nur auf Servern ratsam, da der XServer anschließend nicht mehr funktioniert.

Linux Menuconfig Security > Grsecurity > PaX > ASLR ausgewählt
Security Options -> Grsecurity -> PaX -> Address Space Layout Randomization
Linux Menuconfig Security > Grsecurity > PaX > Miscellaneous hardening features ausgewählt
Security Options -> Grsecurity -> PaX -> Miscellaneous hardening features

Viele Nutzer haben berichtet, dass die Aktivierung der Miscellaneous Hardening Features Probleme bei ATI Grafikkarten verursachen kann. Ich weise noch einmal darauf hin, dass die Beispieleinstellungen in den Screenshots für Server ohne graphischer Oberfläche optimiert sind!

Memory Protections

Linux Menuconfig Security > Grsecurity > Memory Protections ausgewählt
Security Options -> Grsecurity -> Memory Protections

Role Based Access Control Options

Linux Menuconfig Security > Grsecurity > Role Based Access Control Options ausgewählt
Security Options -> Grsecurity -> Role Based Access Control Options

Filesystem Protections

Linux Menuconfig Security > Grsecurity > Filesystem Protections ausgewählt
Security Options -> Grsecurity -> Filesystem Protections

Die Aktivierung des Punktes "Sysfs/debugfs restriction" hat bei mir unter Ubuntu 12.04 Probleme mit Pulse Audio ausgelöst. Auf Desktop PCs muss dieser Punkt somit deaktiviert werden.

Kernel Auditing / Logging Options

Eine Aktivierung der Punkte könnte insbesondere für Server relevant werden. Es muss jedoch beachtet werden, dass hierbei enorme Datenmengen in den Logdateien entstehen können.

Executable Protections

Linux Menuconfig Security > Grsecurity > Executable Protections ausgewählt
Security Options -> Grsecurity -> Executable Protections
Informationen zur Executable Protections mit Hilfe der Trusted Path Execution habe ich in einem eigenen Beitrag veröffentlicht:
--> Trusted Path Execution des Grsecurity Kernel Patches

Network Protections

Linux Menuconfig Security > Grsecurity > Network Protections ausgewählt
Security Options -> Grsecurity -> Network Protections

Sysctl Support

Linux Menuconfig Security > Grsecurity > Sysctl Support ausgewählt
Security Options -> Grsecurity -> Sysctl Support

Abschließende Schritte, den Kernel kompilieren

Nach der Konfiguration wird der Linux Kernel, wie im anderen Beitrag beschrieben, kompiliert:

make-kpkg clean

# Mit mehrern Threads gleichzeitig kompilieren (z.B. "4" bei vier verfügbaren CPU Kernen)
export CONCURRENCY_LEVEL=4

# Kernel im "Debian Style" übersetzen (ggf. noch kernel_header für die Kernel Header Files ergänzen)
make-kpkg --initrd --append-to-version "-mykernel" kernel_image

Nach dem Abschluss findet sich im übergeordneten Verzeichnis ein deb-Paket, was mit dem Befehl

sudo dpkg -i Name_der_datei.deb

installiert werden kann.

Probleme mit dem GRUB Bootloader

Nach einem Neustart kommt es unter Ubuntu wahrscheinlich zu Problemen bei der Installation von Kernel Updates bzw. der Ausführung des Befehls update-grub:

sudo update-grub
Killed

Im Logfile finden sich Zeilen, die ähnlich sind wie diese:

May 14 16:15:18 host kernel: [ 5164.157468] PAX: bytes at SP-4: b45d9134 0804a43b 0c0996c0 00000010 00000018 00000002 08075320 b45d8eac b45d8e88 0804dcb4 b45d8eac 00000000 00000000 000007f8 b45d8ec0 00000000 b45d8ec8 0804d9d8 b45d8eac 00000000 00000000
May 14 16:15:18 host kernel: [ 5164.158814] grsec: From aaa.bbb.ccc.ddd: denied resource overstep by requesting 4096 for RLIMIT_CORE against limit 0 for /usr/sbin/grub-probe[grub-probe:1307] uid/euid:0/0 gid/egid:0/0, parent /usr/sbin/grub-mkconfig[grub-mkconfig:1283] uid/euid:0/0 gid/egid:0/0 

Dieser Bug kann wie folgt behoben werden:

# paxctl installieren
sudo apt-get install paxctl

# Neue PT_PAX_FLAGS Header setzen
sudo paxctl -Cpemrxs /usr/sbin/grub-probe
sudo paxctl -Cpemrxs /usr/sbin/grub-mkdevicemap
sudo paxctl -Cpemrxs /usr/sbin/grub-setup
sudo paxctl -Cpemrxs /usr/bin/grub-script-check

# Nochmals versuchen
sudo update-grub

Nun sollte das GRUB-Update wieder problemlos funktionieren.

Zusammenfassung

Der neue Kernel bietet nun folgende "Features":

  1. Verbesserte Address Space Layout Randomization
  2. Ein RBAC-System (beschreibe ich einem weiterem Beitrag genauer)
  3. Eine zusätzliche chroot (Change Root) Härtung, was insbesondere für Anwendungen von Bedeutung ist, die in einer Sandbox laufen und chroot hierbei nutzen.
  4. Exploits haben es nun deutlich schwieriger, Schaden anrichten zu können.

Eine detaillierte Beschreibung der einzelnen Optionen findet sich in der Dokumentation von Grsecurity: https://en.wikibooks.org/wiki/Grsecurity/Print_version#Grsecurity_.28top_level_menu.29

Wenn etwas nicht sofort funktionieren sollte, nicht aufgeben 😉 An den ein oder anderen Stellen werden, insbesondere wenn der PC kein Server ist, sicherlich einige Probleme auftreten, die meist jedoch relativ einfach gelöst werden können.

Meine Empfehlung: Für Server ein Muss, für normale Desktop PCs sind die meisten Anwender mit dem originalen Distributionskernel gut beraten.

Bildnachweise:

  • Beitragsbild: © Maksim Kabakou - Fotolia.com
  • [1] Das Bild ist lizensiert unter der Creative Commons Attribution-Share Alike 3.0 Unported Lizenz. Quelle: https://commons.wikimedia.org/wiki/File:Pax_tux.png

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert