Kotisivu

Yksinkertaisen lähiverkon rakentaminen sshfs:n avulla

Johdanto

Linux-jakeluiden mukana tulee lähes poikkeuksetta sekä OpenSSH-palvelin -että asiakasohjelma. Ohjelmistopaketti on erinomainen, sillä se taipuu paljon muuhunkin kuin muiden palvelinten turvalliseen etäkäyttöön. Eräs esimerkki tästä on etäpalvelimen hakemistojen - tai koko hakemistorakenteen - liittäminen näkymättömästi osaksi oman tietokoneen hakemistorakennetta. Vaikkapa NFS:ään verrattuna ratkaisu on toki varsin rajoittava, mutta toisaalta esim. heikolla WEP-salauksella suojattuun langattomaan kotiverkkoon ratkaisu tuo huomattavasti lisäturvaa: kaikki tieto verkossa kulkee salattuna SSH:n lävitse.

OpenSSH:n ja sshfs:n käyttö ei sovellu sellaisten lähiverkkojen rakentamiseen, joissa kaikkien tietokoneiden halutaan pääsevän käsiksi kaikkien tietokoneiden tiedostoihin. Sshfs on kuitenkin omiaan sellaisiin tilanteisiin, joissa kaikki jaettavat tiedostot ovat yhdellä palvelimella, eikä niitä tarvitse jakaa kovin monelle asiakaskoneella ja/tai käyttäjälle.

Palvelimen ja asiakkaiden konfigurointi

libfuse2 ja sshfs (http://fuse.sourceforge.net)

Fuse on ohjelmistopaketti, jonka avulla käyttäjät voivat liittää (engl. mount) haluamiaan tiedostojärjestelmiään omiin hakemistoihinsa ilman pääkäyttäjän oikeuksia. Sshfs käyttää fusea, joten toimiakseen se vaatii Linuxin ytimeltä fuse-tuen. Asian voi tarkistaa komennolla

lsmod|grep fuse

Jos fuse-moduulia ei löydy, koeta ladata se käsipelillä pääkäyttäjän oikeuksin:

modprobe fuse

Mikäli jälkimmäinen komento antaa virheilmoituksen, on joko

Ainakaan Debianin tai Ubuntun kernel-source -paketeissa ei ole fuse-tukea suoraan mukana, joten niissä pitää asentaa fuse-source -paketti sekäkääntää ja asentaa se. Mikäli käytät Ubuntun tai Debianin omia (ei lähdekoodista käännettyjä) ytimiä, on fuse-tuki luultavasti jo päällä. Lisätietoja moduulien kääntämisestä saa Debianin sivuilta. Mikäli on tarpeen kääntää järjestelmän ydin itse, löytyy yleisiä ohjeita ainakin osoitteesta http://www.tldp.org. Ytimen fuse-tuen käyttöönottoon liittyviä ohjeita löytyy osoitteesta http://fuse.sourceforge.net.

Kun ytimen fuse-tuki on kunnossa, pitää asentaa myös fuse- ja sshfs -ohjelmistot. Debianissa (etch) asennus on erittäin yksinkertaista:

aptitude update
aptitude install sshfs libfuse2 fuse-utils 

Periaatteessa tämän jälkeen voi sshfs:ä jo kokeilla komennolla

sshfs käyttäjä@palvelin liitoskohta

Liitoskohdaksi pitää valita sellainen hakemisto, johon käyttäjällä on kirjoitusoikeudet. Tästä syystä on helpointa luoda uusi hakemisto käyttäjän kotihakemistoon ja käyttää sitä liitospisteenä.

OpenSSH server (http://www.openssh.com)

Etäpalvelimen osalta asetusten tekeminen on helppoa: tarvitaan vain toimintakuntoinen OpenSSH-palvelin. Mikäli ssh-yhteys muilta tietokoneilta palvelimeen on kunnossa, ei myöskään sshfs:n käytössä pitäisi olla ongelmia.

OpenSSH client (http://www.openssh.com)

Vaikka sshfs toimiikin ilman erityistä virittelyä, on pidemmän päälle helpompaa, jos tiedostojärjestelmiä liitettäessä ei aina tarvitse kirjoittaa salasanaa. Kirjautuminen palvelimelle ilman salasanaa onnistuu, jos käytetään julkiseen ja yksityiseen avaimeen perustuvaa todennusta (engl. public key authentication). Avain luodaan jokaisella asiakaskoneella ja jokaiselle käyttäjälle erikseen. Avaimen luomisen jälkeen avainparin julkinen osa (engl. public key) lisätään palvelimelle halutun käyttäjän tiedostoon ~/.ssh/authorized_keys. Yksityinen avain jää ainoastaan asiakaskoneelle: sitä ei kopioida palvelimelle.

Asia lienee helpointa hahmottaa esimerkin avulla. Alla luodaan asiakaskoneella julkinen avain, joka kopioidaan palvelimelle 192.168.50.1. Salasanaa ei ole syytä antaa, mikäli haluaa päästä palvelimen resursseihin käsiksi ilman salasanaa.

samuli@localhost:~$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/samuli/.ssh/id_dsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/samuli/.ssh/id_dsa.
Your public key has been saved in /home/samuli/.ssh/id_dsa.pub.
The key fingerprint is:
dd:ae:ad:6c:af:41:49:2d:78:57:4b:60:54:bb:62:6b samuli@localhost
samuli@localhost:~$

Avaimen luonnin jälkeen sen julkinen osa kopioidaan palvelimelle, käyttäjän samuli kotihakemistoon:

samuli@localhost:~$ cat ~/.ssh/id_dsa.pub|ssh samuli@192.168.50.1 "cat >> ~/.ssh/authorized_keys"
Edellisessä komennossa putkitetaan cat-ohjelman avulla julkinen avain ssh:n läpi palvelimen cat-ohjelmalle, joka lisää sen luotettujen avainten listaan. Mikäli palvelimen käyttäjän kotihakemistossa ei ole hakemistoa .ssh, antaa komento virheilmoituksen. Asian voi korjata esim. käynnistämällä ssh-ohjelma palvelimella ko. käyttäjänä, jolloin tarvittava hakemisto luodaan automaattisesti.

Kun avain on luotu, kokeillaan, toimiiko avaimeen perustuva todennus:

samuli@localhost:~$ ssh samuli@192.168.50.1
Linux localhost 2.6.13 #1 Sat Jan 14 11:24:06 EET 2006 i686 GNU/Linux

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.

Last login: Tue Apr 25 18:48:29 2006 from 192.168.50.50
samuli@localhost:~$

Koska salasanaa ei kysytty, julkiseen avaimeen perustuva todennus näytti toimivan. Mikäli salasanakysely tulee edelleen vastaan, varmista ainakin seuraavat asiat:

Kun asiakaskoneelta pääsee ilman salasanaa palvelimelle, on aika kokeilla sshfs:n käyttöä. Allaolevassa esimerkissä luodaan asiakaskoneelle hakemisto, johon palvelimen päähakemisto eli "/" liitetään.

samuli@localhost:~$ mkdir ~/palvelin
samuli@localhost:~$ sshfs samuli@192.168.50.1:/ ~/palvelin

Mikäli verkkoyhteys asiakkaan ja palvelimen välillä on kunnossa, pitäisi näiden komentojen jälkeen asiakkaan hakemistosta ~/palvelin päästä käsiksi palvelimen tiedostoihin palvelimen käyttäjän oikeuksin. Tiedostojärjestelmän irroittaminen (engl. unmount) ei kuitenkaan tapahdu sshfs-komennolla, vaan komennolla fusermount:

samuli@localhost:~$ fusermount -u ~/palvelin
samuli@localhost:~$ ls -l ~/palvelin
yhteensä 0
samuli@localhost:~$

Sshfs -tiedostojärjestelmien liittämisen/irroittamisen nopeuttaminen

Kun sshfs toimii, voidaan tiedostojärjestelmän liittäminen ja irroittaminen tehdä yksinkertaisemmaksi esim. allaolevalla bash-skriptillä. Skripti toimii Debian Etchissä, mutta esimerkiksi Ubuntu 5.1:ssä siihen täytyy tehdä pieniä muutoksia johtuen sshfs:n muuttuneesta syntaksista ja $USERNAME -muuttujan puuttumisesta (Ubuntussa $USER).

#!/bin/bash
# Tämä skripti liittää tai irroittaa sshfs-tiedostojärjestelmän
# riippuen siitä, onko tiedostojärjestelmä liitettynä vai ei.
# Skriptiä pitää muokata mikäli yksittäinen käyttäjä haluaa liittää
# useampia kuin yhden tiedostojärjestelmän

SERVER="192.168.50.1"
LOGIN_ID=$USERNAME
LOCAL_MOUNTPOINT="$HOME/palvelin"
REMOTE_ROOT="/"
PORT="22"

if test -z "$(cat /etc/mtab|grep sshfs|grep $USERNAME)"; then
        echo "Liitetään palvelimen hakemisto "$REMOTE_ROOT" liitoskohtaan "$LOCA
L_MOUNTPOINT" käyttäjän "$LOGIN_ID" oikeuksin"
        sshfs $LOGIN_ID@$SERVER:$REMOTE_ROOT $LOCAL_MOUNTPOINT -o -p $PORT
else
        echo "Irroitetaan sshfs tiedostojärjestelmä palvelimelta "$SERVER
        fusermount -u $LOCAL_MOUNTPOINT
fi