NFS-Server

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. ⚓︎ Serverdienste

  2. ⚓︎ NFS

  3. ⚓︎ Installation von Programmen

  4. ⚓︎ Starten von Programmen

  5. ⚓︎ Ein Terminal öffnen

  6. ⚓︎ mit Root-Rechten arbeiten

Dieser Artikel ist Teil der Artikelserie über NFS. NFS steht für Network File System und dies ist ein bei Linux und anderen Arten von Unix gebräuchliches Protokoll für den Austausch von Dateien über das Netzwerk. Für technische Details und Grundlagen siehe die Übersichten[1][2].

Inhaltsverzeichnis
  1. Installation
  2. Konfiguration
    1. Eigenschaften des Servers
    2. Freigaben
      1. Rechner spezifizieren
      2. Optionsliste
  3. Sicherheit
    1. Daten-Integrität
    2. Vertraulichkeit
    3. Zugriffsschutz
    4. Checkliste
  4. Links

Dieser Artikel behandelt Themen, die ein Verwalter eines NFS-Servers kennen, beachten und bei der Konfiguration seines Servers beachten sollte, damit der Spitzname von NFS als "Nightmare File System" nicht ein weiteres Mal Realität wird.

Installation

Siehe Artikel: ▶ NFS

Konfiguration

Die Konfiguration erfolgt über einfache Textdateien in den Ordnern /etc/, /etc/nfs.conf.d/ und /etc/exports.d/. Die Konfigurationsdateien können mit einem Editor mit Root-Rechten[6] bearbeitet werden. Alle Konfigurationsdateien müssen root als Eigentümer und Gruppe gehören und die Dateiberechtigungen 0644 haben bzw. 0755 für die genannten Ordner.

Jede Zeile muss mit einem Zeilenumbruch (ASCII 10) enden. Um das sicherzustellen, sollte man jede Konfigurationsdatei mit einer Leerzeile oder einem Kommentar beenden.

Die zulässigen Inhalte und weitere Details kann man den Manpages oder den auszugsweise den hier folgenden Abschnitten entnehmen:

man nfs.conf 
man exports 

Nach jeder Änderung der Konfiguration die Freigaben aktualisieren und den NFS-Server neu starten[4][5][6]:

sudo exportfs -alr 
systemctl restart nfs-server.service 

Eigenschaften des Servers

Die Konfiguration eines NFS-Servers – ausgenommen die Freigaben – erfolgt über mehrere Dateien:

Diese Konfigurationsdateien sind im bekannten INI-Format strukurierte Textdateien. Zulässige Zeilen sind:

Die aktuelle Konfiguration kann man sich bequem anzeigen lassen:

nfsconf --dump 

Beispielausgabe:

[general]
 pipefs-directory = /run/rpc_pipefs

[mountd]
 manage-gids = y

Freigaben

Die Freigaben ("exports") definiert man in folgenden Dateien:

In Konfigurationsdateien für Freigaben zulässig sind Kommentarzeilen, Leerzeilen und Datenzeilen. Jede Datenzeile besteht aus mindestens zwei Feldern, die durch Whitespace (Leerzeichen und/oder Tabulator) voneinander getrennt sind; innerhalb eines Feldes ist Whitespace unzulässig:

Beispiel für eine Konfigurationsdatei für Freigaben:

/srv/nfs	-rw,subtree_check,insecure	FD00::/8    *.fritz.box
/home		-no_subtree_check,insecure      fd00::/8    *.fritz.box(mp)

Dieses Beispiel illustriert auch die mit Bindestrich eingeleitete Definition gemeinsamer Optionen für alle Rechnerspezifikationen.

Rechner spezifizieren

Die zum Zugriff berechtigten Rechner (Client) kann man mit folgenden Methoden angeben:

  • Rechnername, beispielsweise: tusnelda

  • DNS-Name, beispielsweise: tusnelda.fritz.box oder tusnelda.local oder tusnelda.example.com

  • DNS-Name mit Jokerzeichen *, beispielsweise: *.fritz.box oder *.local oder *.example.com

Voraussetzung für die Funktion vorstehender Methoden: Der Server muss die IP-Adresse aus der Anfrage zurück in einen DNS-Namen übersetzen können (dazu benötigt man PTR-Records im DNS-Server) und so ermittelten Namen müssen der Spezifikation entsprechen. Während des Hochlaufs des Rechners funktioniert manchmal die Namensauflösung noch nicht. Wenn man bereits in dieser frühen Phase den NFS-Server starten möchte, verwendet man daher besser IP-Adressen zur Identifizierung:

  • IPv4-Adresse

  • IPv6-Adresse: Diese dürfen nicht in eckigen Klammern [] stehen.

  • Adressbereiche, also IP-Adresse mit Netzmaske, beispielsweise: 10.0.0.0/255.240.0.0 oder 192.168.0.0/16 oder fd00::/8

Der Client erhält Zugriff, wenn er eine IP-Adresse aus den genannten Bereichen benutzt.

Weitere Methoden:

  • Eine Netzgruppe (netgroup), die man in der Datei /etc/netgroup spezifiziert hat. Es wird aus den Tripeln jeweils nur die erste Komponente ausgewertet.

  • Das Zeichen *: Damit erlaubt man weltweit jedem Rechner den Zugriff. Effektiv schalten man damit die Prüfung ab, ob ein Rechner zum Zugriff berechtigt ist.

  • Das Zeichen - (Bindestrich), gefolgt von einer (nicht in Klammern stehenden!) Liste von Optionen: Damit selektiert man zunächst keinen zum Zugriff berechtigten Rechner, sondern Vorgaben für die darauf folgenden Rechner.

Optionsliste

Dies ist eine mit Kommata getrennte Liste von Optionen aus folgender Tabelle 1. Man muss die Liste in runde Klammern () setzen und ohne trennendes Leerzeichen an die Spezifikation des Rechners anhängen.

Tabelle 1: Ausgewählte Optionen für Freigaben per NFSv4
Option Beschreibung
Vorgabe Alternative
ro rw Normalerweise werden Ordner schreibgeschützt freigegeben. Wenn man Erstellung/Änderung/Löschen von Dateien und Ordnern erlauben möchte, muss man den Schutz mit rw ausschalten; dann gelten für tatsächliches Schreiben die jeweiligen Dateirechte von Unix sowie ggf. die aus POSIX- und NFSv4-ACLs.
sync async Mit der Vorgabe sync (ab Version 1.0.0) beantwortet der Server die Anfrage eines Clients erst nachdem alle damit verbundenen Änderungen auch tatsächlich gespeichert wurden. Dieses sichere Verhalten kann man mit async abschalten und damit die Performance von Schreibvorgängen auf Kosten der Sicherheit steigern. So etwas sollte man natürlich nur bei unwichtigen Daten erlauben.
secure insecure Die Vorgabe secure bedeutet, dass der Client einen privilegierten Port (d.h. in der Regel einen unter 1024) benutzen muss. Das kann man man mit insecure ausschalten. Der Name dieser Option kann in die Irre führen, tatsächlich wird ein NFS-Server in der Praxis durch Verwendung von insecure nicht unsicherer, als er es ohnehin schon ist.
no_subtree_check subtree_check Schaltet den sog. "subtree check" aus oder ein. Abhängig von der konkreten Nutzung der Freigabe kann beides gut oder schlecht sein. Konsultiere die Manpage für weitere Details. Vorgabe ist no_subtree_check ab Version 1.0.0, man muss aber eine der beiden Möglichkeiten explizit angeben, um nervige Fehlermeldungen zu vermeiden.
root_squash no_root_squash Normalerweise wird jede von einem Benutzer mit UID=0 stammende Anfrage so umgesetzt, als wenn sie von einem Benutzer mit der über anonuid spezifizierten UID und mit anongid spezifizierten GID stammen würde. Also ein root auf dem Client wird zu einem nobody auf dem Server und hat somit keine Sonderrechte auf dem Server. Man kann dieses Sicherheitsfeature ("root squashing") mit no_root_squash abschalten, was in den allermeisten Fällen eine sehr schlechte Idee ist.
no_all_squash all_squash Normalerweise wird eine von einem Benutzer mit UID≠0 stammende Anfrage nicht umgesetzt, d.h. jeder Benutzer agiert auf dem Server mit derselben UID und GID wie auf dem anfragendem Rechner. Dies ist nur dann sinnvoll, wenn auf beiden Rechnern die numerische UID auch dieselbe Person bzw. GID dieselbe Benutzergruppe identifiziert; dies trifft in der Regel ohne besondere Maßnahmen meist nicht zu. Mit der Option all_sqash kann man eine Umsetzung auf die mit anonuid bzw. anongid angegebene UID bzw. GID erzwingen.
anonuid=65534 anonuid=GANZZAHL Definition der Zielperson bei Squash. 0 ≤ GANZZAHL < 232
anongid=65534 anongid=GANZZAHL Definition der Zielgruppe bei Squash. 0 ≤ GANZZAHL < 232
sec=sys sec=krb5p:krb5i:krb5:sys Auswahl der Sicherheitsstufe(n): Der Wert der Option ist eine mit Doppelpunkten getrennte Liste von Sicherheitsstufen. Die Option kann mehrmals angegeben werden und man kann für jede Sicherheitsstufe danach unterschiedliche Werte für ro/rw, root_squash und all_squash angeben. Details siehe Manpage und nachfolgende Diskussion im Kapitel Sicherheit.
wdelay no_wdelay Diese Optionen kann man zwar bei einem NFSv4-Server definieren, sie sind aber hier entweder wirkungslos oder von geringem Nutzen. Details siehe Manpage.
hide nohide
nocrossmnt crossmnt
nordirplus
auth_nlm
secure_locks
no_auth_nlm
no_secure_locks
Normalerweise verlangt ein moderner NFS-Server bei der Anforderung einer Dateisperre eine Authentifizierung des Clients. Früher war das nicht erforderlich und es gibt noch viele Clients, die das nicht beherrschen, daher kann man es beim Server abschalten. Besser als dieser Notbehelf ist natürlich Verwendung eines modernen Clients.
mountpoint
mp
mountpoint=PFAD
mp=PFAD
Der freizugebende Ordner wird nur dann exportiert, wenn er auch ein Einbindepunkt ist bzw. wenn genau das angegebene Dateisystem hier eingebunden wurde. Details siehe nachfolgende Diskussion im Kapitel Sicherheit.

Weitere Optionen: fsid, refer, replicas, pnfs, security_label

Sicherheit

NFS ist unsicher, außer man tut etwas dagegen. Als ersten Schritt sollte man sich über die Nachteile von NFS informieren, und dabei will dieser Artikel unterstützen.

Daten-Integrität

Die Manpage nfs erläutert, dass beim Austausch von Dateien bei Verwendung des Protokollstacks

es zwangsläufig zu Fragmentierung der Pakete auf der Ebene IP kommt, und wegen der großen Anzahl der in kurzer Zeit übertragbaren Fragmente der Zähler für Fragmente überläuft, und damit kommt es zwangsläufig zum falschen Zusammenbau der Pakete auf Empfängerseite. Die übertragenen Dateien werden also beschädigt. Außerdem verringert natürlich die Fragmentierung die Performance.

Gegenmaßnahmen:

Vertraulichkeit

Das Protokoll NFS, auch NFSv4, überträgt Daten standardmäßig im Klartext und bietet damit keinerlei Schutz gegen Abhören. Vertrauliche Informationen sollte man daher nur dann per NFS übertragen, wenn das Netzwerk auf andere Weise (z.B. VPN) gegen Abhören gesichert wurde und Unbefugte keinen Zugang zum Netzwerk haben. Der letzte Punkt lässt sich bei Verwendung eines WLANs nicht realisieren.

⚓︎ NFSv4 bietet aber Möglichkeiten, durch zusätzlichen Aufwand die Vertraulichkeit zu verbessern. Die Standardmethode hierzu ist die Verwendung eines separaten Kerberos-Servers zur Identifizierung und Authentifizierung und Bereitstellung einer Infrastruktur zur Verschlüsselung des Datenverkehrs. ▶ NFS mit Kerberos sichern

⚓︎ Einrichtung und kompetenter Betrieb eines Kerberos-Servers ist allerdings eine herausfordernde Aufgabe, die in der Regel Privatanwender und kleine Unternehmen überfordern kann. Eine einfach einzurichtende Alternative kann sein, den NFSv4-Verkehr über SSH zu tunneln. Erst bei NFSv4 ist wegen dessen Beschränkung auf einen Port diese Technik einfach zu nutzen, obwohl sie auch früher schon möglich war. ▶ Howto/NFSv4 mit SSH sichern

Zugriffsschutz

Das Protokoll NFS, auch NFSv4, bietet selber keinen heutigen Ansprüchen entsprechenden Schutz vor dem Zugriff durch Unbefugte:

Diese Angriffe erfordern entsprechende technische Kenntnisse und Mittel, die zwar nicht jedem zur Verfügung stehen, aber es gilt als sicher, dass kriminelle Hacker und in staatlichem Auftrag handelnde Angreifer darüber verfügen.

Wegen der leichten Fälschbarkeit von Benutzer-Kennungen hat ein Angreifer, der bereits regulären Zugriff auf eine Freigabe hat, damit auch Zugriff auf jeden Ordner und jede Datei, die nicht root gehört – und wenn man "root squashing" abgeschaltet hat, dann auch auf diese.

Der Zugriff auf fremde Dateien kann auch unabsichtlich ermöglicht werden, wenn Client und Server UID oder dieselbe GID unterschiedlichen Personen zugeordnet haben.

Schließlich ist bei NFS aus technischen Gründen unmöglich, nur Teile eines Dateisystems freizugeben. Man kann so etwas zwar in den Exports definieren, aber nicht wirksam verhindern, dass ein Benutzer mit Hackern bekannten Techniken aus dem regulär exportierten Bereich ausbrechen und auf nicht exportierte Dateien im betreffenden Dateisystem zugreifen. Dieses unerwünschte Verhalten kann man mit der Option subtree_check etwas abmildern, aber nicht vollständig unterbinden. Aus diesem Grund geben Profis grundsätzlich immer nur vollständige Dateisysteme frei, die sie auf die exportierten Order einbinden ("mounten") und sichern über die Option mountpoint ab, dass die Einbindung auch tatsächlich erfolgreich erfolgte.

Für viele der vorstehend genannten Probleme ist bei NTFSv4 die Verwendung eines zusätzlich Kerberos-Servers die etablierte Standardlösung; für kleine Aufgaben können auch SSH-Tunnel helfen.

Checkliste

Externe Verweise: