Kategória: Linux a sieť

Zmenené: 1. apríl 2011

Použitie protokolu SFTP

Na slovenskom internete je ohľadom prenosu súborov stále éra protokolu FTP, so všetkými jeho nevýhodami a nedostatkami. Nájsť server, kde dostanete prístup cez SSH je síce možné, ale lacné to nie je. Myslím si však, že za to môže len neznalosť alebo lenivosť správcov, či poskytovateľov, pretože SSH server poskytuje aj bezpečný prenos súborov.

Že možno SSH využiť na prenos súborov nie je celkom neznáme a mnohí poznajú protokol SCP (Secure Copy), ktorý je používaný už dlho. Za hlavnú nevýhodu SCP považujem to, že je to neinteraktívny nástroj prenosu súborov. Neinteraktívny znamená, že musíte vopred vedieť, kde sa súbor nachádza, aby ste ho mohli preniesť. Masívnejšiemu rozšíreniu bráni aj to, že na jeho využívanie je potrebný prístup SSH, čomu sa mnohí správcovia serverov bránia.

Obe nevýhody SCP prakticky odstraňuje protokol SFTP. SFTP (SSH File Transfer Protocol) poskytuje bezpečnú obdobu starého známeho protokolu FTP. Narozdiel od FTP však používa iba jeden kanál, čím odpadajú problémy s aktívnym/pasívnym prenosom súborov, ale hlavne, používa zabezpečenie protokolu SSH, takže odchytenie hesla už nie je také prosté. Protokol SFTP vylepšuje aj SCP, pretože ponúka interaktívny režim, tak ako ho poznáte z klasického FTP. Skratka SFTP sa nápadne podobá na skratku FTPS a mnohí si ich môžu zamieňať, ale to je chyba, pretože FTPS len jednoducho pridáva k FTP bezpečnostný prvok (SSL/TLS), naproti tomu SFTP je kompletne odlišný protokol, ktorý len plní rovnaký účel.

Aby som bol spravodlivý, je treba spomenúť aj nevýhody. Neviem o žiadnych oproti SCP, viem však o jednej nevýhode v porovnaní s FTP, a tou je vyššia náročnosť na zdroje (výkon), pretože prenos treba na jednej strane zašifrovať a na druhej zase rozšifrovať. S najvčšou pravdepodobnosťou to pri dnešných počítačoch na strane klienta nepocítite, ale na vyťaženom SFTP serveri to treba mať na pamäti.

Potrebný softvér

Aby ste mohli používať SFTP, potrebujete dve veci server a klienta. Začnem klientom, pretože to bude kratšie. K dispozícii je klient príkazového riadku sftp (súčasť balíka openssh-client), ale i grafické nástroje ako FileZilla (Windows i Linux) a WinSCP (len Windows), takže v tomto smere problém nie je. Na druhej strane je potrebný server a všetko potrebné poskytuje od verzie 4.8 OpenSSH server (v balíku openssh-server). Podpora SFTP je v Debiane štandardne zapnutá hneď po inštalácii, takže ak ste si nainštalovali server, môžete SFTP hneď využívať.

Výber SFTP

Ako so m spomínal vyššie, v Debiane je podpora SFTP štandardne zapnutá. Ak ju nechcete, môžete ju vypnúť, alebo môžete rozhodnúť, ktorý SFTP server bude využitý, pretože OpenSSH prichádza s jeho dvomi podobami. Jednou podobou je samostatný program sftp-server a druhou je jeho interná obdoba, nazvaná internal-sftp, teda server riešený interne démonom sshd. Výber je relatívne jednoduchý a postará sa o to jedna voľba v konfiguračnom súbore (ktorý je v /etc/ssh/sshd_config), konkrétne riadok:

Subsystem sftp /usr/lib/openssh/sftp-server

V prípade, že nechcte SFTP server používať, jednoducho túto voľbu zakomentujte a reštartujete SSH server. Ak chcete používať interný SFTP server (dôvody nižšie), tak tento riadok zmeňte takto:

#Subsystem sftp /usr/lib/openssh/sftp-server
Subsystem sftp internal-sftp

Neočakávajte, že bude spustené ďalšia služba, ani otvorený ďalší port. Či už použijete interný alebo klasický SFTP server, v oboch prípadoch bude komunikácia prebiehať cez port 22, prípadne cez iný, ktorý ste si nastavili pre svoj SSH server.

Iba SFTP

Obavy správcov o poskytovanie prístupu k shellu (aj pomocou ssh) väčšinou nie sú opodstatnené, ale sú skôr prejavom neznalosti daného správcu (hoci pravdou je, že ťažšie sa do servera nabúra ten, kto k nemu nemá prístup). Pokusy o riešenie tohoto problému sa objavili už dávno a za všetky spomeniem špeciálny shell scponly, ktorý (ako názov napovedá) si kládol za cieľ poskytnúť používateľom výhody bezpečného prenosu súborov (cez SCP) bez toho, aby získali možnosť prihlásenia sa na server.

Pri použití SFTP to však na to poslúži blok Match, ktorý okrem iných možností poskytuje aj spôsob, pomocou ktorého možno vynútiť použitie nastavenie len pre skupinu používateľov. Celé to je v podstate jednoduché, začnite vytvorením samostatnej skupiny, napríklad s menom sftponly:

addgroup sftponly

Do tejto skupiny pridajte všetkých používateľov, ktorí majú mať k serveru prístup len k službe SFTP, teda bez prístupu k prihláseniu cez SSH, napríklad:

addgroup jozko sftponly

Po tejto príprave ostáva už len nastaviť SSH server tak, aby tejto skupine používateľov dovolil len použitie SFTP. Na koniec konfiguračného súboru servera SSH teda pridajte:

Match group sftponly
    ForceCommand internal-sftp
    X11Forwarding no
    AllowTcpForwarding no

Tento príklad ukazuje použitie s interným SFTP serverom, ale môžete to rovnako dobre použiť aj so štandardným. O samotné vylúčenie prihlásenia sa postará voľba ForceCommand. Ako je vidno v príklade, do bloku Match možno pridať i ďalšie konfiguračné voľby a voľba Match sa postará o to, že budú použité len vtedy, keď je splnená podmienka, v tomto prípade len na členov skupiny sftponly.

Pripomeniem ešte raz, že celý blok Match musí byť na konci súboru, pretože do seba zhrnie všetky voľby až po nasledujúci blok Match alebo koniec súboru.

Chroot

Prostredie chroot je špeciálne prostredie, ktoré klamlivo vytvára koreň (začiatok) súborového systému tak, aby sa používateľ nemohol dostať mimo neho. Názov chroot je odvodený do spojenia change root, v zmysle koreňa súborového systému, nie používateľa root. Nie je všeliekom, ale poskytuje dodatočnú ochranu pred tým, aby používatelia behali po systéme kde sa im zachce. Princíp je jednoduchý používateľ nemôže zmeniť nič, k čomu nemá prístup. Problémom takéhoto zamknutia používateľa je, že do tohoto nového začiatku súborového systému je potrebné prekopírovať programy a súbory, ktoré by mohol používateľ potrebovať. Za všetky spomeniem shell, súbory zariadení, či súbory so zoznamom skupín a používateľov (preto sa tomu hovorí prostredie chroot). Hoci nebýva ťažké takéto prostredie vytvoriť (existujú na to skripty), ťažšie býva takéto prostredie udržiavať v aktuálnom stave najmä ak ich je viac.

Práve tu prichádza úloha interného SFTP servera, ktorý dokáže používateľov SFTP zamknúť, a to bez potreby prípravy prostredia chroot. O celé zamknutie sa postará voľba ChrootDirectory, ktorá je v OpenSSH k dispozícii od verzie 4.9. Jej použitie je jednoduché, pretože stačí pridať do bloku Match ďalšiu voľbu, napr.:

Match group sftponly
    ForceCommand internal-sftp
    ChrootDirectory /srv/sftp
    X11Forwarding no
    AllowTcpForwarding no

Použitie voľby ChrootDirectory v uvedenom bloku Match zaistí, že bude aplikovaná len členov skupiny sftponly a nie ste pri tom obmedzení len na statické zadanie adresára, ale môžete využiť aj premenné:

  • %u je nahradené menom používateľa;
  • %h je nahradené domovským adresárom používateľa.

Avšak adresár zadaný vo voľbe ChrootDirektory a jeho obsah musí spĺňať dve jednoduché pravidlá. Najprv je to bezpečnostné pravidlo: všetky časti cesty, teda /srv/ i /srv/sftp/ musí vlastniť root a môžu byť zapisovateľné iba pre roota:

ls -ld /srv/ /srv/sftp/
drwxr-xr-x 5 root root 120 apr 1 17:36 /srv/
drwxr-xr-x 2 root root  48 apr 1 17:36 /srv/sftp/

V prípade, že toto pravidlo nie je splnené, bude prihlásenie k SFTP odmietnuté. Samozrejme, môžete byť ešte striktnejší:

ls -ld /srv/ /srv/sftp/
drwxr-x--- 5 root sftponly 120 apr 1 17:36 /srv/
drwxr-x--- 2 root sftponly  48 apr 1 17:36 /srv/sftp/

Druhé pravidlo už nie je také striktné a v prípade jeho nedodržania k odmietnutiu prihlásenia nedôjde, zato však môže byť mätúce a týka sa domovského adresára používateľa. V dokumentácii sa dočítate, že po prihlásení k SFTP bude používateľ prepnutý do jeho domovského adresára. Predpokladám, že každý, kto sa pustí do práce s chroot bude mať jasno v tom, že taký domovský adresár musí byť umiestnený v chroot, pretože mimo neho sa používateľ dostať nemá. Ak teda nastavíte používateľovi jozko domovský adresár na /srv/sftp/jozko, budete sklamaný, pretože po prihlásení k SFTP bude používateľ v koreni chroot.

Prečo je to tak? Jednoducho, chroot zmení koreň súborového systému a domovský adresár používateľa je hľadaný relatívne k tomuto koreňu, teda nie v adresári /srv/sftp/jozko, ale v adresári /srv/sftp/srv/sftp/jozko. Takže bu používateľovi tento adresár v chroot vytvorte, alebo jeho domovský adresár jednoducho nastavte na /jozko.

Záver

Asi vás to už napadlo, ale kvôli úplnosti to výslovne spomeniem. Nevýhodou takéhoto riešenia je, že používateľa nemôžete zamknúť do jeho domovského adresára, pretože by jeho domovský adresár musel vlastniť root a používateľ samotný by priamo v ňom nemohol vytvárať adresáre ani súbory, ale môžete ho zamknúť minimálne o jednu úroveň vyššie. Napriek tomu si myslím, že je to riešenie elgantné a jednoduché.