Obsah

NFS

CESNET nabízí velké prostory (v řádech stovek TB) pro ukládání dat přístupné přes protokol NFSv4.

Tyto úložné prostory si můžete zpřístupnit i na svém osobním stroji. Tato stránka obsahuje návod jak to udělat na strojích s operačním systémem Linux.

Pro zajištění bezpečnosti dat je vyžadované připojení ověřené přes systém Kerberos. To, v závislosti na použitých přepínačích příkazu mount, umožňuje komunikaci i šifrovat.

Co budete potřebovat

Pro zpřístupnění NFSv4 ze serverů CESNETu poskytujících tyto souborové systémy na svůj Linux desktop budete potřebovat následující věci:

198.51.100.10   mujklient.domena.cz mujklient
DU4 Ostrava nfs.du4.cesnet.cz
DU5 Jihlava nfs.du5.cesnet.cz

Adresář pro připojení svazku

Sdílený prostor je třeba mapovat do nějakého adresáře. Doporučujeme dodržovat konvenci zavedenou v MetaCentru, tj. podadresář v /storage. Vytvořte si tedy prázdný adresář příkazem:

mkdir -p /storage/cesnet-du4

Kerberos lístek umožňující připojení svazku

Pro přípojení (mount) svazku je potřeba získat lístek dostupný pod uživatelem root. Ten lze získat 2 způsoby:

V závislosti na použitém způsobu se pak částečně liší nastavení klientských nástrojů.

Použijete uživatelský lístek s omezenou platností

Pod uživatelem root je potřeba vytvořit lístek pomocí příkazu

kinit user@EINFRA

kde user je vaše přihlašovací jméno. Ověření platnosti lístku je popsáno na vlastní stránce. Nevýhodou tohoto postupu je omezená platnost lístku a tudíž omezená doba připojení svazku, po vypršení lístku na svazek již nelze přistoupit. Maximálně doba připojení svazku pomocí této metody je 8 dní (maximální doba platnosti obnovovatelného lístku).

Tato metoda vyžaduje zadávat heslo a nelze tudíž vytváření lístku automatizovat např. pomocí cronu.

Využijete údaje uložené v keytabu /etc/krb5.keytab

Trvalý keytab pro uživatele a servisní účty lze získat následujícím způsobem:

ssh -o PubkeyAuthentication=no -o GSSAPIAuthentication=no USER@SERVER "remctl kdccesnet.ics.muni.cz accounts nfskeytab" > krb5.keytab

kde USER je vaše jméno (nebo jméno servisního účtu) používané v EINFRA a SERVER zvolíte na základě toho, kam potřebujete přistupovat (např. pro ostravské pole „ssh.du4.cesnet.cz“).

Je nezbytné, aby ssh příkaz byl autentizován heslem a nikoli klíčem či jiným způsobem. Bez zadání hesla nebude remctl příkaz fungovat.

Takto získaný soubor krb5.keytab umístěte do /etc/krb5.keytab.

Pokud již soubor /etc/krb5.keytab existuje, je potřeba provést „merge“ těchto souborů. Postup se liší dle verze Kerberos knihoven a je popsán například tady .

Vlastník souboru by měl být root a práva na čtení či zápis by měl mít pouze root, tedy:

 # ls -l /etc/krb5.keytab 
-rw------- 1 root root 57 Nov  2 09:48 /etc/krb5.keytab
Keytab soubor obsahuje principál ve tvaru nfs/USER@EINFRA a heslo. Komukoliv, kdo tento soubor může přečíst umožňuje vydávat se za takto uložený účet a tudíž připojit si NFS svazek. V některých speciálních případech může být výhodné, aby soubor mohli číst ještě jiné, servisní účty. V tomto případě je výhodnější soubor zkopírovat a kopii dát práva pro čtení a zápis jen pro daný servisní účet. Detailněji je toto popsáno níže.
Jelikož je heslo pro daný účet již uloženo v keytabu, nevyžaduje tato metoda zadávat heslo a lze ji tak použít pro automatické připojování svazků.

Klientské NFS nástroje

Doporučujeme nainstalovat nástroje dostupné z našich repozitářů. Tyto balíky již obsahují patche pro správnou funkci některých vlastností. Debian9 / Ubuntu18.04 (i386/amd64)

apt update
apt install nfs-common libnfsidmap2

Debian6 / Ubuntu12.04 (i386/amd64)

wget ftp://homeproj.cesnet.cz/apt/du/du_squeeze.list -O /etc/apt/sources.list.d/cesnet-du.list
wget ftp://homeproj.cesnet.cz/apt/du/APT-GPG-KEY-du -O - | apt-key add -
apt-get update
apt-get install nfs-common libnfsidmap2

Debian8 (i386/amd64)

wget ftp://homeproj.cesnet.cz/apt/du/du_jessie.list -O /etc/apt/sources.list.d/cesnet-du.list
wget ftp://homeproj.cesnet.cz/apt/du/APT-GPG-KEY-du -O - | apt-key add -
apt-get update
apt-get install nfs-common libnfsidmap2 libnfsidmap-dev

openSUSE12 (pouze x86_64)

zypper addrepo ftp://homeproj.cesnet.cz/rpm/du-opensuse/stable/x86_64/
zypper install --no-recommends nfs-client libnfsidmap

CentOS6 (pouze x86_64)

wget https://du.cesnet.cz/_media/cs/navody/nfs/cesnet-du.repo -O /etc/yum.repos.d/cesnet-du.repo
yum install nfs-utils nfs-utils-lib


Pro jiné OS doporučujeme mít nainstalován nfs-utils verze 1.1.0 a vyšší.

Zároveň budete potřebovat běžící rpcbind nebo ve starších distribucích portmap. Měl by se nainstalovat v závislostech na nfs-utils. V opačném případě jde o stejnojmenný balíček (tj. portmap, rpcbind).

Nastavení nfs-utils pro NFSv4

Po úpravě konfigurace je nutné dané služby NFS restartovat.
V případě, že připojujete NFS pomocí obyčejného lístku, je nutné před startem dané služby NFS (nfs-common na Debian, Ubuntu verze nižší než 12.04, service gssd Ubuntu 12.04 a novější) mít získaný lístek pod uživatelem root.

Po správném nastavení nfs-utils by již mělo být možné připojit svazek pod uživatelem root. Stále je však nutné provést další kroky.

Použiváte uživatelský lístek s omezenou platností

Debian/Ubuntu

Nastavení nfs-utils je v souboru /etc/default/nfs-common. Nastavíme hodnoty následovně:

NEED_STATD=yes
STATDOPTS=
NEED_IDMAPD=yes
NEED_GSSD=yes

Dále je potřeba v /etc/default/nfs-common přidat řádek (pro Debian a Ubuntu verze nižší než 12.04):

RPCGSSDOPTS="-n"

Pro Ubuntu 12.04 - 16.04 je změna v /etc/init/gssd.conf: Původní řádek tvaru:

exec rpc.gssd

nahraďte řádkem:

exec rpc.gssd -n  

Po těchto změnách je nutno službu restartovat, běžela-li již (nfs-common/service gssd).

openSUSE

Nastavení nfs-utils je v souboru /etc/sysconfig/nfs. Nastavíme alespoň tyto hodnoty:

NFS_SECURITY_GSS="yes"
NFS4_SUPPORT="yes"  
RPCGSSDARGS="-n"
Fedora

Nastavení nfs-utils je v souboru /etc/nfs.conf. Nastavíme alespoň tyto hodnoty:

SECURE_NFS="yes"  
RPCGSSDARGS="-n"
CentOS 6

Nastavení nfs-utils je v souboru /etc/sysconfig/nfs. Nastavíme alespoň tyto hodnoty:

SECURE_NFS="yes"  
RPCGSSDARGS="-n"
CentOS 8 (Stream)

Vytvoříme soubor pro nastavení nfs-utils /etc/sysconfig/nfs. Nastavíme alespoň tyto hodnoty:

SECURE_NFS="yes"  
RPCGSSDARGS="-n"

Využijete údaje uložené v keytabu ''/etc/krb5.keytab''

Debian/Ubuntu

Nastavení nfs-utils je v souboru /etc/default/nfs-common. Nastavíme hodnoty následovně:

NEED_STATD=yes
STATDOPTS=
NEED_IDMAPD=yes
NEED_GSSD=yes      
openSUSE

Nastavení nfs-utils je v souboru /etc/sysconfig/nfs. Nastavíme alespoň tyto hodnoty:

NFS_SECURITY_GSS="yes"
NFS4_SUPPORT="yes"
Fedora

Nastavení nfs-utils je v souboru /etc/sysconfig/nfs. Nastavíme alespoň tuto hodnotu:

SECURE_NFS="yes"
CentOS 6

Nastavení nfs-utils je v souboru /etc/sysconfig/nfs. Nastavíme alespoň tuto hodnotu:

SECURE_NFS="yes"
CentOS 8 (Stream)

Vytvoříme soubor pro nastavení nfs-utils /etc/sysconfig/nfs. Nastavíme alespoň tyto hodnoty:

SECURE_NFS="yes"  

Kerberos lístek pro přístup k datům

Uživatel root k přístupu na svazek nepotřebuje speciální lístek, stačí lístek pro příjení či keytab ''/etc/krb5.keytab''

Postup pomocí uživatelských lístků s nutností zadávat heslo

Pro přístup na připojený svazek pod jiným uživatelem než root je nutné získat uživatelský lístek pod identitou lokálního uživatele. To lze pomocí příkazu kinit.

$localuser@localhost > kinit USER@EINFRA
Password for USER@EINFRA: 

kde USER je Vaše jméno v EINFRA.

Vypsat platnost lístku lze následovně:

$localuser@localhost > klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: USER@EINFRA

Valid starting    Expires           Service principal
27/06/2012 13:52  28/06/2012 13:52  krbtgt/EINFRA@EINFRA
$USER@localhost >
Přístup pod tímto uživatelem do připojeného svazku je možný pouze po dobu platnosti lístku. Poté je nutné lístek získat znovu.

Postup pomocí keytabu bez nutností zadávat heslo

V některých speciálních případech (typicky pro zálohování) může být výhodné, aby speciální (servisní) uživatel mohl přistupovat k svazku bez nutnosti získávat lístek s nutností zadávat heslo. Toho lze docílit získáním uživatelského lístku z keytab souboru používaném pro přípojení svazku. V následujícím postupu budeme předpokládat, že jméno lokálního servisního uživatele je bacula.

Nejdříve zkopírujeme soubor /etc/krb5.keytab, který by měl být přístupný jen pro uživatele root do jiné lokace a nastavíme práva tak, aby uživatel bacula měl k souboru přístup:

root@localhost > cp /etc/krb5.keytab /etc/krb5.keytab.bacula
root@localhost > chown bacula:bacula /etc/krb5.keytab.bacula

Z tohoto souboru pak lze periodicky získávat lístek pomocí příkazu (pod uživatelem bacula):

bacula@localhost > kinit -k -t /etc/krb5.keytab.bacula nfs/USER@EINFRA 

Takto získáme lístek pod uživatelem bacula s platností jeden den. Příkaz již nevyžaduje zadávat heslo, jde proto automatizovat např. pomocí cronu.

Pokud Vám byla přiřazena speciální servisní identita, může se formát princpipálu trochu lišit, lze však získat postupem níže.

Správný formát principálu (řetězec nfs/USER@EINFRA) lze získat pomocí příkazu:

klist -k /etc/krb5.keytab.bacula
Keytab name: WRFILE:/etc/krb5.keytab.bacula
KVNO Principal
---- --------------------------------------------------------------------------
   1 nfs/USER@EINFRA

Nastavení /etc/fstab

Do souboru /etc/fstab dopsat řádek:

nfs.du4.cesnet.cz:/ /storage/cesnet-du4   nfs4   sec=krb5,rsize=1048576,wsize=1048576   0 0

díky čemuž pak není nutné svazky ručně připojovat příkazem mount.

DU4 Ostrava nfs.du4.cesnet.cz
DU5 Jihlava nfs.du5.cesnet.cz
Volby rsize=1048576,wsize=1048576 mohou zlepšit výkon NFS zejména na delší vzdálenosti, jsou doporučené a není nezbytné je uvádět.

Potom je třeba spustit službu nfs a zajistit její automatický start po rebootu:

openSUSE

/etc/init.d/nfs start 
insserv /etc/init.d/nfs

Debian

/etc/init.d/nfs-common start

Ubuntu

service portmap start
service gssd start

CentOS 6

chkconfig rpcbind on
chkconfig nfs on
chkconfig rpcsvcgssd on
chkconfig rpcidmapd on
service nfs

CentOS 7

systemctl enable nfs-idmapd
systemctl start nfs-idmapd
systemctl enable nfs-secure
systemctl start nfs-secure

CentOS 8 (Stream)

systemctl enable nfs-idmapd
systemctl start nfs-idmapd
systemctl enable nfs-secure
systemctl start nfs-secure

Nastavení /etc/idmapd.conf

Soubor /etc/idmapd.conf nastavuje mapování NFSv4 identit na lokální uživatele (NFSv4 pracuje s textovými principaly kerbera, POSIX rozhraní souborového systému pracuje s číselnou reprezentací uživatelů a skupin).

Jednoduché mapování

Jednoduché nastavení v souboru /etc/idmapd.conf spočívá v nastavení konfiguračního řádku do sekce [General]:

  Domain = EINFRA
Pokud používáte k přístupu lístek získaný z keytabu nebo speciálně přidělený servisní účet, budete ke správnému mapování potřebovat využít statického mapování.
Pokud Vám byl vytvořen servisní účet, použijte stejný realm EINFRA.
Od verze libnfsidmap 0.21 (debian 5 a vys) lze mit v sekci [General] v /etc/idmapd.conf polozku:
Local-Realms = realm1,realm2,realm3
pro více realmů (pouze speciální případy).
např.: Domain = META a Local-Realms = EINFRA

Pro správnou funkčnost je však potřeba mít nainstalovány naše klientské nástroje.


Pak budou uživatelé z domény @EINFRA mapováni pomocí souborů /etc/passwd a /etc/group. To znamená že pro identitu login@EINFRA musí existovat záznam v /etc/passwd se jménem login. Běžné nástroje (ls -l) budou zobrazovat jména a skupiny z domény EINFRA správně, bude-li pro jejich principal existovat jméno v daných souborech. Pro neexistující jméno se vybere mapování na uživatele nobody a skupinu nogroup.

Velmi pravděpodobně budete vidět vlastníka pouze u svých souborů (máte-li na svém počítači stejný login jako v EINFRA, v opačném případě uvidíte u všech souborů vlastníka nobody a skupinu nogroup), a u ostatních souborů vlastníka nobody a skupinu nogroup. Toto zobrazení nemá může mít vliv na přístupová práva k souborům, v závislosti na optimalizaci jádra klienta, ačkoliv je práva přístupu řeší až server podle jeho nastavení. Může se tedy stát, že při špatném nastavení mapování nepůjde některé operace provést, ačkoliv z pohledu serveru je vše v pořádku - klient žádost vůbec na server nepošle. Nemůže se však stát, že by vlivem špatného mapování klient dostal více práv, než ve skutečnosti má.

Současné verze nfs-utils sice nabízí možnost statického mapování uživatelů (užitečné ve chvíli, kdy je login na vašem počítači jiný než jaký používáte v EINFRA), ale implementace je zcela nefunkční. Nastavení funkčního statického mapování je složitější a je popsáno níže. Standardně podporovaná je pouze metoda mapování nsswitch, je tedy nutné mít v příslušnou sekci následovně:

[Translation]

Method = nsswitch

A nebo ji tam nemít vůbec, metoda nsswitch je implicitní.

Statické mapování

V některých případech není možné zajistit stejné uživatelské jméno uživatele na klientské straně jako na úložišti. Potom nemusí některé operace fungovat správně, například není možné využívat ENCFS nad svazkem připojeným přes NFS. Pro funkční statické mapování je nutné použít novější verzi programu libnfsidmapd, která již obsahuje tento patch.

Pokud jste instalovali klientské nástroje z našich repozitářů, budete mít libnfsidmap s tímto patchem již nainstalován.
Pokud vaše distribuce obsahuje balík nfs-utils (někdy nfs-common) ve verzi nižší než 1.2.6, je velmi pravděpododbné, že nebude opravena chyba způsobující špatné parsování konfiguračního souboru idmapd.conf

Pro kompilaci je nejprve potřeba stáhnout poslední verzi libnfsidmap:

cd ~/
git clone git://git.linux-nfs.org/projects/steved/libnfsidmap.git

Poté provést kompilaci:

cd libnfsidmap
./autogen.sh 
./configure
make
Ke kompilaci potřebujete mít nainstalovány balíky automake a libtool.

Dále je nutné s právy superuživatele provést instalaci pomocí make install, při dalším spuštění rpc.idmapd daemonu se již použije tato verze knihovny.

Poté je nutné upravit příslušné sekce v konfiguračním souboru /etc/idmapd.conf:

[Translation]
Method = static, nsswitch

[Static]

uzivatel@EINFRA = lokalniuzivatel
uzivatel2@EINFRA = jinylokalniuzivatel
storage@EINFRA = users

Takto se provede statické mapováni uživatelů uzivatel@EINFRA, uzivatel2@EINFRA a skupiny storage@EINFRA, u ostatních uživatelů a skupin se pak provede mapování dle pluginu nsswitch, které je popsané výše. Uživatelé, kteří se nenamapují žádnou z těchto dvou metod budou namapování jako nobody.

Při použití přístupových lístků získaných z keytabu nebo pomocí speciálně přidělený servisních účtů je potřeba zadat mapování ve tvaru:
USER@EINFRA = lokalniuzivatel

případně

nfs/backup_VO@EINFRA = lokalniuzivatel

Nastavení SELinux

V souboru /etc/selinux/config je potřeba nastavit hodnotu na SELINUX=disabled

Připojení svazku

Připojení svazku není nutné provádět ručně (u Ubuntu a u openSUSE 11.1 a vyšších), protože spuštění služby nfs jej automaticky připojí podle záznamu v /etc/fstab.

Pokud se připojení neprovede automaticky, lze ho udělat ručně. Připojení svazku je nutné provádět s root oprávněními. Ujistěte se, že máte správný /etc/krb5.keytab nebo vytvořený uživatelský lístek pod rootem. Dále se ujistěte, že vám běží portmap nebo rpcbind a nfs-common (nfs-utils). Lze ověřit následovně:

ps ax | grep rpc.gssd
ps ax | egrep "portmap|rpcbind"

Připojení provedeme takto:

mount -t nfs nfs.du4.cesnet.cz:/ /storage/cesnet-du4 -o vers=4 -o sec=krb5 -o rsize=1048576,wsize=1048576

Místo /storage/cesnet-du4 je možno zadat jakýkoliv jiný lokální adresář, kam chceme NFS svazek připojit. Uvedeme-li místo sec=krb5 volbu sec=krb5i bude při přenosech kontrolována integrita dat, uvedeme-li sec=krb5p budou data přenášena šifrovaně.

DU4 Ostrava nfs.du4.cesnet.cz
DU5 Jihlava nfs.du5.cesnet.cz

Závěr

Pokud jste postupovali podle návodu, v tomto okamžiku máte svazek připojený a můžete na něm pracovat z uživatelského účtu, pod kterým jste udělali přístupový lístek.

Potíže

V případě potíží se obraťte na naši uživatelskou podporu viz FAQ. Pro urychlení řešení můžete uživatelské podpoře poslat informace o systému následujícím způsobem (vše pod uživatelem root, pokud používáte sudo, je nutné pustit sudo /bin/bash a v příkazové řádce pustit následující)

wget http://www.fi.muni.cz/~xhejtman/check-nfs.sh
mount nfs4 [příkaz pro mount, který následně selže nebo jiný příkaz, který se chová jinak, než by dle návodu měl]
. ./check-nfs.sh &> /tmp/report.log

a následně uživatelské podpoře odešlete soubor report.log.

FAQ

Připojení více svazků s krb5 identitami

Popis problému: Mohu připojit více svazků s různými krb5 identitami?

Řešení: Od verze Kerberos 1.10 je v možné používat složku pro uchování lístků vašich identit namísto samotného souboru a mít tak více aktivních identit současně, mezi kterými lze přepínat. Standardně se vytváří samostatný soubor v /tmp/ (např. /tmp/krb5cc_0_dX1u6IH8jO). Pomocí jednoduché úpravy je možné změnit cestu do vybrané složky.

Pro tento režim použití je nezbytné, aby gssd běžel s volbou „-n“.
Zde uváděné úpravy nejsou permanentní a po restartu stroje bude potřeba stejným způsobem cache inicializovat znovu.

Nejprve si připravíme složku, do které chceme ukládat lístky identit. Zvolíme umístění této složky do /run/, protože při restartu bude tato složka vyčištěna.

# mkdir -p /run/user/0/krb5cc
# chmod og-rwx /run/user/0/krb5cc

Nastavíme do proměnné KRB5CCNAME cestu k dané složce.

# export KRB5CCNAME=DIR:/run/user/0/krb5cc

Nyní máme složku pro ukládání lístku připravenou a můžeme inicializovat identity.

# kinit user@DOMAIN1
# kinit user@EINFRA

Pro výpis všech dostupných lístků identit můžeme použít příkazů klist -A nebo klist -l.

# klist -A
Ticket cache: DIR::/run/user/0/krb5cc/tkta0Hysv
Default principal: user@DOMAIN1

Valid starting     Expires            Service principal
9.6.2015 13:54:44  9.6.2015 23:54:38  krbtgt/DOMAIN1@DOMAIN1
	renew until 24/06/2015 13:54 

Ticket cache: DIR::/run/user/0/krb5cc/tkt5PDllX
Default principal: user@EINFRA

Valid starting     Expires            Service principal
9.6.2015 13:54:22  9.6.2015 23:54:16  krbtgt/EINFRA@EINFRA
	renew until 16/06/2015 13:54 


# klist -l
Principal name                 Cache name
--------------                 ----------
user@DOMAIN1                   DIR::/run/user/0/krb5cc/tkta0Hysv
user@EINFRA                    DIR::/run/user/0/krb5cc/tkt5PDllX

Použitím samotného příkazu klist vidíme, která identita je aktivní.

# klist
Ticket cache: DIR::/run/user/0/krb5cc/tkta0Hysv
Default principal: user@DOMAIN1

Valid starting     Expires            Service principal
9.6.2015 13:54:44  9.6.2015 23:54:38  krbtgt/DOMAIN1@DOMAIN1
	renew until 24/06/2015 13:54

Pro přepínání identit slouží příkaz kswitch.

# kswitch -p user@EINFRA

# klist
Ticket cache: DIR::/run/user/0/krb5cc/tkt5PDllX
Default principal: user@EINFRA

Valid starting     Expires            Service principal
9.6.2015 13:54:22  9.6.2015 23:54:16  krbtgt/EINFRA@EINFRA
	renew until 16/06/2015 13:54

Pokud tedy chceme připojit dva NFSv4 svazky s různými identitami, pak stačí spustit příkaz mount s aktivní první identitou, přepnout identity pomocí kswitch a následně připojit druhý svazek s aktivní druhou identitou.

# mount -o sec=krb5i,proto=tcp,port=2049,intr storage-jihlava1-cerit.metacentrum.cz:/ /mnt/storage-cerit
# kswitch -p user@EINFRA
# mount -o rw,nfsvers=4,hard,intr,sec=krb5i nfs.du4.cesnet.cz:~/ /mnt/storage-du4
DU4 Ostrava nfs.du4.cesnet.cz
DU5 Jihlava nfs.du5.cesnet.cz

Problém s připojením NFS k novému úložišti

Popis problému: Zkouším se připojit k novému úložišti pomocí NFS, avšak stále se mi to nedaří.

Řešení: Pro případ připojení k úložišti v Ostravě by měl být v krb5.conf záznam pro [domain_realm] pro úložiště v Ostravě, obdobně pro další úložiště.

.du4.cesnet.cz = EINFRA-SERVICES

Problém s připojením k NFS pomocí Kerberos lístku

Popis problému: Zkouším se připojit k úložišti pomocí NFS, avšak dostávám chybové hlášení.

mount.nfs: Network is unreachable

Řešení: Problém je způsoben neběžící službou rpc-gssd, pokud se podíváte na status služby:

systemctl status rpc-gssd

Dostanete následující výpis:

Condition: start condition failed at Thu 2018-05-06 06:12:22 CET; 20s ago
           └─ ConditionPathExists=/etc/krb5.keytab was not met

Řešením může být tedy například to, že vytvoříte prázdný soubor v /etc pomocí následujícího příkazu:

touch /etc/krb5.keytab

Následně stačí službu rpc-gssd restartovat a znovu provést mount.