Product SiteDocumentation Site

11.4. NFS-Dateiserver

NFS (Network File System) ist ein Protokoll, das den Fernzugriff auf ein Dateisystem über ein Netzwerk ermöglicht. Alle Unix-Systeme sind in der Lage, mit diesem Protokoll umzugehen; wenn Windows-Systeme beteiligt sind, muss stattdessen Samba eingesetzt werden.
NFS ist ein sehr nützliches Instrument, aber man darf seine Unzulänglichkeiten nicht außer Acht lassen, insbesondere wo es um Sicherheitsangelegenheiten geht: alle Daten laufen im Klartext über das Netzwerk (ein Sniffer kann sie abfangen); der Server verhängt Zugangsbeschränkungen aufgrund der IP-Adresse eines Benutzers (die vorgetäuscht sein kann); und schließlich kann, wenn einem Client-Rechner Zugriff auf eine falsch konfigurierte NFS-Freigabe gewährt wird, der Root-Benutzer des Clients auf alle Dateien dieser Freigabe zugreifen (selbst auf die, die anderen Benutzern gehören), da der Server dem Benutzernamen vertraut, den er vom Client erhält (dies ist ein historisches Handicap des Protokolls).

11.4.1. NFS absichern

Da NFS der Information vertraut, die es vom Netzwerk erhält, muss unbedingt sichergestellt sein, dass sich nur die Rechner, die es benutzen dürfen, mit den verschiedenen erforderlichen RPC-Servern verbinden können. Die Firewall muss außerdem IP spoofing blockieren, um so einen externen Rechner daran zu hindern, sich als interner auszugeben, und der Zugang zu den passenden Ports muss auf die Rechner beschränkt bleiben, die Zugriff auf die NFS-Freigaben haben sollen.
Weitere RPC-Dienste können erforderlich sein, damit NFS optimal funktioniert, einschließlich rpc.mountd, rpc.statd und lockd. Jedoch verwenden diese Dienste standardmäßig zufällige Ports (vom portmapper zugewiesen), wodurch es schwierig ist, Datenverkehr, der diese Dienste zum Ziel hat, zu filtern. Die Falcot Corp. Administratoren haben die unten beschriebene Problemumgehung gefunden.
Die beiden ersten der oben genannten Dienste werden durch Programme auf Anwendungsebene umgesetzt, gestartet durch /etc/init.d/nfs-kernel-server beziehungsweise /etc/init.d/nfs-common. Sie stellen Konfigurationsoptionen zur festen Einstellung bestimmter Ports bereit; die Dateien, die zur Festlegung dieser Optionen geändert werden müssen, sind /etc/default/nfs-kernel-server und /etc/default/nfs-common.

Beispiel 11.22. Die Datei /etc/default/nfs-kernel-server

# Number of servers to start up
RPCNFSDCOUNT=8

# Runtime priority of server (see nice(1))
RPCNFSDPRIORITY=0

# Options for rpc.mountd.
# If you have a port-based firewall, you might want to set up
# a fixed port here using the --port option. For more information, 
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here
RPCMOUNTDOPTS="--manage-gids --port 2048"

# Do you want to start the svcgssd daemon? It is only required for Kerberos
# exports. Valid alternatives are "yes" and "no"; the default is "no".
NEED_SVCGSSD=

# Options for rpc.svcgssd.
RPCSVCGSSDOPTS=

Beispiel 11.23. Die Datei /etc/default/nfs-common

# If you do not set values for the NEED_ options, they will be attempted
# autodetected; this should be sufficient for most people. Valid alternatives
# for the NEED_ options are "yes" and "no".

# Do you want to start the statd daemon? It is not needed for NFSv4.
NEED_STATD=

# Options for rpc.statd.
#   Should rpc.statd listen on a specific port? This is especially useful
#   when you have a port-based firewall. To use a fixed port, set this
#   this variable to a statd argument like: "--port 4000 --outgoing-port 4001".
#   For more information, see rpc.statd(8) or http://wiki.debian.org/SecuringNFS
STATDOPTS="--port 2046 --outgoing-port 2047"

# Do you want to start the idmapd daemon? It is only needed for NFSv4.
NEED_IDMAPD=

# Do you want to start the gssd daemon? It is required for Kerberos mounts.
NEED_GSSD=

Sobald diese Veränderungen vorgenommen und die Dienste neu gestartet sind, verwendet rpc.mountd Port 2048; rpc.statd wartet an Port 2046 auf Anfragen und benutzt Port 2047 für ausgehende Verbindungen.
Der Dienst lockd wird durch einen Kernel-Thread (einen leichtgewichtigen Prozess) gehandhabt; dieses Leistungsmerkmal ist als Modul in Debian-Kernel eingebaut. Das Modul bietet zwei Optionen, um die dauerhafte Einstellung desselben Ports zu ermöglichen, nlm_udpport und nlm_tcpport. Damit diese Optionen konsequent benutzt werden, muss eine Datei namens /etc/modprobe.d/lockd wie die folgende vorhanden sein:

Beispiel 11.24. Die Datei /etc/modprobe.d/lockd

options lockd nlm_udpport=2045 nlm_tcpport=2045

Sobald diese Parameter eingestellt sind, wird es einfacher, von der Firewall aus den Zugang zum NFS-Dienst in fein eingestellter Weise durch das Filtern des Zugangs zu den Ports 111 und 2045 bis 2049 (sowohl UDP als auch TCP) zu kontrollieren.

11.4.2. NFS-Server

Der NFS-Server ist Teil des Linux-Kernels; in den von Debian bereitgestellten Kerneln ist er als Kernel-Modul eingebaut. Falls der NFS-Server beim Hochfahren automatisch anlaufen soll, sollte das Paket nfs-kernel-server installiert werden; es enthält die entsprechenden Start-Skripten.
Die Konfigurationsdatei des NFS-Servers, /etc/exports, listet die Verzeichnisse auf, die über das Netzwerk zur Verfügung gestellt werden (exported). Zu jeder NFS-Freigabe wird nur den Rechnern Zugang gewährt, die auf dieser Liste stehen. Eine feiner eingestellte Zugangskontrolle kann durch einige Optionen erzielt werden. Die Syntax dieser Datei ist recht einfach:
/freizugebendes/verzeichnis rechner1(option1,option2,...) rechner2(...) ...
Jeder Rechner kann entweder durch seinen DNS-Namen oder seine IP-Adresse bestimmt werden. Ganze Rechnergruppen können auch festgelegt werden, indem entweder eine Syntax wie *.falcot.com oder ein IP-Adressbereich wie 192.168.0.0/255.255.255.0 oder 192.168.0.0/24 verwendet wird.
Verzeichnisse werden in der Standardeinstellung (oder durch die Option ro) schreibgeschützt bereitgestellt. Die Option rw ermöglicht Schreibzugriff. NFS-Clients nehmen typischerweise über einen Port Verbindung auf, der Administratorrechte erfordert (mit anderen Worten, unterhalb von 1024); diese Einschränkung kann mit der Option insecure aufgehoben werden (die Option secure ist stillschweigend eingestellt, kann aber auch ausdrücklich angegeben werden, wenn dies der Deutlichkeit halber erforderlich ist).
Standardmäßig beantwortet der Server eine NFS-Anfrage nur dann, wenn der gegenwärtige Plattenzugriff beendet ist (Option sync); dies kann durch die Option async abgestellt werden. Asynchrones Schreiben erhöht die Leistung ein wenig, es verringert jedoch die Zuverlässigkeit, da die Gefahr eines Datenverlusts besteht, falls der Server zwischen der Annahmebestätigung des Schreibauftrags und dem tatsächlichen Schreibvorgang auf der Festplatte abstürzt. Da der voreingestellte Wert (im Vergleich zur früheren Einstellung von NFS) kürzlich geändert wurde, empfiehlt es sich, ihn ausdrücklich einzustellen.
Um einem NFS-Client keinen Root-Zugriff auf das Dateisystem zu geben, werden alle Anfragen, die von einem Root-Benutzer zu kommen scheinen, vom Server so angesehen, als kämen sie vom Benutzer nobody. Dieses Verhalten entspricht der Option root_squash und ist standardmäßig aktiviert. Die Option no_root_squash, die dieses Verhalten abstellt, ist gefährlich und sollte nur in überwachten Umgebungen eingesetzt werden. Die Optionen anonuid=uid und anongid=gid ermöglichen es, anstelle von UID/GID 65534 (was dem User nobody und der Gruppe nogroup entspricht) einen anderen fingierten Benutzer anzugeben.
Weitere Optionen stehen zur Verfügung; sie sind auf der Handbuchseite exports(5) dokumentiert.

11.4.3. NFS-Client

Wie bei anderen Dateisystemen, so erfordert auch das Einbinden einer NFS-Freigabe in die Systemhierarchie, dass sie eingehängt wird. Da dieses Dateisystem seine Besonderheiten hat, waren einige Anpassungen in den Syntaxen des Befehls mount und der Datei /etc/fstab erforderlich.

Beispiel 11.25. Manuelles Einhängen mit dem Befehl mount

# mount -t nfs -o rw,nosuid arrakis.internal.falcot.com:/srv/shared /shared

Beispiel 11.26. NFS-Eintrag in der Datei /etc/fstab

arrakis.internal.falcot.com:/srv/shared /shared nfs rw,nosuid 0 0

Der oben dargestellte Eintrag hängt beim Hochfahren des Systems das NFS-Verzeichnis /srv/shared/ des Servers arrakis in das lokale Verzeichnis /shared/ ein. Schreibzugriff ist erwünscht (daher der Parameter rw). Die Option nosuid ist eine Schutzmaßnahme, die jegliches setuid- oder setgid-Bit von Programmen, die auf der Freigabe gespeichert sind, entfernt. Falls die NFS-Freigabe nur zum Speichern von Dokumenten dienen soll, ist noexec eine weitere empfehlenswerte Option, die das Ausführen von auf der Freigabe gespeicherten Programmen verhindert.
Die Handbuchseite nfs(5) beschreibt alle Optionen näher.