Původní dokument pochází z adresy http://fdmech.fd.cvut.cz/nastenka/Linux-seminar/reports/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).
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.
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.
hard
- označí svazek jako pevně připojenýsoft
- označí svazek jako volně připojenýintr
- povolí signálům přerušit volání systému NFSČ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
.
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:
insecure
Povoluje neautorizovaný přístup z tohoto počítače.root_squash
Toto je bezpečnostní
vlastnost, která na zadaných hostitelích zablokuje superuživatelům
speciální přístupová práva. Toho se docílí přesměrováním požadavku z
čísla uid 0 na straně klienta na číslo uid 65 534 (-2) na straně
serveru. Toto číslo uid by mělo být přiřazeno uživateli jménem nobody.no_root_squash
Nebudou se mapovat požadavky od uživatele, který má uid rovno 0. Tato volba je implicitně zapnutá.ro
Hierarchie souborového systému se připojí v režimu pouze pro čtení. Tato volba je implicitně zapnutá.rw
Hierarchie souborového systému se připojí v režimu pro zápis i čtení.map_identity
Volba map_identity říká
serveru, aby předpokládal, že klient používá stejná čísla uid a gid
jako server. Tato volba je implicitně zapnutá.map_daemon
Tato volba sdělí serveru
NFS, aby předpokládal, že klient a server nesdílí společný prostor s
čísly uid/gid. Potom démon nfsd vytvoří seznam mapující čísla id mezi
klientem a serverem. Ty získá tak, že se bude na straně klienta
dotazovat démona ugidd.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.
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,...)
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ě.
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ů.
Je dobré použít volbu root-squash
v exports
.
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 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.
Návrat na hlavní stránku Prostředky informačních technologií