Hogyan hozhatunk létre SFTP felhasználót shell hozzáférés nélkül Linux rendszerünkön

botond küldte be 2021. 01. 20., sze – 22:38 időpontban

Tartalom

 

Bevezető

Adódhat úgy, hogy szeretnénk másokkal megosztani nagyobb méretű fájlokat, vagy éppen fogadni azokat, amik már nem férnek bele egy emailba. Erre a célra természetesen vannak ingyenes fájlmegosztók is, de ha gyakrabban van szükség kétirányú adatátvitelre például távmunka során, akkor célszerűbb ha magunk oldjuk ezt meg. Erre kiválóan alkalmas az SFTP (SSH File Transfer Protocol), ami egy biztonságos fájlátviteli megoldást kínál SSH kapcsolaton keresztül, ellentétben a titkosítás nélküli és elavult FTP kapcsolattal. Az SFTP alapból elérhető minden olyan kiszolgálón, ahol SSH hozzáférés is van. Ebből eredően jelen helyzetben az SSH kapcsolatnak annyi szépséghibája van, hogy ez egy shell hozzáférést is biztosít, amire itt most pont nem lesz szükségünk, mert nem szeretnénk, ha az általunk megosztott hozzáférésen keresztül be tudnának lépni számítógépünk más könyvtáraiba is, és még parancsokat is futtathatnának, hanem azt szeretnénk, hogy csak ahhoz a könyvtárhoz férhessenek hozzá, amelyikhez mi engedélyezzük. Ebben a leírásban megnézzük hogyan hozhatunk létre SFTP felhasználót shell hozzáférés nélkül Linux rendszerünkön.

Ebben a példában az asztali gépemen hozok létre egy csak SFTP-re korlátozott felhasználót, és a laptopomról fogok belépni rá.

 

 

Előfeltételek

Először telepítenünk kell egy SSH szervert, ha még nincs a gépünkön:

sudo apt-get install ssh openssh-server

Ezután már minden shell felhasználóval távolról is be tudunk lépni a számítógépre, illetve SFTP kapcsolatot is létesíthetünk. Ezek közül most csak az utóbbira lesz szükségünk, így majd le kell tiltanunk a felhasználót a parancssortól.

 

Felhasználó létrehozása

Létre kell hoznunk egy új felhasználót a rendszerben, amivel majd csatlakozni fogunk SFTP-n keresztül. A felhasználónk neve ebben a példában legyen "megosztas1". Természetesen bármilyen felhasználónevet adhatunk. A létrehozásához lépjünk be root-ként, majd futtassuk az alábbi useradd parancsot:

useradd megosztas1 -s /sbin/nologin -M

A -s kapcsolóval megadunk a felhasználónak egy másik shellt. Ebben az esetben ezt a nologin paranccsal helyettesítjük. Ezzel biztosítjuk a felhasználót, hogy nem lehet vele belépni a parancssorba. A -M kapcsolóval pedig arra utasítjuk az useradd programot, hogy ne hozzon létre a felhasználónak home könyvtárat sem, mert majd külön beállítjuk hogy melyik könyvtárhoz férhet hozzá.

Ezután adjunk neki egy jelszót:

passwd megosztas1

Ha megvan, ki is próbálhatjuk a su paranccsal, hogy valóban nem tudunk-e belépni ezzel a felhasználóval:

su -l megosztas1

A -l kapcsoló hatására login shell-ként próbálna belépni, tehát belépne a felhasználó home könyvtárába is, ami nem sikerül neki, mivel nincs home könyvtára. Majd utána pedig kiadja a nologin parancs által adott hiba kimenetet: "This account is currently not available.". Így tehát a parancs két hibaüzenetet is dob nekünk, majd visszakerülünk a root parancssorhoz:

Korlátozott felhasználó létrehozása és kipróbálása

Tehát eddig van egy felhasználónk, amivel nem lehet belépni a parancssorba.

 

SFTP könyvtár létrehozása és beállítása

 

 

Az SFTP könyvtárhoz az OpenSSH szerver chroot beállítását fogunk alkalmazni. Ennek viszont olyan követelménye van, hogy a beállított chroot könyvtárat a root-nak kell birtokolnia, és senki más felhasználó vagy csoport nem írhatja. Ha az SFTP hozzáférésünkkel írni is szeretnénk tudni, azaz fájlokat feltölteni, akkor létre kell hozni ez alatt a chroot könyvtár alatt egy olyan alkönyvtárat, aminek a tulajdonosa maga a felhasználó. Dokumentáció.

Ebben a példában a /var/sftp/xxx struktúrát fogjuk kialakítani, ahol az xxx alkönyvtár lesz az SFTP felhasználó által írható alkönyvtár, ami itt most megegyezik majd a felhasználó nevével. Persze a könyvtárak nevei bármik lehetnek, csak célszerű olyan struktúrát kialakítani, hogy később, esetleg több SFTP felhasználó esetén se keveredjünk bele. Akár a rendes /home könyvtárstruktúrát is használhatnánk erre a célra, de célszerű különválasztani az SFTP részt a rendes felhasználóktól, így nem kell megbolygatnunk sem a /home könyvtárstruktúrát, sem a normál felhasználók SSH működését.

Root-ként maradva hozzuk tehát létre a felhasználónknak a könyvtárát:

mkdir -p /var/sftp/megosztas1

Ellenőrizzük a chroot könyvtárunk, azaz a /var/sftp jogosultságát és tulajdonosát:

stat -c "%a %U %G %n" /var/sftp

Ennek maximum 755-nek kell lennie, tehát nem írhatja sem a csoport, sem a többi felhasználó, valamint a tulajdonosának is a root-nak kell lennie. Létrehozáskor alapból így is jön létre, ha csak nincs elállítva az umask. Ha nem ezek a tulajdonos és jogosultság beállítások vannak a könyvtáron, akkor állítsuk be.

Ezután állítsuk át a chroot alatt lévő felhasználói könyvtár tulajdonosát és jogosultságát is:

chown megosztas1:megosztas1 /var/sftp/megosztas1
chmod 700 /var/sftp/megosztas1
Ha ugyanazon chroot könyvtár alatt több SFTP felhasználói könyvtárat helyezzük el, akkor célszerű levenni a jogosultságokat 700-ra, hogy az SFTP felhasználók ne láthassák egymás könyvárának tartalmát, mert alapból a chroot alatti részekhez olvasási jogosultsága van a felhasználóknak, így át is tudnak lépni egymás könyvtárába. A chmod 700 beállítással pedig levéve az olvasási jogot, nem tudják listázni egymás könyvtárát.
Ha teljesen el szeretnénk szeparálni egymástól a felhasználókat, akkor természetesen mindegyik felhasználó esetén külön chroot könyvtárat kell alkalmazni, ami ebben az esetben még egy könyvtárszint bevonását igényli (így például a /var/sftp/megosztas1 lenne a chroot könyvtár a root tulajdonossal, és mondjuk a /var/sftp/megosztas1/megosztas1 lenne az ebben lévő írható könyvtár a felhasználói tulajdonossal). Ebben a példában viszont csak egy közös chroot könyvtárat használunk az egyszerűség kedvéért.

Ha tehát megvagyunk a könyvtár struktúrával is, akkor így néz ki az egész idáig:

SFTP chroot könyvtár beállítása

 

SSHd beállítása az SFTP számára

Ha idáig megvagyunk mindennel, akkor már csak az OpenSSH-szerver beállítása maradt hátra. Ehhez nyissuk meg szerkesztésre a /etc/ssh/sshd_config fájlt, majd adjuk a végéhez az alábbi részt:

Match User megosztas1
    ChrootDirectory /var/sftp
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no

Itt a sorok jelentése a kövekező:

  • Match User <felhasználónév>: Ez a rész azonosítja ezt az egész feltételes blokkot, ami csak akkor kerül végrehajtásra, ha egyezik a megadott felhasználó a belépett felhasználóval. Ha több felhasználónk is van, akkor vesszővel elválasztva lehet felsorolni őket. Ha külön chroot könyvtárat szeretnénk alkalmazni felhasználónként, akkor külön blokkokat kell létrehozni nekik, amikben meg vannak adva az eltérő chroot könyvtárak.
  • ChrootDirectory /var/sftp: Itt kell megadni a chroot könyvtárat, tehát amit a root birtokol, és más nem írhatja. Ezen belül lehetnek a felhasználók külön könyvtárai, amikbe tudnak írni is. A szerver ezeket a könyvtárakat a tulajdonosai alapján egyezteti össze az SFTP felhasználókkal, tehát a könyvtárnevek bármik lehetnek, így nem kell őket itt megadni. Azonban célszerű következetes könyvtárelnevezési módszert alkalmazni, így például ha megegyezik a felhasználó nevével, akkor biztosan nem keverjük össze őket.
  • AllowTcpForwarding no: Letiltja a TCP port továbbítást.
  • X11Forwarding no: Letiltja az X11 továbbítást.

Mentsük le a fájlt, majd indítsuk újra az SSH szolgáltatást:

systemctl restart sshd.service

Ezzel készen is állunk az SFTP használatára.

 

SFTP tesztelése

 

 

Mielőtt bárkinek is adnánk SFTP hozzáférést a gépünkhöz, előtte teszteljük a kapcsolatot.

Ha már rendelkezésre áll az SFTP kapcsolat, akkor azt többféleképpen is használhatjuk: alkalmi vagy perzisztens módon bemountolhatjuk Linux rendszereken, vagy Windows rendszerekből is elérhetővé tehetjük, vagy ha nincs rá folyamatosan szükségünk, akkor egyszerűen csak felcsatlakozunk egy kliens programmal. Ebben a részben kipróbáljuk néhánnyal az új SFTP fiókunkat.

SSH parancssori belépés tesztelése

Első körben ellenőrizzük, hogy valóban nem tudunk-e belépni a parancssorba ezzel a felhasználóval. A kliens gépen futtassuk a saját paramétereinkkel az ssh belépést. Nálam például:

ssh megosztas1@asztali

Majd miután megadtuk a jelszót, a következő hibát dobja: "This service allows sftp connections only. Connection to asztali closed." Tehát most már nem azt a hibát dobja, mint az elején, mint amit a nologin miatt kaptunk, hanem most már az OpenSSH szerver kezeli ezt a kapcsolatot. Így már biztosak lehetünk, hogy két helyen is le van tiltva a parancssori belépés.

SSH parancssori belépés ellenőrzése

 

Távoli SFTP fájlrendszer felcsatolása az sshfs parancssal

Ha a kliens számítógépen is Linux rendszert használunk, ahonnan be szeretnénk lépni az SFTP fiókba, akkor az sshfs linux parancs segítségével átmenetileg csatolhatunk fel SSHFS fájlrendszereket, amik a kliens gép újraindítása után megszűnnek. Használatához először telepítsük a programot:

apt-get install sshfs

Majd az alábbi szintaxissal csatolhatjuk fel a fájlrendszert (szintén root-ként):

sshfs -o allow_other <felhasználó>@<szerver>:</abszolút/elérési/út> </helyi/csatolási/pont>

A saját példánknál maradva először hozzunk létre a kliens gépen egy csatolási könyvtárat:

mkdir /mnt/sftp

Majd futtassuk a fentebbi parancsot a saját paramétereinkkel:

sshfs -o allow_other megosztas1@asztali:/ /mnt/sftp

Itt az abszolút elérési útnak megadhatjuk a gyökér könyvtárat is (/), vagy a struktúra bármelyik alkönyvtárát, amelyikre szükségünk van a munka során.

Ezután beléphetünk a csatolási könyvtárba, ahol már helyi könyvtárként használhatjuk az SFTP tárhelyünket:

SFTP használata az sshfs paranccsal

Ez egy kényelmes használati mód, mert ha egyszer felcsatoltuk, akkor utána bármelyik programmal helyi könyvtárként kezelhetjük. Ennek azonban még van két szépséghibája, mégpedig, hogy a gép újraindításakor újra futtatni kell a parancsot a csatlakozáshoz, valamint ahogy a képen is láthatjuk, hogy itt éppen nincs egyező UID-el rendelkező felhasználó, ezért a kiszolgálón lévő 5010-es UID-jű felhasználó a tulajdonosa. Ez viszont okozhat problémát is, mert ha a kliens gépen is van éppen egy ugyanilyen UID-el rendelkező felhasználó, akkor annak a nevében csatolja fel, ami nem biztos, hogy a megfelelő felhasználó. Ezért inkább használjuk a tartós felcsatolást, ahol a felhasználót is beállíthatjuk és a gép újraindítása után is újra felcsatlakozik. Erről részletesebben egy korábbi leírásomban tájékozódhatunk.

Ha már nincs szükség a kapcsolatra, akkor az umount parancs segítségével választhatjuk le, amit csak root-ként tehetünk meg:

umount /mnt/sftp

Belépés az sftp parancssori klienssel

 

 

Ha nem szeretnénk felcsatolni a fájlrendszert, akkor az sftp parancs segítségével kliensként csatlakozhatunk a parancssorban:

sftp megosztas1@asztali

Ekkor egy FTP-hez hasonló parancssort kapunk, amiben elvégezhetjük a szükséges fájlműveleteket.

Az sftp parancs használata

Belépés a FileZilla grafikus FTP/SFTP kliens segítségével

És végül jöjjön a jól ismert és közkedvelt FileZilla használata.

Nyissuk meg a kedvenc helyeket, majd kattintsunk az Új állomás gombra. Ekkor előjön a beállító ablak:

FileZilla - Kapcsolat beállítása

Itt állítsuk be a protokollt az "SFTP - SSH File Transfer Protocol" opcióra, a címhez írjuk be a kiszolgáló hosztnevét, vagy IP-címét, majd a port részbe ha az alapértelmezett 22-es portszámtól eltérő portot használunk, akkor itt adjuk meg, egyébként hagyjuk üresen. Majd adjuk meg a felhasználónevet és a jelszót és mentsük le a panelt.

Első csatlakozáskor előjön a szokásos ismeretlen kulcsos üzenet:

FileZilla - Ismeretlen kulcs figyelmeztetés

Jegyeztessük meg vele, majd csatlakozzunk.

FileZilla - Kapcsolódva

És újra előkerülnek a dolgaink az SFTP-ről.

 

 

Konklúzió

Így készíthetünk FTPS felhasználókat, fiókokat, amiket aztán biztonságosan használhatunk a titkosított SSH csatornán keresztül, anélkül, hogy a felhasználókkal be lehetne lépni a parancssorba.