Log in


Forgot your password?
prijatelji LUGoNSa
gnu.gif
linuxzasve.jpg
hulk.jpg
 
You are here: Home / members / Vladimir Atanackovic / SSHFS: Super-lako deljenje datoteka preko SSH

SSHFS: Super-lako deljenje datoteka preko SSH

by Vladimir Atanackovic last modified Feb 23, 2011 06:06 PM
Kome još trebaju NFS ili Saba kad možete montirati sisteme datoteka preko SSHFS?

SSHFS: Super-lako deljenje datoteka preko SSH
Linuxjournal, 28.04.2006, Metju E. Hoskins

Kome još trebaju NFS ili Saba kad možete montirati sisteme datoteka preko SSHFS?

Alatke poput scp, sftp i rsync omogućavaju nam da kopiramo datoteke lako i bezbedno između različitih naloga. Ali, šta da radimo ako ne želimo da kopiramo datoteke pre upotrebe? Ovo je, po običaju, poziv na upotrebu tradicionalnih načina deljenja [datoteka] preko mreža, poput NFS-a, openAFS-a ili Sambe. Na žalost, podešavanje ovih mrežnih deljenja zahteva administratorske privilegije s obe strane.

A sad nastupaju SSHFS i FUSE

Srećom, dok god imate pristup preko SSH, možete koristiti SSHFS kako biste montirali (to mount) i upotrebljavali udaljena stabla direktorija kao da su "u lokalu". SSHFS ne zahteva poseban softver na "drugoj strani", samo savremen SSH server s podrškom za SFTP ekstenzije. Sve moderne distribucije linuksa danas podržavaju ovu ekstenziju, koja je u OpenSSH dodana u verziji 2.3.0, i objavljena u novembru 2000. godine.

SSHFS počiva na okvirima funkcionisanja sistema datoteka u korisnikovom prostoru (FUSE filesystem framework project). FUSE dozvoljava korisnikovom softveru - SSH je u pitanju u ovom slučaju - da upotrebljava pristup virtualnom sistemu datoteka. Ovo ima sličnosti s tim kako /proc i /sys sistemi datoka omogućavaju uvid u interna dešavanja u jezgru (kernel) u obliku datoteka organizovanih u stabla (directory tree). SSHFS se "kači" na udaljeni sistem i obavlja sve neophodne operacije kako bi omogućio izgled i ugođaj najobičnijeg sistema datoteka, iako barata udaljenim datotekama.

Instaliranje SSHFS-a i FUSE-a

Ja koristim Fedoru Core 4 na radnoj stanici na kojoj ću pokazati montiranje udaljenih direktorija. Drugi sistem takođe koristi Fedoru Core 4, ali bilo koji drugi *NIX sistem na kom radi savremen SSH server s SFTP ekstenzijama obaviće posao. Ipak, pored toga, vaše jezgro linuksa mora imati omogućene opcije podrške za baratanje sistemima datoteka u korisnikovom prostoru.

Sav softver koji je potreban za SSHFS dostupan je u paketima koje na Fedori možemo instalirati jednostavnim:

$ yum install fuse-sshfs

Ovo instalira SSHFS, FUSE i pakete i bilioteke potrebne FUSE-u, sve automatski.

Prije no što možemo upotrebljavati SSHFS ili bilo koji drugi sistem datoteka baziran na FUSE-u kao korisnik, moramo dodati korisnika u grupu korisnika FUSE-a. U mom slučaju, korisničko ime je matt. Ovo kao root možemo uraditi iz komandne linije, ovako:

$ usermod  -a -G fuse matt

U grupi korisnika fuse nalaze se svi korisnici koji mogu upotrebljavati sisteme datoteka bazirane na FUSE-u. Ovo je važno, jer, FUSE instalira programe koristeći setuid, što uvek nosi sobom bezbedonosne implikacije. Na sistemima na kojima je potreban veoma visok nivo bezbednosti, takvi programi morali bi biti posebno procenjeni, i kontrolisani.

Nakon instalacije i konfiguracije softvera, spremni smo da zavrtimo SSHFS. Kako bismo pogledali osnovnu funkcionalnost, konektovaćemo se na udaljeni sistem - moj sistem se u ovom primeru zove se my.randombox.com. Osnovna operacija koju SSHFS izvodi jeste da montira udaljeni korisnikov polazni direktorij (home directory) i ovo je najčešća uloga i upotreba SSHFS-a. Poput montiranja drugih sistema, potreban vam je i prazan direktorij koji će biti tačka montiranja (mountpoint) a pod kojom će udaljeni sistem datoteka biti montiran. Ja sam kreirao u ovom primeru tačku montiranja koju sam nazvao randombox_home, i onda sam komandom sshfs montirao udaljeni sistem. Evo kako sam to izveo:

$ cd $HOME
$ mkdir randombox_home
$ sshfs  matt@my.randombox.com:  randombox_home
matt@my.randombox.com's password: ************
$ ls -l randombox_home/
-rw-r-----  1 matt users     7286 Feb 11 08:59 sshfs.article.main.txt
drwx------  1 matt users     2048 Mar 21  2001 projects
drwx------  1 matt users     2048 Dec  1  2000 Mail
drwxr-xr-x  1 matt users     4096 Jun  8  2002 public_html
$ cp ~/my_web_site/index.html randombox_home/public_html/


To je to. Moj polazni direktorij na udaljenom sistemu my.randombox.com je sada montiran pod direktorijem randombox_home na mojoj radnoj stanici, u lokalu. U pozadini, FUSE, SSHFS i SSH server na "drugoj strani" obavljaju sav posao kako bi prikazali sadržaj mog polaznog direktorija s udaljenog računara ovde, kao da se radi o samo još jednom lokalnom sistemu datoteka. Ako želite da montirate još neki direktorij, pored polaznog direktorija, samo navedite njegovu putanju nakon dvotačke u komandnoj liniji kojom upotrebljavate sshfs. Možete čak i / navesti, i tako montirati čitav udaljeni sistem. Naravno, imaćete pristup samo datotekama i direktorijima kojima biste imali pravo i nivo pristupa na udaljenoj mašini, svakako. Pokušaj neautorizovanog pristupa prikazaće poruku o zabranjenom pristupu. Sledi primer i ovoga:

$ cd $HOME
$ mkdir randombox_slash
$ sshfs  matt@my.randombox.com:/  randombox_slash
matt@my.randombox.com's password:
$ ls -l randombox_slash/
total 0
drwxr-xr-x  1 root root   4096 Nov 15 10:51 bin
drwxr-xr-x  1 root root   1024 Nov 16 07:11 boot
drwxr-xr-x  1 root root 118784 Jan 26 08:35 dev
drwxr-xr-x  1 root root   4096 Feb 17 10:37 etc
drwxr-xr-x  1 root root   4096 Nov 29 09:30 home
drwxr-xr-x  1 root root   4096 Jan 24  2003 initrd
drwxr-xr-x  1 root root   4096 Nov 15 10:53 lib
drwx------  1 root root  16384 Nov 11 10:21 lost+found
drwxr-xr-x  1 root root   4096 Nov 11 10:38 mnt
drwxr-xr-x  1 root root   4096 Jan 24  2003 opt
dr-xr-xr-x  1 root root      0 Jan 26 08:11 proc
drwx------  1 root root   4096 Mar  3 09:34 root
drwxr-xr-x  1 root root   8192 Nov 15 13:50 sbin
drwxrwxrwt  1 root root   4096 Mar  5 18:41 tmp
drwxr-xr-x  1 root root   4096 Nov 11 10:55 usr
drwxr-xr-x  1 root root   4096 Jan 20 08:16 var
$ cat randombox_slash/etc/shadow
cat: randombox_slash/etc/shadow: Permission denied
$ ls -l randombox_slash/root/
ls: reading directory randombox_slash/root/: Permission denied
total 0
$ ls -l randombox_slash/home/matt/
-rw-r-----  1 matt users     7286 Feb 11 08:59 sshfs.article.main.txt
drwx------  1 matt users     2048 Mar 21  2001 projects
drwx------  1 matt users     2048 Dec  1  2000 Mail
drwxr-xr-x  1 matt users     4096 Jun  8  2002 public_html
$


Automatizovanje konekcije

Kao što ste već videli u prethodno navedenim primerima, bilo je potrebno da upisujem lozniku svaki put kada sam pristupao udaljenim sistemima, kako bih dovršio uspostavljanje SSH konekcije. Ovo može da se "preskoči" kreiranjem odnosa poverenja medju lokalnim i udaljenim nalozima. To možda nije adekvatno u svim situacijama, jer, iz bezbedonosne perspektive, to u potpunosti izjednačava naloge. Svaka maliciozna aktivnost na jednom nalogu može se proširiti na druge naloge tim putem, pa budite pažljivi ako to radite i izučite sve implikacije pre uspostavljanja takvih odnosa poverenja. Kako biste podesili ovo, kreirajte par SSH ključeva, javni i privatni, odnosno id_rsa.pub i id_rsa.

Javni ključ kopirajte na udaljeni sistem, u datoteku $HOME/.ssh/authorized_keys. Neki sistemi koriste i naziv $HOME/.ssh/authorized_keys2 mesto $HOME/.ssh/authorized_keys.

Ovo omogućava svakom korisniku koji poseduje privatni ključ da se autentifikuje bez lozinke. Kreiraćemo par ključeva komandom ssh-keygen. Datoteke se automatski smeštaju na odgovarajuće lokacije u direktoriju $HOME/.ssh. Kako sam već montirao udaljeni direktorij na stablo direktorija u lokalu, dodavanje javnog ključa datoteci authorized_keys biće izuzetno jednostavno. Slede koraci koje treba obaviti (uz pretpostavku da ste i vi kreirali datoteke i montirali direktorije):

$ cd $HOME
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/matt/.ssh/id_rsa): <ENTER>
Enter passphrase (empty for no passphrase):  <ENTER>
Enter same passphrase again:  <ENTER>
Your identification has been saved in /home/matt/.ssh/id_rsa.
Your public key has been saved in /home/matt/.ssh/id_rsa.pub.
The key fingerprint is:
fa:e7:7c:e1:cb:7b:66:8b:67:07:05:99:7f:05:b9:4a matt@myworkstation
$ mkdir randombox_home/.ssh
$ chmod 700 randombox_home/.ssh
$ cat .ssh/id_rsa.pub >> randombox_home/.ssh/authorized_keys
$ chmod 600 randombox_home/.ssh/authorized_keys


U prethodnom primeru, kreirali smo par ključeva bez lozinke za same ključeve (passphrase) i potom dodali javni ključ u datoteku authorized_keys, na udaljenoom računaru, i na kraju podesili dozvole. Nakon šte je to urađeno, Ne moram više da unosim lozinku kada se povezujem s udaljenim sistemom datoteka. Da bismo ovo testirali, prvo moramo da demontiramo udaljeni polazni direktorij sledećom komandom:

$ fusermount -u randombox_home

Da bismo testirali veze poverenja, možemo prvo komandom uptime proveriti stanje na udaljenom sistemu:

$ ssh matt@my.randombox.com uptime
12:20:40  up 38 days,  4:12,  0 users,  load average: 0.11, 0.04, 0.01


Odlično, nije trebala lozinka za ovo. Odnosi poverenja su pravilno uspostavljeni. Ako vam nešto ne radi u vezi ovih odnosa poverenja među nalozima na mašinama, proverite dozvole dodeljene pojedinim datotekama u .ssh direktorijima, na oba sistema. Često su upravo dozvole uzrok problema u funkcionisanju ključeva. Ujedno, pogledajte šta se dešava i u sistemskom logu (syslog), koji često sadrži korisne opise i dijagnoze u vezi problema  s ključevima. Možda ćete morati povećati željeni nivo količine informacija koje se upisuju u log, u sshd_config datoteci, koja se obično nalazi u direktoriju /etc/ssh/.

Možete i pažljivo ispitivati rad (debug) i konekciju pokrećući ssh kao u prethodnom primeru, ali s -vvv opcijom dodanom kako bi se omogućio visok nivo pregleda detalja. Montirajmo ponovo direktorij s udaljenog sistema. Ovaj put me neće pitati za lozinku:

$ cd $HOME
$ mkdir randombox_home
$ sshfs  matt@my.randombox.com:  randombox_home
$ ls -l randombox_home/
-rw-r-----  1 matt users     7286 Feb 11 10:33 sshfs.article.main.txt
drwx------  1 matt users     2048 Mar 21  2001 projects
drwx------  1 matt users     2048 Dec  1  2000 Mail
drwxr-xr-x  1 matt users     4096 Jun  8  2002 public_html

Integracija s GNOME Desktopom

U poslednjem primeru, podesili smo i automatizovali neinteraktivno montiranje direktorija s udaljenog računara. Sada, kada nas više računar ne pita za lozinke, možemo integrisati SSHFS u skripte, ili - još bolje - s GNOME Desktopom. Da bismo podesili GNOME da montira naš polazni direktorij s udaljenog računara automatski, podesićemo komandu koja montira pomoću SSHFS kao komandu koja se izvršava s pokretanjem programa. Ovo se radi u dijalozima u Sessions prozoru. Sledite Desktop -> Preferences -> More Preferences -> Sessions -> Add, i popunite formu kako je to prikazano na Slici 1.



Pri sledećem logovanju GNOME će automatski montirati udaljene direktorije, kako se i vidi na Slici 2.



Obratite pažnju na činjenicu da GNOME nije baš pouzdan po pitanju demontiranja /prekidanja ove komande nakon odjavljivanja. Možete demontirati direktorije s udaljenog računara "ručno", koristeći komandu fusermount -u randombox_home. Još jedna opcija je da automatizujete demontiranje modifikovanjem datoteke $HOME/.Xclients-default koja potom poziva fusermount komandu, ovako:

#!/bin/bash
# (c) 2001 Red Hat, Inc.

WM="gnome-session"
WMPATH="/usr/bin /usr/X11R6/bin /usr/local/bin"

# Kludged to run fusermount upon gnome logout.  20060301-MEH
for p in $WMPATH ; do
[ -x $p/$WM ] && $p/$WM; fusermount  -u randombox_home; exit 0
done

exit 1


Obratite pažnju na to da je datoteka .Xclients-default prepisana svaki put kada koristite alatku switchdesk. Morate ponoviti ovu modifikaciju svaki put kada koristite alatku switchdesk da biste promenili osnovne postavke vašeg menadžera prozora za desktop.

Konačno, možete dodati i odgovarajuće komande sshfs-a u datoteku koja se prva izvršava, a koja je datoteka u pitanju zavisi od vaše distribucije. Na taj način, vaš sitem će montirati sve direktorije automatski, preko SSHFS, svaki put kada pokrećete svoj desktop.

Oblikovanje sshfs-a iz izvornog koda (source code)

Ako distribucija linuksa koju koristite nema već pripremljene pakete SSHFS-a, ili prosto želite da SSHFS bude oblikovan iz samog izvornog koda, ovo možete veoma brzo uraditi. Prvo proverite da li ste pripremili sve module potrebne kernelu kako bi baratao s razvojem modula (module development) i sa sistemima datoteka u korisničkom prostoru. Onda preuzmite najnoviji izvorni kod i za FUSE i za SSHFS, sa SourceForge-a. Prebacite potrebne daototeke u privremeni direktorij, i onda oblikujte i instalirajte sve sledećim komandama:

$ tar -xzf fuse-2.5.2.tar.gz
$ cd fuse-2.5.2
$ ./configure --prefix=/usr
$ make
$ su  -c "make install"
$ cd ..
$ tar -xzf sshfs-fuse-1.5.tar.gz
$ cd sshfs-fuse-1.5
$ ./configure --prefix=/usr
$ make
$ su  -c "make install"


Ako je sve instalirano kako treba, onda imate sve što vam je potrebno da biste ponovili sve iz prethodnih primera. Nakon instalacije, sshfs i fusermount komande instalirane su u /usr/bin.

Zaključak

SSHFS i FUSE omogućavaju da bilo koje udaljeno skladište bude montirano i upotrebljavano baš kao i bilo koji drugi sistem datoteka.

Kao što sam i rekao, FUSE je okvirni opis o tome kako upotrebljavati sisteme datoteka u korisničkom prostoru. SSHFS je samo vrh ledenog brega u tom kontekstu. Postoje i drugi sistemi datoteka koji su bazirani na FUSE-u, poput sistema za transparentno kriptovanje vaših datoteka - EncFS, pretrage Bluetooth uređaja (BTFS) ili montiranje čitavih CVS repozitorija kao da se radi o sistemima datoteka (CvsFS). Možda ste se upitali šta napraviti sa tolikim slobodnim prostorom u vašem sandučetu elektronske pošte kod Gmail-a? Pa, GmailFS vam omogućava da montirate vaš Gmail nalog i koristite ga ka da se radi o lokalnom sistemu datoteka. Pogledajte čega još sve ima na sajtu FUSE-a, možda vas inspiriše da napravite vlastiti [sistem datoteka]. FUSE ima veze (bindings) za uvezivanje s jezicima kakvi su Perl, Python, TCL, C, C#, Ruby, i drugi.

Document Actions