Příkaz scp
, kterým se bezpečně kopírují soubory mezi vzdálenými počítači, je velmi pevně zakořeněn v myslích a prstech řady uživatelů a vývojářů unixových systémů. Většina uživatelů tuší, že je to náhrada za původně nezabezpečený rcp
. Nejde ale jen o vnější podobnost, ale i použitý protokol je podobně zastaralý a má řadu svých problémů.
Komunita okolo projektu OpenSSH se už před časem rozhodla koncept scp opustit a nahradit ho ale něčím modernějším, co zároveň pro uživatele nebude znamenat velkou změnu. Postupem času se ale ukazuje, že nejde o nijak snadný úkol.
cp, rcp a scp
Utility rcp
a scp
se snaží co možná nejvíce připomínat klasickou utilitu cp
. Cílem je udělat kopírování co nejjednodušší pomocí jednoduchého rozhraní. To umožňuje kopírovat soubory tam a zpět, včetně struktur zanořených v adresářích a třeba i kopírovat více souborů najednou pomocí zástupných znaků.
K tomu všemu přidává scp
bezpečný tunel vytvořený pomocí OpenSSH. Díky standardizovaným autentizačním a šifrovacím mechanismům se otevře bezpečné spojení na server a teprve přes něj se přenášejí soubory. Bohužel se ukázalo, že kvůli použitému protokolu je bezpečnost v některých situacích nižší, než by měla být.
Problém jménem scp
Příkladem může být chyba CVE-2019–6111, která byla opravena v OpenSSH 8.0. Podrobně jsme o ní psali v samostatném článku, protože šlo o poměrně závažnou věc. V zásadě jde o to, že když si klient vyžádal od serveru nějaký soubor, server mu mohl přibalit i nějaké jiné a ty se potichu také zapsaly klientovi na disk.
Napadený server tak měl možnost pomocí scp
napadat ostatní, protože mohl například přepisovat významné konfigurační soubory. Oprava spočívá samozřejmě v tom, že se klient při přijetí ujistí, že dostal skutečně jen ty soubory, o které žádal. Ovšem oznámení o vydání nové verze také uvádí, že protokol scp je „zastaralý, nepružný a snadno neopravitelný“.
Další chyba CVE-2020–15778 zase zneužívá toho, že se v scp
volá ssh
s parametrem -t
. Ten ovšem špatně ošetřuje svůj vstup a při použití zpětných apostrofů v názvu souboru se na druhé straně provede název souboru jako příkaz v shellu.
Dopady mohou být nepříjemné, protože je možné takto obejít omezení pro uživatele. Ten může mít v souboru authorized_keys
povoleno jen spouštění scp, ale díky tomuto mechanismu je schopen na cílovém systému spouštět libovolné příkazy. Zároveň je takto možné k akci zmanipulovat i neznalého uživatele, protože apostrofy se mohou objevit i v názvech souborů. Upravíte názvy souborů, uživatel je nahraje na server a spustí vámi připravené příkazy.
Tato chyba nebyla opravena vývojáři OpenSSH a jejich zdůvodnění zní: Příkaz scp využívá historického protokolu (jménem rcp), který se spoléhá na konkrétní způsob předávání argumentů a naráží na problémy s expanzí. Přidat „bezpečnost“ do modelu scp se ukázalo být velmi obtížným. Všechny pokusy o „detekci“ a „blokování“ přenosů s neobvyklými parametry přináší velké riziko rozbití současných postupů. Ano, my víme, že je to situace na houby. Nechceme ale rozbít jednoduché použití scp, dokud se za něj nenajde dobrá náhrada.
Kde vzít a nekrást
Otázkou tedy zní, co by tou náhradou podle vývojářů mělo být. Pravda je, že už tu máme dva protokoly s podobným určením: sftp
a rsync
.
Velkou výhodou sftp
je, že je už součástí OpenSSH a najdeme ho tedy prakticky ve všech instalacích. Nevýhodou naopak je, že jeho filosofie je jiná a neumožňuje ty nejjednodušší akce, které ale mají uživatelé scp
nejraději:
$ scp soubor server:
Proti tomu rsync
není v instalacích tak rozšířené, jde o samostatný software vydávaný pod GNU GPL 3. Navíc jde o velmi robustní nástroj, který příliš nepřipomíná jednoduchou utilitu scp
.
Příkaz scp
je navíc pevně zakořeněný v hlavách uživatelů, podobně jako dávno zastaralý příkaz ifconfig
.
Příkaz scp místo scp
Když si to celé shrneme, bylo by dobré mít nový příkaz scp
, který ale netrpí výše uvedenými problémy a místo původního protokolu používá jako svůj základ mnohem robustnější sftp
. Přesně takovou utilitu vyvinul Jakub Jelen z brněnského Red Hatu.
Podle jeho slov vše začalo při diskusi s vývojáři libssh
. Řešili jsme plány pro další vydání libssh a co je potřeba udělat před tím, než vydáme libssh 1.0. Jedna z věcí, které bychom se chtěli zbavit, je scp. Hlavně kvůli všem těm bezpečnostním chybám a problémům, které se objevily v posledních letech. Také kvůli tomu, že projekt OpenSSH dává od scp ruce pryč.
Zároveň uznává, že scp
je mezi uživateli velmi oblíbený nástroj. Všichni to pořád používají, protože vlastně není lepší náhrada.
Protože odezva v diskusi byla dobrá, rozhodl se Jakub vytvořit konkrétní řešení. Jde o příkaz s názvem scp
, který ale interně využívá zmíněné sftp
. Základní funkci už plní, ale některé volby zatím nejsou dostupné. Například kopírování mezi dvěma vzdálenými servery bez účasti klienta.
Jakub navrhl začlenění do Fedory místo původního scp
a odezva je zatím velmi dobrá. Někteří uživatelé se domnívají, že by nová implementace mohla být pomalejší, ale zatím neexistují žádná solidní měření, která by to potvrzovala či vyvracela. Ať už rychlejší či pomalejší, scp
potřebuje moderní náhradu.
Hlavní je bezpečnost
Podle Jakuba Jelena je zásadní hlavně otázka bezpečnosti. Spousta uživatelů scp ani neví, co vlastně používá. Stačí jim, že to má v názvu slovo ‚secure‘ a řeší to jejich problém,
vysvětluje.
Noví uživatelé se také tento příkaz naučí rychle, protože jeho použití je snadné. Prostě tu není jednoduchá alternativa, jak jinak zkopírovat soubor tam a zpět. Ano, jde to přes sftp, ale má to omezeni a je to složitější. Proti tomu je scp prostě jednoduché,
říká Jakub.
Nová varianta utility scp
používá interně protokol sftp a má možnost se vrátit k původnímu scp, pokud by něco nefungovalo. Například váš korporátní server má kvůli ‚bezpečnosti‘ vypnutý subsystém sftp v SSH,
dodává Jelen.
Podstatné je, že vznikne nová bezpečnější implementace scp
, která se bude používat stejně, jako ta předchozí. Nerozbijí se například ani skripty, které utilitu používají. Do budoucna se také dají očekávat další zlepšení. Ve výsledku bychom chtěli mít možnost zakázat scp na serveru. V tuto chvíli to jde jen smazáním
dodává Jakub Jelen./bin/scp
, což odstraní podporu i pro klienta a je celkově hodně křehké,
(Zdroj: LWN)