NFS - Síťový souborový systém

PIT

Počítačové sítě

Různé

Zuzana Machackova 2001-12-11

Původní dokument pochází z adresy http://fdmech.fd.cvut.cz/nastenka/Linux-seminar/reports/NFS/

Co je NFS

NFS (Network file system) je systém umožňující přístup k souborům na vzdálených hostitelích. Využívá k tomu balík RPC. Balík RPC neboli Vzdálené volání procedur (Remote Procedure Call) poskytuje velmi obecný mechanismus pro aplikace typu klient-server. Balík RPC vyvinula firma Sun Microsystems a v podstatě se jedná o sbírku nástrojů a knihoven funkcí.

Přístup k souborům na vzdálených hostitelích, je uskutečňován zcela stejným způsobem jako přístup uživatele k místním souborům. Toto chování je možné díky kombinaci funkce jádra operačního systému na straně klienta (který používá vzdálený souborový systém) a serveru NFS na straně serveru (který poskytuje souborová data).

Kód systému NFS napsal pro jádro operačního systému Rick Sladkey, server NFS byl odvozen se serveru unfsd (uživatelský server NFS) (napsal Mark Shand) a serveru hnfs (Harrisův server NFS) (Donald Becker).

Používání systému NFS na straně klienta

Klient žádá o připojení adresáře ze vzdáleného hostitele ke svému místnímu adresáři stejným způsobem, jako při připojování fyzického zařízení, jen k tomu používá rozdílnou syntaxi. Chcete-li třeba připojit adresář /home z hostitele skola k adresáři /users na hostiteli ucebny, měl by správce na hostiteli ucebny spustit následující příkaz:

# mount -t nfs skola:/home /users

Příkaz mount se pokusí spojit pomocí procedur RPC s připojovacím démonem mountd, který běží na hostiteli skola. Server zkontroluje, zda má hostitel ucebny povoleno příslušné připojení, a pokud ano, vrátí mu souborový klíč. Tento souborový klíč bude použit ve všech následujících souborových požadavcích pod adresářem /users.

Při přístupu k souboru pomocí systému NFS spustí jádro systému volání procedury RPC směrem na démona nfsd (démon systému NFS), který se nachází na počítači serveru. Toto volání získá souborový klíč, název souboru, k němuž se má přistupovat, a jako parametry i id uživatele a skupiny, které se vztahují k danému uživateli. Tyto hodnoty slouží k určení přístupových práv k zadanému souboru. Aby se zabránilo neautorizovaným uživatelům ve čtení nebo úpravě souborů, musí být id uživatele a skupiny na obou hostitelích totožná.

Před použitím systému NFS, ať už jako klienta nebo jako serveru, je třeba se ujistit, že jádro operačního systému má zkompilovanou podporu pro systém NFS. Toto je zobrazeno v souboru /proc/filesystems, který lze zobrazit příkazem cat:

$ cat /proc/filesystems

Pokud v tomto seznamu chybí souborový systém nfs, pak je nutné zkompilovat vlastní jádro operačního systému s podporou systému NFS.

Připojení svazku

Svazky systému NFS se připojují podobně, jako běžné souborové systémy. Spustíte příkaz mount, který bude mít následující syntaxi:

# mount -t nfs nfs_volume local_dir options

Svazek nfs_volume je předán ve tvaru remote_host:remote_dir (vzdálený_hostitel:vzdálený_adresář). Protože je tento zápis jedinečný pro systémy NFS, je možné vynechat volbu -t nfs.

Lze použít také spoustu doplňkových voleb, které mohou být uvedeny buď na příkazové řádce nebo v příslušné položce voleb v souboru /etc/fstab. Volby na příkazové řádce pak potlačí volby v souboru fstab. Úplný seznam voleb lze nalézt v manuálu nfs.

Jsou to např.: timeo=n - tato volba nastaví čas v desetinách sekundy, po který bude klient čekat na splnění jeho požadavku. Implicitní hodnota je 0,7 sekundy.

Čas timeout udává dobu, za kterou se má operace uskutečnit. Pokud se tak nestane, opakuje se s dvojnásobnou dobou. To se opakuje až do překročení doby 60 s, pak klient vypíše na konzoli zprávu a celý proces se opakuje ovšem s počátečním časem rovným dvojnásobku předcházejícího. Tohle platí pro pevně připojené svazky, volně připojené svazky při překročení 60 s vygenerují pro daný volaný proces chybu.

Pro zjištění, které adresáře jsou připojeny kterým hostitelem slouží program showmount.

Konfigurace systému NFS na straně serveru

Volby, které konfigurují chování na straně serveru musí být nastaveny v souboru /etc/exports.

Démon mountd implicitně nepovolí žádnému uživateli připojení adresářů z místního hostitele.

Chceme-li jednomu nebo více hostitelům povolit připojení adresáře pomocí systému NFS, musí být tento adresář exportován, což znamená, že musí být uveden v souboru exports.

Vzorový soubor exports by mohl vypadat následovně:

/home vale(rw) vstout(rw) vlight(rw)
/usr/X386 vale(ro) vstout(ro) vlight(ro)
/usr/TeX vale(ro) vstout(ro) vlight(ro)
/ vale(rw,no root squash)
/home/ftp (ro)

Každá řádka definuje adresář a hostitele, kteří si ho mohou připojit. Název hostitele je obvykle plně kvalifikovaným doménovým jménem, ale kromě toho může obsahovat i zástupné znaky* a ?.

Pokud není zadán žádný název hostitele, jako tomu bylo ve výše uvedeném příkladu s adresářem /home/ftp, potom si budou moci tento adresář připojit všichni uživatelé.

Při ověřování klienta pomocí souboru exports vyhledá démon mountd název hostitele klienta pomocí volání procedury gethostbyaddr.

Za názvem hostitele může následovat volitelný seznam příznaků oddělených čárkami a uzavřených do kulatých závorek.

Tyto příznaky mohou nabývat následujících hodnot:

Automatické připojování

Démon automatického připojování (automounter) je démon, který podle potřeby automaticky připojuje a odpojuje svazky systému NFS.

To je výhodné použít buď z důvodu pouhého množství připojovaných svazků, nebo z důvodu časové prodlevy, kterou by si tento proces vyžádal při zavádění systému.

Výhody systému NFS

Data mohou být uchovávána na centrálním hostiteli a klienti si tento adresář připojí při zavádění systému. (Např. všechny účty hostitelů, soubory zabírající velké množství prostoru jako např. balíky programu LaTeX, administrativní data,...)

Zabezpečení

Základní problém tkví v tom, že klient bude věřit NFS-serveru a obráceně. To znamená, že pokud je narušen rootovský účet serveru, není už takový problém narušit i rootovské účty na klientech a opačně.

Zabezpečení klienta

Pokud serveru zcela nedůvěřujeme, máme několik možností pro mount. Můžeme např. pomocí volby nosuid zakázat práci programů suid mimo NFS systém. To znamená, že root na serveru nemůže v systému souborů vytvořit rootovský suid program a stát se tak rootem i na klientu. Pomocí volby noexec je také možné na připojeném systému souborů zakázat spouštění souborů.

Zabezpečení serveru

Je dobré použít volbu root-squashexports. Pokud se pak uživatel s UID 0 na klientovi pokusí přistoupit na systém souborů, server jeho UID nahradí UID účtu nobody ze serveru.

Pokud ale root klienta použije volbu su, může uživatelské soubory použít.

Nejbezpečnější tedy je, když všechny důležité soubory vlastní root a ne nějaký jiný účet, protože na účet root serveru se root z klienta nedostane.

Také je nutné zajistit, aby nfsd kontroloval, že všechny jeho žádosti přicházejí z privilegovaného portu. Linux nfsd provádí tuto kontrolu automaticky.

Portmapper

Portmapper se stará o nfsd, mountd, ypbind/ypserv, pcnfsd,

Přístup k portmapperu by měly mít pouze ty stroje, které ho potřebují. Toho dosáhneme editací souboru /etc/hosts.deny kde řádek portmap: ALL zakáže přístup všem a souboru /etc/hosts.allow, kde povolíme přístup jen určitým ip adresám.

Popis souborů hosts.deny a hosts.allow nalezneme v příslušných manuálových stránkách.

Literatura:

  1. Linux, dokumentační projekt (http://www.nuc.elf.stuba.sk/lit/ldp/index.htm)
  2. Matt Welsh, Lar Kaufman: Používáme Linux, Computer Press, 1997

Návrat na hlavní stránku Prostředky informačních technologií