O SSH a FUSE jsme už několik článků napsali, takže pokud o jednom nebo obou těchto slovech nic netušíte, podívejte se na ně:
- Sdílené, interaktivní a hashované OpenSSH
- Zavádíme omezení v OpenSSH
- Certifikáty v OpenSSH
- Stavíme tunely v OpenSSH
- Používání klíčů v OpenSSH
- Jak se přihlašovat na SSH bez zadávání hesla
- Blokujte SSH útoky pomocí DenyHosts
- Hrátky z řádky: ssh v praxi
- Hrátky z řádky: používáme ssh
- Seriál ssh intimně aneb úvod do paranoii
- FUSE: celý svět je souborový systém
SSH nebo-li Secure Shell by se dalo popsat jako univerzální šifrovaný kanál, který sice měl být náhradou za telnet a tedy jako bezpečný vzdálený shell, ale je navržen tak, že zvládne mnohem více. Můžeme si ho představit jako trubku, kterou lze přenášet soubory, příkazy a dokonce i okna. Jedním z protokolů kolem SSH je i SFTP, které má stejný účel jako FTP, tedy přenášení souborů z či na vzdálený server a odtud už je jen krůček tomu, aby se dal disk vzdáleného počítače připojit do počítače lokálního.
A tady přichází na řadu FUSE. Ten nabízí programátorům rozhraní pro napsání souborového systému mimo linuxové jádro. V praxi tak běží proces souborového systému ne na úrovni jádra, ale jako kterýkoli jiný program v uživatelském prostoru včetně všech omezení, které s tím souvisí. To znamená hlavně běh pod uživatelem a tedy i větší bezpečnost. Souborový systém napsaný pomocí FUSE má mnohem větší problémy shodit stroj než systém, který je součástí jádra.
Když spojíme SFTP, SSH a FUSE, dostaneme SSHFS. Tento nástroj umožňuje uživatelům připojit jakýkoli stroj s SSH a SFTP do lokálního adresáře. Díky SSH jsou data navíc přenášena bezpečným kanálem, takže je není možné odposlouchávat. Autentizaci je možné řešit přes klíče, takže připojení vzdáleného stroje lze pohodlně automatizovat.
Jak na to
SSHFS je součástí snad každé velké distribuce a stačí ho nainstalovat z repositářů. Na Ubuntu či Debianu se použije následující:
# apt-get install sshfs
Po instalaci se v systému objeví stejnojmenná binárka, a tak nic nebrání tomu nějaký vzdálený systém připojit.
$ sshfs uzivatel@1.2.3.4:~/ ~/vzdaleny_stroj
V tomto příkladu jsme připojili domácí adresář uživatele uzivatel na stroji s IP adresou 1.2.3.4 do lokálního adresáře ~/vzdaleny_stroj. SSHFS se ve správný okamžik zeptá na heslo a po jeho zadání vše proběhne.
K nově připojenému souborovému systému je potřeba vědět, že soubory a adresáře patří stejnému UID a GID, jako na vzdáleném stroji, ale při práci s nimi se používá vždy uživatel, kterého jste použili při připojení souborového systému. To znamená, že pokud mají data vzdáleného stroje jako vlastníka jiné UID než je to vaše aktuální, ještě to neznamená, že nemůžete s daty pracovat. Takto můžete připojit třeba celý systém pomocí vzdáleného uživatele root a mít tak přístup ke každému souboru, i když to práva na první pohled nedovolí.
Když vás připojený souborový systém přesně bavit, přijde na řadu utilitka fusermount, která ho dokáže odpojit.
$ fusermount -u ~/vzdaleny_stroj
Parametr -u znamená umount, tedy odpojení. Další parametry je možné najít po spuštění fusermount -h.
Na vzdáleném serveru musí být nainstalován a běžet daemon openssh. V Debianu a Ubuntu ho nainstalujete z balíčku ssh, v Arch Linuxu to je pak openssh a jiné distribuce ho mohou označovat úplně jinak.
Pokročilé možnosti
SSHFS je možné přizpůsobit pomocí parametru -o, kde můžeme ovlivnit, jak se mají zobrazit práva, (a)synchronní čtení a zápis, velikost bloků odeslaných dat, různé timeouty, práci se symlinky, cache a mnoho dalšího. Všechny možnosti jsou stručně popsány v manuálové stránce.
$ man sshfs
Některé parametry by se vám mohly v praktickém životě hodit a najdete je v následující tabulce.
uid=UID | Namapovat vzdáleného uživatele na lokálního |
---|---|
gid=GID | Namapovat vzdálenou skupinu na lokální |
idmap=none|user | Způsob mapování uživatelů – none: žádné, user: mapovat lokálního uživatele na vzdáleného |
follow_symlinks | Na straně serveru následovat symlinky |
max_read=N | Maximální velikost požadavku pro čtení |
max_write=N | Maximální velikost požadavku pro zápis |
hard_remove | Smazání odstraněných dat ihned |
intr | Povolit možnost přerušení požadavku |
sshfs_sync | Synchronní zápis |
reconnect | Znovu připojení po odpojení |
Všechny se používají s parametrem -o a oddělují čárkou, například:
$ sshfs -o uid=1000,gid=1000,idmap=user,reconnect uzivatel@1.2.3.4:~/ ~/vzdaleny_stroj
Klíče
Při častém použití sshfs nebo při jeho automatickém připojování, se vám může hodit přihlašování pomocí klíčů bez hesla. Takové přihlášení využívá páru veřejného a soukromého klíče, kdy se veřejný klíč nahraje na vzdálený server a ten pak je schopen bezpečně ověřit uživatele.
Klíče by se měly správně vybavovat heslem, ale záleží hlavně na situaci. Nový pár klíčů vytvoříte pomocí ssh-keygen nástroje:
$ ssh-keygen -t dsa
Budete požádání o zadání hesla a místa pro uložení klíčů. Místo můžete nechat výchozí a heslo je na vás. Pokud žádné nepoužijete, budete se moci přihlásit pomocí tohoto klíče bez něj.
Veřejný klíč se nachází ve výchozím stavu v ~/.ssh/id_dsa.pub a je potřeba ho dopravit na vzdálený server do souboru ~/.ssh/authorized_keys. Každý řádek může obsahovat jeden klíč, takže jich na jednom serveru můžete mít více. Lze to udělat ručně nebo použít utilitku ssh-copy-id.
$ ssh-copy-id -i .ssh/id_dsa.pub uzivatel@1.2.3.4
Nyní by mělo jít se přihlásit pomocí klíče. Ten je automaticky použit, takže nic dalšího není potřeba nastavovat. Připojení je možné ještě zjednodušit použitím konfiguračního souboru ~/.ssh/config, a to následujícím způsobem:
Host jmeno_stroje
HostName domena_nebo_IP_adresa
User uzivatel
Port 22
Compression no
Těchto pět řádků můžete také zopakovat pro další stroje. K nim se pak připojíte tímto způsobem:
$ ssh jmeno_stroje
A abychom neobíhali od tématu, tak:
$ sshfs jmeno_stroje: ~/pripojny_bod
Pokud není za dvojtečkou nic uvedeno, připojí se domácí adresář uživatele. V tomto případě roota.
Automatický mount
Automatické připojení je možné řešit mnoha způsoby. Jedním je třeba autofs, ale jeho konfigurace je trochu složitější. Za to by si měl dobře poradit s výpadky spojení a znovupřipojením odpojeného stroje. Pokud zrovna žádný program k připojenému souborovému systému nepřistupuje, autofs ho automaticky odpojí a čeká, dokud do přípojného bodu nějaký program zase nevstoupí. Více informací o autofs získáte v našem článku NFS a Autofs: Sdílení v LAN.
My si ukážeme použití sshfs v souboru /etc/fstab.
jmeno_stroje: /pripojny/bod fuse.sshfs uid=1000,gid=1000,reconnect,intr,follow_symlinks,allow_other 0 0
Souborové systémy uvedené v /etc/fstab jsou připojované během bootovacího procesu, takže je nutné, aby byla v této době už dostupná síť. Pokud používáte NetworkManager nebo jinou utilitku, která stroj připojí k síti až po přihlášení uživatele, nebude záznam v /etc/fstab fungovat a jen si prodloužíte bootovací proces.
V řádku s parametry určitě nezapomeňte uvést allow_other, jenž zpřístupní připojený souborový systém uživatelům a také uid a gid uživatele, který ho bude používat. Další parametry jsou už jen na vašem zvážení.
Shrnutí
SSHFS používám každý den pro streamování hudby ze vzdáleného serveru přes internet a někdy i pro streamování filmů či seriálů a až na občasné výkyvy způsobené kvalitou připojení, jsem na žádný problém nenarazil. Na rychlém hardwaru je rychlost přenosu shodná s rychlostí fyzické linky. To znamená, že na 100 Mbps síti není problém protáhnout kolem 10 MB/sec. Na stejné síti mi dělá NFS přes UDP protokol o 1 MB víc.