Bezpečné používání přístupového serveru
O čem je ten dlouhý text?
V následujícím textu si vysvětlíme proč a ukážeme jak bezpečně používat SSH pro přístup na servery bez přímého přístupu. Tedy v situacích kdy se např. na servery v rámci firemního prostředí připojujeme přes zprostředkující, tzv. přístupový server. V textu se zabýváme především vysvětlení co je a jak funguje tzv. „SSH agent forwarding“ a jak ho používat správně, na konci pak, jak se přihlašovat na vzdálené servery bezpečnějším způsobem.
Proč to potřebuju vědět?
Při přístupu k počítačovým prostředkům je z hlediska bezpečnosti důležité zajistit důvěrnost autentizačních nástrojů, jako např. privátních klíčů, které by v opačném případě mohly být použity k vystupování pod identitou oběti. Může to být podobný problém, jako když si někdo na váš občanský průkaz v bance zařídí finanční půjčku.
Když nechceme aby někdo uhádl naše heslo, používáme SSH klíče
Poměrně běžným bezpečnostním doporučením je vypnutí možnosti přihlášení na SSH server pomocí hesla a upřednostnění nebo i vynucení autentizace tzv. „ssh klíčem.“ Ten se skládá z privátní a veřejné části, přičemž privátní klíč by měl být uživatelem náležitě chráněn, tak aby jej mohl použít pouze oprávněný uživatel. Z tohoto důvodu se privátní klíč má běžně nacházet pouze na straně ssh klienta.
Proč někdy potřebujeme přístupový server (jumpserver)
SSH klient (např. opensource klient OpenSSH) je často používán pro bezpečný přístup na vzdálený server. V situaci kdy se tímto způsobem potřebujeme připojit na server, který není přístupný přímo z klientského počítače uživatele můžeme použít tzv. „přístupový server“ (taktéž se mu říká „jump server“), ze kterého už spojení s cílovým serverem možné je.
Když nepoužívám jumpserver tak se mě to netýká?
Výše popsaný problém se bohužel často týká i uživatelů, který jumpserver nepoužívají! SSH agent forwarding je totiž často zapnutý aniž by si to uživatelé uvědomovali.
Jak se ale na cílový server přihlásíme, když na přístupovém serveru není privátní klíč?
V situaci kdy potřebujeme pro připojení k cílovému serveru využít přístupového serveru by jsme mohli nabýt dojmu, že potřebujeme mít privátní klíč i na tomto přístupovém serveru. To by však mohlo znamenat zásadní ohrožení tohoto privátního klíče! Pro tento účel se tedy běžně využívá funkce „SSH agent forwarding“ (u OpenSSH přepínač „ssh -A“). Při přihlašování z přístupového serveru na server cílový, pak ssh klient spuštěný na přistupovém serveru komunikuje s ssh agentem běžícím na klientské straně a umožňuje tak použití privántího klíče uloženého na klientské straně pro přihlášení na cílový server. Privátní klíč tak není třeba z klientského počítače nikam kopírovat!
Přepínači -A/-a explicitně říkáme, zda serveru kam se hlásíme chceme, či nechceme umožnit komunikaci s ssh agentem prostřednictvím SSH agent forwardingu. Běžně použijeme SSH agent forwarding cca následovně.
Na svém notebooku máme v ssh agentovi nahraný klíč, přihlašujeme se na jumpserver a protože se z něj budeme potřebovat autentizovat na cilovy_server, povolujeme SSH agent forwarding (ssh -A).
[user@user-nb ~]$ ssh-add -l 256 SHA256:WeHvenxLK3gYXORFm2hed4MMee1 user@user-nb (ED25519) [user@user-nb ~]$ ssh user@jumpserver -A
Po úspěšném přihlášení, zkontrolujeme zda je funkční komunikace s ssh-agentem na našem notebooku (tedy funkční SSH agent forwarding).
[user@jumpserver ~]$ ssh-add -l 256 SHA256:WeHvenxLK3gYXORFm2hed4MMee1 user@user-nb (ED25519)
Z jumpserveru se přihlašujeme na cilovy_server. SSH agent forwarding zajistí, že se autentizujeme ssh klíčem z našeho notebooku. Protože se z cílového serveru už nebudeme přihlašovat nikam dál, explicitně říkáme (ssh -a), že cilovému serveru, už komunikaci s ssh agentem nepovolujeme.
[user@jumpserver ~]$ ssh user@cilovy_server -a [user@cilovy_server ~]$ ssh-add -l Could not open a connection to your authentication agent.
Jak ten „SSH agent forwarding“ funguje?
SSH příkaz spouštěný na přístupovém serveru si pro účely komunikace s ssh agentem běžícím na klientské straně vytváří na přístupovém serveru v privátním adresáři uživatele tzv. „socket“, což je na operačních systémech UNIXového typu speciální soubor, který lze s použitím dostatečných oprávnění číst a zapisovat do něj a rychlým způsobem tak komunikovat s programy, které tento socket používají.
Jak program ssh při spouštění pozná s kterým socketem si má povídat?
Cesta ke správnému socketu je v rámci prostředí přihlášeného uživatele používajího „SSH agent forwarding“ uložená v proměnné prostředí SSH_AUTH_SOCK a socket lze též nalézt přímo na souborovém systému jako jakýkoli jiný soubor. Použití socketu je chráněno stejně jako jakýkoli jiný soubor na disku jemu přiřazenými oprávněními.
Když je socket soubor na disku, nemůže ho použít někdo kdo by neměl?
Za normální situace může socket číst pouze příslušný uživatel, který socket vytvořil. V operačním systému však existují i uživatelé s vyššími oprávněními, jako např. root, případně můžeme uvažovat situaci kdy zvýšené oprávnění na přístupovém serveru získala osoba nepovolaná, či nedůvěryhodná.
Chceš tohle řešit u vás?
Napiš nám pár vět a ozveme se s návrhem dalšího kroku.
