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:
- Správně nastavený hostname, který lze resolvovat, lze ověřit pomocí:
ping -c 1 ``hostname``ping -c 1 ``hostname -f``
- prázdný adresář jako bod pro namountování
- nainstalovanou podporu Kerberos
- kerberos lístek umožňující připojení svazku (lístek dostupný pod uživatelem
root, případně keytab) - kerberos lístek pro přístup k datům (dostupný pod uživatelem, pod kterým pracujete)
- root účet na svém stroji
- správně nastavený systémový čas
- V případě, že používáte distribuci CentOS 5.8 budete ještě potřebovat
- Kernel verze 2.6.18-308.4 nebo novější (jinak v NFS svazku budete dostávat hlášku: cd: [adresář]: Not a directory)
- nfs-utils verze 1.0.9-61, ke stažení zde (jinak svazek nepůjde připojit s hláškou Permission denied)
- Pro všechny stroje vyjma mobilních klientů doporučujeme mít ve svém hostname v /etc/hosts přidán kanonický název (výstup z hostname -f), např:
198.51.100.10 mujklient.domena.cz mujklient
ownCloud
FileSender
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:
- Použijete uživatelský lístek s omezenou platností
- Využijete údaje uložené v keytabu
/etc/krb5.keytab
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).
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").
Takto získaný soubor krb5.keytab umístěte do /etc/krb5.keytab.
/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
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
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
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 >
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.
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.
ownCloud
FileSender
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
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.
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
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.
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ě.
ownCloud
FileSender
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.
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
ownCloud
FileSender
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.