Kapitel 4. Authentifizierung und Zugriffskontrolle

# Kapitel 4. Authentifizierung und Zugriffskontrolle

Wenn eine Person (oder ein Programm) Zugriff auf das System erlangen möchte, wird über die Authentifizierung kontrolliert, ob der Identität vertraut werden kann.

| Warnung
Konfigurationsfehler von PAM können Sie aus Ihrem eigenen System aussperren. Sie müssen eine Rettungs-CD zur Hand haben oder eine alternative Boot-Partition einrichten. Um das System wiederherzustellen, booten Sie das System damit und korrigieren Sie alles Nötige von dort.

## 4.1. Normale Unix-Authentifizierung

Die normale Unix-Authentifizierung wird über das Modul `pam_unix`(8) von PAM (Pluggable Authentication Modules) bereitgestellt. Dessen drei wichtige Konfigurationsdateien (mit durch "`:`" getrennten Einträgen) sind:

Tabelle 4.1. Wichtige Konfigurationsdateien für `pam_unix`(8)

Datei | Berechtigung | Benutzer | Gruppe | Beschreibung
--- | --- | --- | --- | ---
`/etc/passwd` | `-rw-r--r--` | `root` | `root` | (bereinigte) Informationen zum Benutzerkonto
`/etc/shadow` | `-rw-r-----` | `root` | `shadow` | geschützte Informationen zum Benutzerkonto
`/etc/group` | `-rw-r--r--` | `root` | `root` | Informationen zur Gruppe

"`/etc/passwd`" enthält Folgendes:

     ...
    user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
    user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash
     ...

Wie in `passwd`(5) beschrieben haben die durch "`:`" separierten Einträge dieser Datei folgende Bedeutungen:

- Benutzername (Login-Name);

- Eintrag zur Passwortspezifikation;

- nummerische Benutzer-ID;

- nummerische Gruppen-ID;

- Name oder Kommentarfeld;

- Home-Verzeichnis des Benutzers;

- optionale Angabe des Befehlsinterpreters für den Benutzer.

Der zweite Eintrag von "`/etc/passwd`" wurde früher für das verschlüsselte Passwort benutzt. Seit der Einführung von "`/etc/shadow`" enthält er die Passwortspezifikation:

Tabelle 4.2. Inhalt des zweiten Eintrags in "`/etc/passwd`"

Inhalt | Bedeutung
--- | ---
(leer) | Konto ohne Passwort
x | das verschlüsselte Passwort ist in "`/etc/shadow`" abgelegt

"`/etc/shadow`" enthält Folgendes:

     ...
    user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
    user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::
     ...

Wie in `shadow`(5) beschrieben haben die durch "`:`" separierten Einträge dieser Datei folgende Bedeutungen:

- Benutzername (Login-Name);

- verschlüsseltes Passwort (das "`$1$`" am Anfang zeigt die Verwendung der MD5-Verschlüsselung an; "*" steht für "kein Login");

- Datum der letzten Passwortänderung, ausgedrückt als Anzahl der Tage seit dem 1. Januar 1970;

- Anzahl der Tage, die der Benutzer vor der erneuten Änderung des Passworts warten muss;

- Anzahl der Tage, nach denen der Benutzer das Passwort ändern muss;

- Anzahl der Tage vor dem Verfall des Passworts, während derer der Benutzer vor dem Passwortverfall gewarnt wird;

- Anzahl der Tage, während derer das Passwort noch akzeptiert wird, obwohl es abgelaufen ist;

- Datum, an dem das Konto abläuft, ausgedrückt als Anzahl der Tage seit dem 1. Januar 1970.

- …

"`/etc/group`" enthält Folgendes:

    group1:x:20:user1,user2

Wie in `group`(5) beschrieben haben die durch "`:`" separierten Einträge dieser Datei folgende Bedeutungen:

- Gruppenname;

- verschlüsseltes Passwort (nicht wirklich benutzt);

- nummerische Gruppen-ID;

- durch "," getrennte Liste von Benutzernamen.

| Anmerkung
"`/etc/gshadow`" bietet für "`/etc/group`" ähnliche Funktionalität wie "`/etc/shadow`", diese wird aber nicht wirklich genutzt.

| Anmerkung
Die aktuelle Gruppenmitgliedschaft eines Benutzers kann dynamisch angepasst werden, wenn eine Zeile mit "`auth optional pam_group.so`" zu "`/etc/pam.d/common-auth`" hinzugefügt wird und wenn dies in "`/etc/security/group.conf`" gesetzt ist. Lesen Sie dazu `pam_group`(8).

| Anmerkung
Das `base-passwd`-Paket enthält eine verbindliche Liste von Benutzern und Gruppen: "`/usr/share/doc/base-passwd/users-and-groups.html`".

## 4.2. Verwalten von Konten- und Passwortinformationen

Hier einige erwähnenswerte Befehle zur Verwaltung von Konteninformationen:

Tabelle 4.3. Liste von Befehlen zur Verwaltung von Konteninformationen

Befehl | Funktion
--- | ---
`getent passwd benutzername` | Konteninformationen von `benutzername` anzeigen
`getent shadow benutzername` | durch shadow geschützte Konteninformationen von `benutzername` anzeigen
`getent group gruppenname` | Gruppeninformationen von `gruppenname` anzeigen
`passwd` | Passwort für das Konto verwalten
`passwd -e` | Einmal-Passwort für die Kontenaktivierung setzen
`chage` | Alterungsinformationen des Passworts verwalten

Sie benötigen für einige Funktionen root-Privilegien. Lesen Sie `crypt`(3) für Informationen zur Passwort- und Datenverschlüsselung.

| Anmerkung
Auf Systemen, die mit PAM und NSS eingerichtet sind, wie der Debian-Salsa-Maschine, wird der Inhalt der lokalen Dateien "`/etc/passwd`", "`/etc/group`" und "`/etc/shadow`" auf dem System unter Umständen nicht aktiv verwendet. Obige Befehle sind aber auch in solchen Umgebungen gültig.

## 4.3. Ein gutes Passwort

Bei der Erstellung eines Kontos während der Systeminstallation oder mit dem `passwd`(1)-Befehl sollten Sie ein gutes Passwort auswählen, das aus mindestens sechs bis acht Zeichen besteht und ein oder mehrere Zeichen aus folgenden Gruppen enthält (gemäß `passwd`(1)):

- Kleinbuchstaben;

- Ziffern zwischen 0 und 9;

- Satzzeichen.

| Warnung
Wählen Sie keine Wörter für das Passwort, die erraten werden könnten: Kontoname, Sozialversicherungsnummer, Telefonnummer, Adresse, Geburtstag, Name von Familienmitgliedern oder Haustieren, Wörter, die in Lexika auftauchen, einfache Zeichenfolgen wie "12345" oder "qwerty", … alle diese sind eine schlechte Wahl für ein Passwort.

## 4.4. Verschlüsselte Passwörter erstellen

Es gibt mehrere unabhängige Werkzeuge, um verschlüsselte Passwörter mit Salz zu erzeugen:

Tabelle 4.4. Liste der Werkzeuge zur Passworterzeugung

Paket | Popcon | Größe | Befehl | Funktion
--- | --- | --- | --- | ---
`whois` | V:22, I:209 | 384 | `mkpasswd` | best-ausgestattetes Frontend für die `crypt`(3)-Bibliothek
`openssl` | V:834, I:995 | 2503 | `openssl passwd` | Passwort-Hashes berechnen (OpenSSL). `passwd`(1ssl)

## 4.5. PAM und NSS

Moderne Unix-ähnliche Systeme wie Debian stellen dem lokalen Systemadministrator die Mechanismen PAM (Pluggable Authentication Modules) und NSS (Name Service Switch) zur Systemkonfiguration bereit. Deren Funktionen können wie folgt zusammengefasst werden:

- PAM bietet flexible Authentifizierungsmechanismen, die von Anwendungen genutzt werden, und integriert daher auch den Austausch von Passwortdaten.

- NSS besitzt einen flexiblen Name-Service-Mechanismus, der oft von der C-Standard-Bibliothek genutzt wird, um die Benutzer- und Gruppennamen für Programme wie `ls`(1) und `id`(1) einzuholen.

Diese PAM- und NSS-Systeme müssen konsistent konfiguriert sein.

Hier einige erwähnenswerte Pakete von PAM- und NSS-Systemen:

Tabelle 4.5. Liste von PAM- und NSS-Systemen

Paket | Popcon | Größe | Beschreibung
--- | --- | --- | ---
`libpam-modules` | V:922, I:999 | 917 | Pluggable Authentication Modules (grundlegende Dienste)
`libpam-ldapd` | V:6, I:14 | 80 | Pluggable Authentication Module, das LDAP-Schnittstellen erlaubt
`libpam-systemd` | V:701, I:963 | 739 | Pluggable Authentication Module zur Registrierung von Nutzersitzungen für `logind`
`libpam-doc` | I:6 | 1504 | Pluggable Authentication Modules (Dokumentation in html- und Textform)
`libc6` | V:922, I:999 | 5370 | GNU-C-Bibliothek: Programmbibliothek, die auch einen "Name Service Switch"-Dienst bereitstellt
`glibc-doc` | I:5 | 3858 | GNU-C-Bibliothek: Handbuchseiten
`glibc-doc-reference` | I:3 | 14261 | GNU-C-Bibliothek: Referenzhandbuch im info-, pdf- und html-Format (nicht-frei)
`libnss-mdns` | V:235, I:520 | 141 | NSS-Modul für Multicast-DNS-Namensauflösung
`libnss-ldapd` | V:7, I:17 | 131 | NSS-Modul, um LDAP als Namensdienst zu verwenden

- Der "Linux-PAM System Administrators' Guide" in `libpam-doc` ist zum Erlernen der PAM-Konfiguration unerlässlich.

- Zum Erlernen der NSS-Konfiguration ist der Abschnitt "System Databases and Name Service Switch" in `glibc-doc-reference` unerlässlich.

| Anmerkung
Eine ausführlichere und aktuellere Liste bekommen Sie mit dem Befehl "`aptitude search 'libpam-|libnss-'`". Die Abkürzung NSS kann auch "Network Security Service" bedeuten, was etwas anderes ist als "Name Service Switch".

| Anmerkung
PAM ist der grundlegendste Weg, um Umgebungsvariablen für jegliche Programme mit einem systemweiten Standardwert vorzubelegen.

Unter systemd ist das Paket `libpam-systemd` installiert, um die Login-Informationen der Benutzer zu verwalten; dazu werden die Nutzersitzungen in der `systemd`-Kontrollgruppen-Hierarchie für logind registriert. Details finden Sie in `systemd-logind`(8), `logind.conf`(5) und `pam_systemd`(8).

### 4.5.1. Konfigurationsdateien, auf die PAM und NSS zugreifen

Hier einige erwähnenswerte Konfigurationsdateien, die von PAM und NSS genutzt werden:

Tabelle 4.6. Liste von Konfigurationsdateien, auf die PAM und NSS zugreifen

Konfigurationsdatei | Funktion
--- | ---
`/etc/pam.d/programmname` | Einrichtung der PAM-Konfiguration für das Programm `programmname`; lesen Sie dazu `pam`(7) und `pam.d`(5)
`/etc/nsswitch.conf` | Einrichtung der NSS-Konfiguration mit Einträgen für die jeweiligen Dienste; lesen Sie dazu `nsswitch.conf`(5)
`/etc/nologin` | Einschränkung der Benutzeranmeldung über das `pam_nologin`(8)-Modul
`/etc/securetty` | Einschränkung des tty für den root-Zugriff durch das `pam_securetty`(8)-Modul
`/etc/security/access.conf` | Zugriffsbeschränkungen setzen über das `pam_access`(8)-Modul
`/etc/security/group.conf` | Einschränkungen für Gruppen setzen über das `pam_group`(8)-Modul
`/etc/security/pam_env.conf` | Umgebungsvariablen setzen über das `pam_env`(8)-Modul
`/etc/environment` | Zusätzliche Umgebungsvariablen setzen über das `pam_env`(8)-Modul mit dem Argument "`readenv=1`"
`/etc/default/locale` | Setzen der Locale (Gebietsschema) über das `pam_env`(8)-Modul mit dem Argument "`readenv=1 envfile=/etc/default/locale`" (Debian)
`/etc/security/limits.conf` | Beschränkungen für Ressourcen (ulimit, core, …) setzen über das `pam_linits`(8)-Modul
`/etc/security/time.conf` | Zeitbeschränkungen setzen über das `pam_time`(8)-Modul
`/etc/systemd/logind.conf` | `systemd` Login-Manager-Konfiguration setzen (siehe `logind.conf`(5) and `systemd-logind.service`(8))

Einschränkungen bei der Passwortauswahl sind über die PAM-Module `pam_unix`(8) und `pam_cracklib`(8) implementiert. Diese können über deren Argumente konfiguriert werden.

| Tipp
PAM-Module verwenden den Anhang "`.so`" für ihre Dateinamen.

### 4.5.2. Modernes zentralisiertes Systemmanagement

Ein Lightweight Directory Access Protocol (LDAP)-Server erlaubt modernes zentralisiertes Systemmanagement und somit die Administrierung vieler Unix-ähnlicher und nicht-Unix-Systeme über das Netzwerk. Die quelloffene Implementation des Lightweight Directory Access Protocol ist OpenLDAP.

Der LDAP-Server stellt die Konteninformationen auf Debian-Systemen durch die Nutzung von PAM und NSS über die `libpam-ldapd`- und `libnss-ldapd`-Pakete bereit. Verschiedene Aktionen sind nötig, um dies zu aktivieren. (Ich verwende dieses Setup nicht, daher stammen diese Informationen komplett aus zweiter Hand. Bitte beachten Sie das beim Lesen dieses Abschnitts.)

- Richten Sie einen zentralisierten LDAP-Server ein, indem Sie ein Programm wie den eigenständigen LDAP-Daemon `slapd`(8) starten.

- Ändern Sie die PAM-Konfigurationsdateien im Verzeichnis "`/etc/pam.d/`", um "`pam_ldap.so`" statt dem Standard "`pam_unix.so`" zu verwenden.

- Ändern Sie die NSS-Konfiguration in der Datei "`/etc/nsswitch.conf`", um "`ldap`" statt dem Standard ("`compat`" oder "`file`") zu verwenden.

- Richten Sie es so ein, dass `libpam-ldapd` SSL- (oder TLS-)Verbindungen verwendet, um die Passwortsicherheit zu gewährleisten.

- Richten Sie es so ein, dass `libnss-ldapd` SSL- (oder TLS-)Verbindungen verwendet, um die Unversehrtheit der Daten sicherzustellen (auch wenn dies zusätzlichen LDAP-Netzwerk-Overhead verursacht).

- Sie sollten `nscd`(8) lokal ausführen, um alle Antworten auf LDAP-Anfragen zwischenzuspeichern; dies reduziert den LDAP-Netzwerkverkehr.

See documentations in `nsswitch.conf`(5), `pam.conf`(5), `ldap.conf`(5), and "`/usr/share/doc/libpam-doc/html/`" offered by the `libpam-doc` package and "`info libc 'Name Service Switch'`" offered by the `glibc-doc` package.

Ähnlich zu diesem Verfahren können Sie auch alternative zentralisierte Systeme mit anderen Methoden einrichten:

- Verflechtung von Benutzer- und Gruppeninformationen mit Windows-Systemen

  - Zugriff auf Windows Domain-Dienste mittels der Pakete `winbind`- und `libpam_winbind`;

  - Lesen Sie dazu `winbindd`(8) und Integrating MS Windows Networks with Samba.

- Verflechtung von Benutzer- und Gruppeninformationen mit Unix-ähnlichen Systemen

  - Zugriff auf NIS (ursprünglich YP genannt) oder NIS+ mittels dem `nis`-Paket;

  - Lesen Sie dazu das Linux NIS(YP)/NYS/NIS+ HOWTO.

### 4.5.3. "Warum unterstützt GNU su nicht die wheel-Gruppe"

Dies ist eine bekannte Redewendung am Ende der alten "`info su`"-Seite von Richard M. Stallman. Aber keine Sorge: der aktuelle `su`-Befehl in Debian nutzt PAM, so dass man die Erlaubnis zur Nutzung von `su` auf die `root`-Gruppe beschränken kann, indem die Zeile mit "`pam_wheel.so`" in "`/etc/pam.d/su`" aktiviert wird.

### 4.5.4. Schärfere Passwortregeln

Die Installation des `libpam-cracklib`-Pakets ermöglicht Ihnen, schärfere Regeln für Passwörter vorzuschreiben.

Auf einem typischen GNOME-System, auf dem automatisch `libpam-gnome-keyring` installiert wird, sieht "`/etc/pam.d/common-password`" wie folgt aus:

    # here are the per-package modules (the "Primary" block)
    password	requisite			pam_cracklib.so retry=3 minlen=8 difok=3
    password	[success=1 default=ignore]	pam_unix.so obscure use_authtok try_first_pass yescrypt
    # here's the fallback if no module succeeds
    password	requisite			pam_deny.so
    # prime the stack with a positive return value if there isn't one already;
    # this avoids us returning an error just because nothing sets a success code
    # since the modules above will each just jump around
    password	required			pam_permit.so
    # and here are more per-package modules (the "Additional" block)
    password	optional	pam_gnome_keyring.so
    # end of pam-auth-update config

## 4.6. Sicherheit der Authentifizierung

| Anmerkung
Die Informationen hier sind für Ihre Sicherheitsbedürfnisse möglicherweise nicht passend, aber sie sollten für den Anfang eine gute Basis sein.

### 4.6.1. Sicheres Passwort im Internet

Viele beliebte Transport-Layer-Dienste kommunizieren Nachrichten inklusive der Passwort-Authentifizierung im Klartext. Es ist eine sehr schlechte Idee, Passwörter im Klartext über das wilde Internet zu übertragen, wo es abgehört werden kann. Sie können diese Dienste über "Transport Layer Security" (TLS) oder seinen Vorgänger "Secure Sockets Layer" (SSL) betreiben, um die vollständige Kommunikation inklusive des Passworts über die Verschlüsselung zu schützen.

Tabelle 4.7. Liste von unsicheren und sicheren Diensten und Ports

Name des unsicheren Dienstes | Port | Name des sicheren Dienstes | Port
--- | --- | --- | ---
www (http) | 80 | https | 443
smtp (Mail) | 25 | ssmtp (smtps) | 465
ftp-data | 20 | ftps-data | 989
ftp | 21 | ftps | 990
telnet | 23 | telnets | 992
imap2 | 143 | imaps | 993
pop3 | 110 | pop3s | 995
ldap | 389 | ldaps | 636

Die Verschlüsselung kostet CPU-Zeit. Als CPU-freundliche Alternative können Sie die Kommunikation im Klartext lassen und nur das Passwort verschlüsseln; verwenden Sie dazu ein sicheres Authentifizierungsprotokoll wie "Authenticated Post Office Protocol" (APOP) für POP oder "Challenge-Response Authentication Mechanism MD5" (CRAM-MD5) für SMTP und IMAP. (Um E-Mail-Nachrichten über das Internet von Ihrem Mail-Client-Programm zum Mail-Server zu übertragen, ist es derzeit verbreitet, den neuen Message-Submission-Port 587 zu nutzen statt dem traditionellen SMTP-Port 25, um zu vermeiden, dass Port 25 vom Netzwerk-Provider geblockt wird, während Sie sich über CRAM-MD5 authentifizieren.)

### 4.6.2. Secure Shell (sichere Shell)

Das Secure-Shell-(SSH-)Programm bietet sichere verschlüsselte Kommunikation zwischen zwei nicht vertrauenswürdigen Rechnern über ein unsicheres Netzwerk mittels sicherer Authentifizierung. Es besteht aus dem OpenSSH-Client (`ssh`(1)) und dem OpenSSH-Daemon (`sshd`(8)). SSH kann genutzt werden, um mittels der Port-Forwarding-Funktionalität (Port-Weiterleitung) eine unsichere Protokoll-Kommunikation wie POP oder X gesichert durch das Internet zu tunneln.

Der Client versucht, sich selbst über eine Host-basierte Authentifizierung gegenüber dem Server zu identifizieren; dazu können verschiedene Verfahren angewandt werden: Public Key Authentication (über einen öffentlichen Schlüssel), Challenge-Response Authentication (es wird eine Aufgabe gestellt, für die die andere Seite die Lösung liefern muss) oder Passwort-Authentifizierung. Die Nutzung der Public Key Authentication ermöglicht eine Anmeldung aus der Ferne ohne Passwort. Lesen Sie dazu Abschnitt 6.3, „Der Server für Fernzugriff (SSH) und Hilfsprogramme“.

### 4.6.3. Zusätzliche Sicherheitsmaßnahmen für das Internet

Sogar wenn Sie sichere Dienste wie Secure Shell (SSH) und Point-to-point Tunneling Protocol (PPTP) verwenden, bestehen trotzdem noch Chancen für die Einbrecher mittels Brute-Force-Atttacken zum Erraten von Passwörtern usw. über das Internet. Die Nutzung von Firewall-Richtlinien (mehr dazu in Abschnitt 5.7, „Die Netfilter-Infrastruktur“) zusammen mit den folgenden Sicherheitswerkzeugen kann die Situation weiter verbessern.

Tabelle 4.8. Liste von Werkzeugen, die zusätzliche Sicherheitsmaßnahmen ermöglichen

Paket | Popcon | Größe | Beschreibung
--- | --- | --- | ---
`knockd` | V:0, I:1 | 110 | kleiner Port-Knock-Daemon `knockd`(1) (horcht auf spezielle Anklopf-Sequenzen für Ports) und -Client `knock`(1)
`fail2ban` | V:95, I:106 | 2191 | IP-Adressen sperren, die vielfache Authentifizierungsfehler verursachen
`libpam-shield` | V:0, I:0 | 115 | Ferne Angreifer aussperren, die versuchen, Passwörter zu erraten

### 4.6.4. Sichern des root-Passworts

Um zu verhindern, dass Leute auf Ihre Maschine mit root-Privilegien zugreifen, müssen Sie folgende Aktionen durchführen:

- Prevent physical access to the system storage device (HDD / SSD / ...)

- das UEFI/BIOS abriegeln und verhindern, dass von Wechseldatenträgern gebootet wird;

- ein Passwort für interaktive Sitzungen von GRUB vergeben;

- das Editieren des GRUB-Menüs verhindern.

With physical access to the system storage device, resetting the password is relatively easy with following steps.

1. Move the system storage device to a PC with USB bootable UEFI/BIOS.

2. Boot system with a rescue media (see Abschnitt 3.2.2, „Linux live rescue system on USB“).

3. Binden Sie die root-Partition mit Lese-/Schreibberechtigung ein.

4. Editieren Sie "`/etc/passwd`" auf der root-Partition und verändern Sie den zweiten Eintrag für das `root`-Konto, so dass dieser leer ist.

Wenn Sie beim Booten Schreibzugriff auf den GRUB-Menüeintrag für `grub-rescue-pc` haben (lesen Sie dazu Abschnitt 3.1.2, „Stufe 2: der Bootloader“), ist es mit folgenden Schritten sogar noch einfacher:

1. Booten Sie das System, nachdem Sie die Kernel-Parameter etwa wie folgt geändert haben: "`root=/dev/sda6 rw init=/bin/sh`".

2. Editieren Sie "`/etc/passwd`" und verändern Sie den zweiten Eintrag für das `root`-Konto, so dass dieser leer ist.

3. Starten Sie das System neu.

Die root-Shell des Systems ist jetzt ohne Passwort zugänglich.

| Anmerkung

Sobald jemand Zugriff auf die root-Shell hat, kann er auf alles auf dem System zugreifen und jegliche Passwörter auf dem System zurücksetzen. Mehr noch, er könnte die Passwörter für alle Benutzerkonten kompromittieren, indem Brute-Force-Werkzeuge zum Knacken von Passwörtern wie `john` oder `crack` eingesetzt werden (Näheres in Abschnitt 9.5.11, „Systemsicherheits- und Integritätsüberprüfung“). Diese geknackten Passwörter könnten dann dazu verwendet werden, um andere Systeme zu kompromittieren.

Die einzige vernünftige Software-Lösung, um all diese Bedenken auszuräumen, ist die Verwendung einer Software-verschlüsselten root-Partition (oder "`/etc`"-Partition) mittels dm-crypt und initramfs (lesen Sie dazu Abschnitt 9.9, „Tipps zur Datenverschlüsselung“). Sie benötigen dann allerdings immer ein Passwort, um das System zu booten.

## 4.7. Andere Möglichkeiten zur Zugriffskontrolle

Es gibt Zugriffsbeschränkungen auf dem System, die nicht auf passwort-basierter Authentifizierung und Dateiberechtigungen beruhen.

| Anmerkung
Abschnitt 9.4.16, „Die Alt-SysRq-Tastenkombination“ enthält Informationen, wie Sie die Kernel-Funktion Secure attention key (SAK) einschränken.

### 4.7.1. Zugriffssteuerungslisten (Access control lists/ACLs)

ACLs sind eine Obermenge der regulären Berechtigungen, (beschrieben in Abschnitt 1.2.3, „Dateisystem-Berechtigungen“).

ACLs in Aktion finden Sie in modernen Arbeitsplatzumgebungen. Wenn ein formatierter USB-Speicher automatisch eingebunden wird, z.B. als "`/media/penguin/USBSTICK`", kann ein normaler Benutzer `penguin` folgendes ausführen:

     $ cd /media/penguin
     $ ls -la
    total 16
    drwxr-x---+ 1 root    root    16 Jan 17 22:55 .
    drwxr-xr-x  1 root    root    28 Sep 17 19:03 ..
    drwxr-xr-x  1 penguin penguin 18 Jan  6 07:05 USBSTICK

Das "`+`" an der 11. Stelle zeigt an, dass ACLs aktiv sind. Ohne ACLs sollte es einem normalen Benutzer nicht erlaubt sein, diesen ls-Befehl auszuführen, da `penguin` nicht in der `root`-Gruppe ist. Sie können die ACLs auflisten mit:

     $ getfacl .
    # file: .
    # owner: root
    # group: root
    user::rwx
    user:penguin:r-x
    group::---
    mask::r-x
    other::---

Hierbei gilt:

- "`user::rwx`", "`group::---`" und "`other::---`" stehen für regulären Eigentümer, Gruppe und Berechtigungen anderer.

- Die ACL "`user:penguin:r-x`" erlaubt es einem normalen Benutzer `penguin`, die Rechte "`r-x`" zu erhalten. Damit ist es diesem möglich, mit "`ls -la`" den Verzeichnisinhalt aufzulisten.

- Die ACL "`mask::r-x`" setzt eine Obergrenze für die Berechtigungen.

Lesen Sie dazu "POSIX Access Control Lists on Linux", `acl`(5), `getfacl`(1) und `setfacl`(1).

### 4.7.2. sudo

Das Programm `sudo`(8) wurde entwickelt, um einem Systemadministrator die Möglichkeit zu geben, Benutzern eingeschränkte root-Privilegien zu gewähren sowie um die Aktivitäten rund um das root-Konto zu protokollieren. `sudo` benötigt nur das Passwort eines normalen Benutzers. Installieren Sie das `sudo`-Paket und aktivieren Sie es, indem Sie passende Optionen in "`/etc/sudoers`" setzen. Konfigurationsbeispiele finden Sie unter "`/usr/share/doc/sudo/examples/sudoers`" und in Abschnitt 1.1.12, „sudo-Konfiguration“.

Die Art, wie ich `sudo` auf meinem Einzelbenutzersystem verwende (lesen Sie Abschnitt 1.1.12, „sudo-Konfiguration“), soll mich selbst vor meiner eigenen Dummheit schützen. Ich persönlich denke, dass die Verwendung von `sudo` eine bessere Alternative zur dauerhaften Nutzung des root-Kontos ist. Der folgende Befehl ändert zum Beispiel den Eigentümer von "`irgendeine_datei`" in "`mein_name`":

    $ sudo chown my_name some_file

Wenn Sie das root-Passwort kennen (was bei Benutzern, die sich ihr Debian-System selbst installieren, immer der Fall ist), können Sie natürlich jeden Befehl von jeglichem Benutzerkonto aus ausführen, indem Sie "`su -c`" verwenden.

### 4.7.3. PolicyKit

PolicyKit ist eine Komponente des Betriebssystems zur Kontrolle von systemweiten Privilegien auf Unix-ähnlichen Systemen.

Neuere GUI-Anwendungen sind nicht dafür entwickelt, als privilegierte Prozesse zu laufen. Sie kommunizieren mit privilegierten Prozessen über PolicyKit, um administrative Operationen durchführen zu können.

Auf Debian-Systemen beschränkt PolicyKit solche Operationen auf Benutzerkonten, die der `sudo`-Gruppe angehören.

Lesen Sie dazu `polkit`(8).

### 4.7.4. Den Zugriff auf einige Server-Dienste einschränken

Aus Gründen der Systemsicherheit ist es eine gute Idee, so viele Server-Programme wie möglich zu deaktivieren. Dies ist besonders für Netzwerk-Server kritisch. Ungenutzte Server, die entweder direkt als Daemon oder über den Super-Server aktiviert sind, müssen als Sicherheitsrisiko angesehen werden.

Viele Programme wie `sshd`(8) verwenden PAM-basierte Zugriffskontrollen. Es gibt viele Möglichkeiten, um den Zugriff auf Server-Dienste einzuschränken:

- Konfigurationsdateien: "`/etc/default/programmname`";

- Systemd Dienste-Unit-Konfiguration für den Daemon;

- PAM (Pluggable Authentication Modules);

- "`/etc/inetd.conf`" für den Super-Server;

- "`/etc/hosts.deny`" und "`/etc/hosts.allow`" für TCP-Wrapper (`tcpd`(8));

- "`/etc/rpc.conf`" für Sun RPC;

- "`/etc/at.allow`" und "`/etc/at.deny`" für `atd`(8);

- "`/etc/cron.allow`" und "`/etc/cron.deny`" für `crontab`(1);

- Netzwerk-Firewall aus der netfilter-Infrastruktur.

Lesen Sie dazu Abschnitt 3.6, „Systemmanagement“, Abschnitt 4.5.1, „Konfigurationsdateien, auf die PAM und NSS zugreifen“ und Abschnitt 5.7, „Die Netfilter-Infrastruktur“.

| Tipp
Sun-RPC-Dienste müssen für NFS und andere RPC-basierte Programme aktiviert sein.

| Tipp
Falls Sie Probleme mit dem Zugriff von außen auf ein aktuelles Debian-System haben, kommentieren Sie blockierende Konfigurationselemente wie "`ALL: PARANOID`" in "`/etc/hosts.deny`" aus, falls solche existieren. (Aber sie müssen vorsichtig sein bezüglich der Sicherheitsrisiken, die durch solche Aktionen entstehen.)

### 4.7.5. Linux Sicherheits-Funktionalitäten

Der Linux-Kernel hat Sicherheitsfunktionen entwickelt und unterstützt sie immer noch, die in traditionellen UNIX-Implementierungen nicht zu finden sind.

Linux unterstützt erweiterte Dateiattribute, die über die traditionellen UNIX-Attribute hinausgehen (siehe `xattr`(7)).

Linux teilt die Privilegien, die dem Superuser traditionell zugewiesen wurden, in verschiedene Bereiche auf, bekannt als `Capabilities`(7), die unabhängig voneinander aktiviert oder deaktiviert werden können. Capatilities sind Attribute, die pro Prozess definiert werden können, und werden seit der Kernel-Version 2.2 unterstützt.

Das Linux Security Module (LSM) Framework stellt einen Mechanismus für verschiedene Sicherheits-Checks bereit, die von neuen Kernel-Erweiterungen abhängig sind. Zum Beispiel:

- AppArmor

- Security-Enhanced Linux (SELinux)

- Smack (Simplified Mandatory Access Control Kernel)

- Tomoyo Linux

Da diese Erweiterungen die Privilegien grundsätzlich weiter einschränken, als dies im normalen UNIX-artigen Sicherheitsmodell der Fall ist, können unter Umständen sogar die Superuser-Rechte beschnitten sein. Sie werden aufgefordert, das Dokument zum Linux Security Module (LSM) Framework auf kernel.org zu lesen.

Das Konzept der Linux Namespaces hüllt eine globale Systemressource in eine Abstraktion, die dazu führt, dass es für einen Prozess innerhalb des Namespace so erscheint, als hätte er eine eigene isolierte Instanz dieser globalen Ressource. Änderungen an der globalen Ressource sind für alle Prozesse innerhalb des Namespace sichtbar, nicht aber für andere Prozesse. Seit Kernel-Version 5.6 gibt es 8 Arten von Namespaces (lesen Sie dazu `namespaces`(7), `unshare`(1), `nsenter`(1)).

Mit Stand Debian 11 Bullseye (2021) nutzt Debian die Funktionalität "unified cgroup hierarchy" (a.k.a. cgroups-v2).

Anwendungsbeispiele für Namespaces mit cgroups, die die Isolation von Prozessen sowie die Zugriffskontrolle ermöglichen, sind:

- Systemd. Siehe Abschnitt 3.3.1, „Systemd-Init“.

- Sandbox-Umgebungen. Näheres dazu in Abschnitt 7.7, „Sandbox“.

- Linux-Container wie Docker oder LXC. Lesen Sie hierzu Abschnitt 9.11, „Virtualisierte Systeme“.

Diese Funktionalitäten können nicht über das Konzept in Abschnitt 4.1, „Normale Unix-Authentifizierung“ realisiert werden! Solche fortgeschrittenen Themen sind allerdings nicht Thema dieses einführenden Dokuments.

Kapitel 3. Die Systeminitialisierung |  | Kapitel 5. Netzwerkkonfiguration