NAS

SFTP server pomocí Chroot jail

11.08.2021 | Tag Linux

OpenSSH nativně podporuje SFTP, chroot jail zase pomůže s bezpečností. V kombinaci je možné vytvořit vlastní Linux SFTP server bez instalace dalších utilit.

Úplně na začátku bude možná dobré nadhodit pár pojmů, které se často pletou. Tedy FTP, FTPS a SFTP. FTP je asi zřejmé – starý dobrý file transfer protokol pro přenos souborů. V dnešní době to není úplně dobrá volba, protože data přenáší v čisté formě a obsah se tedy dá odposlechnout. Proto přišla druhá zkratka – FTPS, což je vlastně FTP over SSL/TLS. Je to ochranná nadstavba FTP protokolu pomocí TLS a dříve pomocí SSL. SFTP pak jde úplně bokem. Jde o rozšíření SSH protokolu pro bezpečný přenos souborů. Není kompatibilní s FTP a společný má právě jen název, protože slouží ke stejné věci – přenosu souborů.

V Linuxu je velmi snadné SFTP server postavit pomocí OpenSSH a chroot jail. Pomocí chroot jail dosáhneme uzamčení SFTP uživatele na konkrétní adresářovou strukturu, aby nemohl procházet obsah celého serveru. Dále SFTP uživateli odebereme standardní shell, aby mohl využívat pouze SFTP subsystém a ne interaktivní SSH session na serveru.

Ještě bych udělala malou odbočku a zmínila SCP. SCP je také protokol pro bezpečný přenos dat po SSH. Na rozdíl od SFTP je opravdu jen pro přenos souborů, nedokáže nějaké robustnější operace. A nemá nativní podporu v OpenSSH. Reálně je možné postavit vlastní SCP server, ale není to tak elegantní a bezpečné jako v případě SFTP protokolu. Zmiňuji to z jednoho důvodu – pokud admin staví třeba úložiště pro zálohy z jednotlivých spravovaných zařízení, tak se tutově setká s tím, že každé zařízení podporuje jiný protokol, ať už je to SCP, SFTP, FTP a tak dále. A i když to svádí, SCP a SFTP nejsou zaměnitelné. Nejčistší řešení pro podporu vícero přenosových protokolů je podle mého nějaký komerční produkt, který se prostě jen nainstaluje a je hotovo. No, zpět k vlastnímu SFTP serveru.

Pro začátek nepotřebujeme nic víc než server s OpenSSH. Vytvoříme si nějakou plánovanou adresářovou strukturu, SFTP uživatele a skupinu a upravíme konfiguraci SSH serveru. Když budeme chtít machrovat, nastavíme SFTP uživateli ověření přes SSH klíč.

Prvně vytvoříme skupinu pro SFTP uživatele. Hodí se pro globální nastavení SSH serveru, kdy se SFTP konfigurace sváže s touto skupinou a ne s jednotlivými uživateli. Pomocí druhého příkazu ověříme, že se skupina v pořádku vytvořila, případně zjistíme, jaký má gid.

groupadd sftpusers

cat /etc/group | grep sftpusers

Dál připravíme adresářovou strukturu pro SFTP. Je důležité tady zmínit záludnost SSH chroot jailu. Nastavit správně chroot a oprávnění nad složkami je právě ten vořech celého řešení. Pomocí chroot, neboli change root měníme kořen adresářové struktury a uživatele tam zamkneme. Ten kořen musí patřit uživateli root (s oprávněním 755 pro úplnou přesnost). Pro samotného uživatele pak bude pro zápis k dispozici další podsložka, kterou bude vlastnit a mít k ní jako jediný práva. Na ukázkách bude patrnější, kam mířím, nicméně aby se dosáhlo stavu, kdy o sobě jednotliví uživatelé nevědí, je třeba se složkami trochu čachrovat.

Napřed vytvoříme celou adresářovou strukturu pro jednoho z uživatelů. Parametr -p zajistí, že se vytvoří všechny složky v cestě.

mkdir -p /sftp/labsftp/upload/

Pro funkčnost chroot jail změníme vlastníka na root pro cestu /sftp/labsftp a upravíme oprávnění.

chown root:root /sftp/labsftp

chmod 755 /sftp/labsftp

Dále vytvoříme samotného uživatele. Speciálního, který nebude mít standardní shell a home adresář. Mám za to, že těch cest pro přidělení neinteraktivního shellu je víc, na Debianu používám nologin. Pomocí parametrů specifikujeme členství ve skupině sftpusers, přidělení neinteraktivního shellu a domovský adresář, což je dříve připravená cesta. Nakonec se specifikuje název uživatele.

useradd -g sftpusers -s /usr/sbin/nologin -d /sftp/labsftp labsftp

Heslo následně nastavíme pomocí passwd. Takto jsme vytvořili uživatele, který nemá možnost se vzdáleně přihlásit k serveru. Použít SFTP mu umožníme v dalších krocích. Další příkaz opět slouží k ověření, že se uživatel vytvořil správně.

passwd labsftp

cat /etc/passwd | grep labsftp


SFTP2

Novému uživateli labsftp bude patřit složka upload, kam bude moci zapisovat soubory. Oprávnění doupravíme tak, aby složka sloužila jen tomuto uživateli.

chown labsftp:sftpusers /sftp/labsftp/upload/

chmod 700 /sftp/labsftp/upload/

Níže je pro ukázku výpis adresářové struktury pro dva testovací SFTP uživatele.

SFTP1

V posledním kroku upravíme nastavení SSH serveru, abychom celé SFTP řešení uvedli do chodu. Konfigurace SSH serveru se upravuje v sshd_config, který je standardně umístěný v /etc/ssh/sshd_config.

nano /etc/ssh/sshd_config

Konfigurace SFTP subsystému je na konci konfiguračního souboru. Prvně odkomentujeme řádek pro subsystém a místo specifikované cesty dáme internal-sftp. internal-sftp by měl být lepší v kombinaci s Chroot. Je to alternativa k sftp-server, což je také nativní subsystém SSH.

Subsystem sftp internal-sftp

Pomocí Match Group svážeme nastavení pouze s uživatelskou skupinou sftpusers. Přes ChrootDirectory zamkneme uživatele nad specifickou složkou. Zde je použito %h, což pro SSH znamená domovský adresář uživatele. DisableForwarding by měl být bezpečnostní prvek zakazující různé formy forwardu možné v SSH. Poslední řádek instruuje SSH, aby uživatele při přihlášení nasměrovalo do složky upload, což je v tomhle scénáři jeho osobní složka pro zápis souborů.

Match Group sftpusers

ChrootDirectory %h

DisableForwarding yes

ForceCommand internal-sftp -d upload


SFTP3

Po uložení nové konfigurace je potřeba SSH službu restartovat.

service ssh restart

Teď můžeme vyzkoušet, zda vše funguje dle plánu. Napřed přes sftp příkaz přímo na serveru. Po přihlášení bychom měli být přesměrováni do složky upload a být schopni pracovat se soubory.

SFTP4

Pokud zkusíme zavolat interaktivní shell, nepůjde to.

SFTP5

Podobně jsme na tom přes WinSCP. Při loginu specifikujeme, že chceme SFTP protokol. Opět se dostaneme do složky upload. Na obrázcích by to nebylo patrné, ale pokud vyskočíme ze složky upload, jsme v rootu. Výš už se nedostaneme. Do rootu není možné zapisovat, od toho je právě složka upload. Odsud můžeme vytvářet další podložky dle potřeby a dál pokračovat ve struktuře.

WinSCP1

To, co jsem předvedla výše, je jedna z možných cest nastavení Chroot jailu. Kombinovat chroot a strukturu adresáře lze opravdu různě podle vlastních potřeb. Způsob výše zajistí, že jednotliví uživatelé nebudou mít možnost dozvědět se o sobě navzájem a při přihlášení budou rovnou ve složce, kde mají pracovat.

Ještě pro takové doplnění můžeme rozběhat přihlašování pomocí klíče, což není ani u SFTP problém. U SFTP pro uživatele je to asi jasně zdůvodnitelné, ale už jsem viděla i síťový prvek, který striktně vyžadoval SSH klíče při odlívání backupů.

Jak vygenerovat klíče, to se řešilo třeba ve článku SSH klíče v Debianu a PuTTYgenu. Pro SFTP bude jen potřeba trochu upravit konfiguraci SSH serveru a využít jinou cestu k authorized_keys. Důvody pro jinou cestu mám dva. Prvně, v kombinaci s Chroot jail přístup k authorized_keys docela kravne, pokud je umístěný v domovském adresáři SFTP uživatele. Druhak bych řekla, že zrovna u SFTP je čistší, když authorized_keys bude umístěný bokem, a ne ve složce pro soubory.

Řekněme, že už máme krásný pár SSH klíčů. Protože authorized_keys vyžaduje specifické oprávnění, udělejme si pro veřejné části klíčů jednotlivých uživatelů nějakou strukturu. Já použila /opt/ssh_keys, ale viděla jsem třeba /var/ssh. Zde bude mít každý uživatel složku, ve které bude veřejný klíč / authorized_keys v jeho vlastnictví.

mkdir -p /opt/sftp_keys/labsftp2

chown labsftp2:sftpusers labsftp2/

chmod 700 labsftp2/

mv id_ed25519.pub opt/sftp_keys/labsftp2/authorized_keys

chown labsftp2:sftpusers authorized_keys

chmod 400 authorized_keys

Pro ukázku jsem zahrnula i příkazy pro přesun veřejné části klíče do složky a nastavení oprávnění, ale pravda, není to úplně vypovídající, protože v rámci labu dělám vše na jednom serveru. Za normálních okolností asi nebudete klíče generovat přímo na tom SFTP serveru.

Klíče jsou vyřešené, teď je třeba SSH říct, kde má veřejnou část klíče hledat krom standardní cesty. V sshd_config je zakomentovaná část AuthorizedKeysFile, kterou odkomentujeme a přidáme tam vlastní cestu. %u v cestě znamená uživatel, je to stejný syntax jako u specifikace ChrootDirectory. Díky tomuto, i kdybychom měli uživatelů x, pokud se zachová stejná konvence, nemusí se už do konfigurace SSH sahat. Konfig uložíme a SSH službu restartujeme.

nano /etc/ssh/sshd_config

AuthorizedKeysFile .ssh/authorized_keys /opt/sftp_keys/%u/authorized_keys

service ssh restart

V aktuálně nastíněné konfiguraci je na výběr – klíč či heslo, obojí funguje pro všechny uživatele. Konfigurace SSH se následně dá upravit tak, aby brala jen jednu z variant, a to na úrovni serveru, skupiny, nebo jednotlivého uživatele. Níže je třeba kus konfigurace, který zakazuje přihlášení pomocí hesla labsftp2 uživateli. Pro něj bude fungovat jen klíč. Ostatním půjde klíč i heslo.

SFTP6

Poslední tip - jak zavolat sftp na Linux prostředí s použitím SSH klíčů. Soubor s privátní částí se uvede jako -o (option) IdentityFile.

sftp -o IdentityFile=/opt/sftp_keys/labsftp/id_rsa labsftp@192.168.56.110

Trochu záměrně jsem vynechala povídání o vnitřní struktuře SFTP serveru, protože už tak je tenhle příspěvek dost dlouhý, ale je jasné, že vytvořit minimálně nějaký oddělený diskový oddíl a nastavit kvóty (což Linux samozřejmě také umí) pro uživatele není vůbec od věci. Mám to jako téma na další článek, ale prozatím konec zvonec.