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.
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:
ping -c 1 ``hostname``
ping -c 1 ``hostname -f``
root
, případně keytab)198.51.100.10 mujklient.domena.cz mujklient
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
Pro přípojení (mount
) svazku je potřeba získat lístek dostupný pod uživatelem root
. Ten lze získat 2 způsoby:
/etc/krb5.keytab
V závislosti na použitém způsobu se pak částečně liší nastavení klientských nástrojů.
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).
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
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
).
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.
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
).
Nastavení nfs-utils
je v souboru /etc/sysconfig/nfs
. Nastavíme alespoň tyto hodnoty:
NFS_SECURITY_GSS="yes" NFS4_SUPPORT="yes" RPCGSSDARGS="-n"
Nastavení nfs-utils je v souboru /etc/nfs.conf
. Nastavíme alespoň tyto hodnoty:
SECURE_NFS="yes" RPCGSSDARGS="-n"
Nastavení nfs-utils je v souboru /etc/sysconfig/nfs
. Nastavíme alespoň tyto hodnoty:
SECURE_NFS="yes" RPCGSSDARGS="-n"
Vytvoříme soubor pro nastavení nfs-utils /etc/sysconfig/nfs
. Nastavíme alespoň tyto hodnoty:
SECURE_NFS="yes" RPCGSSDARGS="-n"
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
Nastavení nfs-utils
je v souboru /etc/sysconfig/nfs
. Nastavíme alespoň tyto hodnoty:
NFS_SECURITY_GSS="yes" NFS4_SUPPORT="yes"
Nastavení nfs-utils
je v souboru /etc/sysconfig/nfs
. Nastavíme alespoň tuto hodnotu:
SECURE_NFS="yes"
Nastavení nfs-utils
je v souboru /etc/sysconfig/nfs
. Nastavíme alespoň tuto hodnotu:
SECURE_NFS="yes"
Vytvoříme soubor pro nastavení nfs-utils /etc/sysconfig/nfs
. Nastavíme alespoň tyto hodnoty:
SECURE_NFS="yes"
root
k přístupu na svazek nepotřebuje speciální lístek, stačí lístek pro příjení či keytab ''/etc/krb5.keytab''
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 >
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
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.
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:
/etc/init.d/nfs start insserv /etc/init.d/nfs
/etc/init.d/nfs-common start
service portmap start service gssd start
chkconfig rpcbind on chkconfig nfs on chkconfig rpcsvcgssd on chkconfig rpcidmapd on service nfs
systemctl enable nfs-idmapd systemctl start nfs-idmapd
systemctl enable nfs-secure systemctl start nfs-secure
systemctl enable nfs-idmapd systemctl start nfs-idmapd
systemctl enable nfs-secure systemctl start nfs-secure
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é nastavení v souboru /etc/idmapd.conf spočívá v nastavení konfiguračního řádku do sekce [General]:
Domain = EINFRA
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í.
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
V souboru /etc/selinux/config je potřeba nastavit hodnotu na SELINUX=disabled
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ě.
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.
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.
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
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
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.