2.5. Přihlašování z UNIXu či z macOS – program ssh a další

V UNIXu i na macOS je obvykle součástí základní instalace klientská část OpenSSH – řádkové příkazy pro přihlašování na vzdálený server pomocí protokolu SSH. Příkazy se používají v terminálovém okně (příkazovém řádku), příslušná aplikace se může jmenovat Terminal, Konsole, rxvt, Xterm, LXTerminal, ETerm, Guake – závisí na konkrétním operačním systému a použité grafické nadstavbě.

Příkazy můžete zadávat i v programu PuTTY – přihlásíte se např. na server bis.vse.cz a z něho se budete hlásit na další server.

Tento popis bude méně podrobný, je to doplněk k předchozí kapitole.

2.5.1. Základy používání programu ssh

Začneme přihlášením pomocí hesla, uživatelské jméno se zadává před jménem serveru oddělené znakem @:

ssh pavlicek@bis.vse.cz

Při prvním přihlášení se objeví dotaz na ověření platnosti otisku veřejného klíče serveru:

The authenticity of host 'bis.vse.cz (146.102.18.87)' can't be established.
RSA key fingerprint is 30:14:af:4b:64:89:4f:42:86:aa:92:63:98:22:09:ad.
Are you sure you want to continue connecting (yes/no)?

Po ověření a zadání yes se veřejný klíč uloží do souboru .ssh/known_hosts a objeví se dotaz na heslo:

Warning: Permanently added 'bis.vse.cz,146.102.18.87' (RSA)
to the list of known hosts.
pavlicek@bis.vse.cz's password:

Při příštím přihlášení se dotaz na potvrzení klíče již neobjeví. Pokud server změní svůj veřejný klíč, tak se nepřihlásíte – musíte v editoru otevřít soubor .ssh/known_hosts, smazat údaj o klíči pro server a až poté se můžete přihlásit s ověřením nového veřejného klíče.

Jméno uživatele lze zadat i pomocí parametru -l. Pokud se jméno nezadá, tak se použije uživatelské jméno používané v lokálním operačním systému.

ssh -l pavlicek bis.vse.cz

ssh bis.vse.cz

Při problémech s připojením zadejte parametr -v a budou se zobrazovat podrobné informace o připojení:

ssh -v pavlicek@bis.vse.cz

2.5.2. Konfigurace klienta .ssh/config

Parametry konkrétních spojení lze zapsat do souboru .ssh/config, tj. v domovském adresáři na Vašem notebooku v podadresáři .ssh vytvoříte soubor config. V první ukázce definuji pro jméno bis.vse.cz uživatelské jméno, které se má používat (tj. nemusím ho poté zadávat v každém příkazu):

Host bis.vse.cz
   User pavlicek

Mohu si i zkrátit celé jméno bis.vse.cz na bis - v konfiguračním souboru mám doplněno i Hostname:

Host bis
   Hostname bis.vse.cz
   User pavlicek

V následující ukázce se při připojení k serverům se jménem začínajícím řetězcem raspberry doplní uživatelské jméno pi 34 a nastaví parametry pro udržování spojení.

Host raspberry*
   User pi
   ServerAliveInterval 60
   ServerAliveCountMax 10
   TCPKeepAlive no

Podrobný popis možností souboru .ssh/config získáte v manuálové stránce po zadání příkazu:

man ssh_config

2.5.3. Vygenerování a zkopírování klíče

Uživatel si vygeneruje svoji dvojici soukromý/veřejný klíč pomocí programu ssh-keygen. Bez zadání dalších parametrů se generují RSA klíče o délce 2048 bitů (v některých operačních systémech může být odlišné nastavení). Doporučuji ale generova klíče typu ed25519, které jsou bezpečnější, ale na některých starších systémech nemusí být podporovány. Pokud vygeneruje klíč RSA o délce 2048, tak to není chyba.

Program se zeptá na jméno souboru pro uložení soukromého klíče (doporučuji neměnit) a na heslovou frázi k soukromému klíči.

ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/pavlicek/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/pavlicek/.ssh/id_ed25519.
Your public key has been saved in /home/pavlicek/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:SoJ8f8yuyUu9Hzghpops8tdvFoe/mBmhPlemh4pos0A pavlicek@localhost

Soubor .ssh/id_ed25519 obsahuje soukromý i veřejnou část klíče a je chráněný heslovou frází. Vznikne i druhý soubor .ssh/id_ed25519.pub, který obsahuje veřejný klíč ve formátu vhodném pro vložení do authorized_keys.

Program ssh-keygen umí vygenerovat i další typy klíčů, lze zadat délky klíčů, lze změnit heslo u klíčů. Přehled všech možností získáte v manuálových stránkách:

man ssh-keygen

Před přihlášením pomocí klíče musíte zkopírovat veřejný klíč ze souboru .ssh/id_ed25519.pub (popř. ze souboru .ssh/id_rsa.pub při RSA) do souboru .ssh/authorized_keys na cílovém serveru. Do cílového souboru můžete klíč vložit pomocí editoru (viz kapitola 1.4.5), lze použít i pomocný skript ssh-copy-id, který zkopíruje veřejný klíč na cílový server.

ssh-copy-id pavlicek@bis.vse.cz

2.5.4. Přihlašování pomocí klíče

Pokud existuje soubor .ssh/id_ed25519 (či soubory .ssh/id_rsa nebo .ssh/id_ecdsa) 35, tak program ssh nejdříve zjišťuje, zda se lze pomocí tohoto klíče přihlásit na vzdálený server. Pokud ano, tak se následně zeptá na heslo k soukromému klíči:

ssh pavlicek@bis.vse.cz
Enter passphrase for key '/home/pavlicek/.ssh/id_ed25519':

Podobně jako u PuTTY můžete klíč (klíče) nahrát do paměti a následně při každém přihlášení nemusíte zadávat heslo. V textovém rozhraní se používá program ssh-agent či gpg-agent se stejným API 36.

Program ssh-agent se obvykle spouští následujícím způsobem:

# na vlastním notebooku, ne na bis.vse.cz!!!
eval "$(ssh-agent -s)"

SSH klíč poté přidáte pomocí programu ssh-add:

# na vlastním notebooku, ne na bis.vse.cz!!!
ssh-add
Enter passphrase for /home/pavlicek/.ssh/id_rsa:
Identity added: /home/pavlicek/.ssh/id_rsa (/home/pavlicek/.ssh/id_rsa)

Nyní se již můžete přihlásit bez zadávání hesla (ssh pavlicek@bis.vse.cz).

Můžete též jednorázově spouštět programy na vzdáleném serveru a výstup si ukládat lokálně, viz následující výpis souborů:

ssh pavlicek@bis.vse.cz 'ls -l' > bis_soubory.lst

2.5.5. Kopírování souborů – programy scp a sftp

Součástí OpenSSH jsou programy scp a sftp pro kopírování souborů, které mají podobné ovládání jako pscp a psftp z PuTTY. Následující syntaxe obsahuje nejčastěji používané parametry programu scp 37:

scp [-3pr] [[user@]host1:]file1 [[user@]host2:]file2

-3

kopíruje se mezi dvěma vzdálenými servery,

-p

snaží se u kopírovaných souborů nastavit čas a další atributy dle zdroje,

-r

rekurzivní kopírování, kopíruje se obsah podadresářů,

[[user@]host1:]file1

odkud se kopíruje, lokální či vzdálený soubor/adresář,

[[user@]host2:]file2

kam se kopíruje, lokální či vzdálený soubor/adresář.

Následují dva příklady použití programu scp:

# zkopírování soubor seznam ze serveru bis.vse.cz do lokálního adresáře
scp pavlicek@bis.vse.cz:seznam .
# zkopírování adresáře obrazky na server bis.vse.cz do domovského adresáře
scp -r obrazky pavlicek@bis.vse.cz:

Program sftp používá podobné ovládání jako řádkový klient pro protokol ftp. Dostupné povely zjistíte z manuálových stránek:

man sftp

Uživatelé s grafickým rozhraním na lokálním počítači mají většinou k dispozici nějakou GUI aplikaci pro zobrazení adresářů a kopírování souborů přes SSH.

2.5.6. Tunely

SSH klient podporuje všechny typy tunelů: lokální (Local, Forward), vzdálené (Remote, Reverse), dynamické (Dynamic, Proxy) i X11 tunely pro spouštění grafických aplikací na vzdáleném počítači. Následuje syntaxe programu ssh související s tunely:

ssh [-fNXY] [-D port] [-L port:host:hostport] [-R port:host:hostport] [user@]hostname [command]

-f

vytvoření tunelu na pozadí, používá se např. pro spuštění grafické aplikace,

-N

nespustí se vzdálený příkaz, tj. pouze tunelování,

-X, -Y

vytvoření tunelu pro grafické (X11) aplikace, -Y je bezpečná varianta k -X,

-D port

vytvoření dynamického tunelu,

-L port:host:hostport

vytvoření lokálního tunelu,

-R port:host:hostport

vytvoření vzdáleného tunelu.

Následuje vytvoření tunelu, který bude poslouchat na portu 7000 na lokálním počítači a provoz bude tunelovat do databáze MySQL na bis.vse.cz (což je localhost na druhé straně tunelu):

ssh -L 7000:localhost:3306 -N pavlicek@bis.vse.cz

Následující lokální tunel přesměrovává provoz z lokálního portu 7000 na MySQL server na počítači kitscm.vse.cz 38:

ssh -L 7000:kitscm.vse.cz:3306 -N pavlicek@bis.vse.cz

Vzdálený tunel poslouchá na portu 8000 na serveru bis.vse.cz (druhý konec SSH spojení) a přesměrovává provoz přes lokální stanici na server telehack.com na port 23:

ssh -R 8000:telehack.com:23 -N pavlicek@bis.vse.cz

V tomto případě je vhodné vynechat parametr -N, abyste se přihlásili na bis.vse.cz a současně se vytvořil tunel. Po přihlášení se můžete připojit na vstupní bod tunelu na portu 8000 vytvořený na bis.vse.cz příkazem telnet localhost 8000.

ssh -R 8000:telehack.com:23 pavlicek@bis.vse.cz
Last login: Sat Oct 17 11:37:30 2020 from 2001:718:1e02:42::38
telnet localhost 8000
Connected to localhost.
...

Dynamický tunel na bis.vse.cz bude přijímat SOCKS 5 připojení na lokální stanici na portu 10000:

ssh -D 10000 -N pavlicek@bis.vse.cz

2.5.7. Přihlášení skrz bastion - jump host

V kapitole 1.4.9 se popisuje průchod skrz bastion pomocí řetězení (čtyři varianty) a tunelování (tři varianty). OpenSSH klient používá stejné principy, zde popíšeme jen proxy-command tunelování (Jump Host) a agent forwarding v následující podkapitole.

V openssh od verze 7.3 (nevím, zda je na MacOs) je přepínač -J pro zadání průchozího serveru. Lze zadat i uživatelské jméno (a případně i čísla portů). Následující příkaz přihlásí uživatele na bis144.vse.cz skrz bis.vse.cz:

ssh -J pavlicek@bis.vse.cz pavlicek@bis144.vse.cz

Z jaké IP adresy jste přihlášeni můžete zjistit pomocí příkazu who na cílovém serveru. Parametr lze zapsat i do konfiguračního souboru .ssh/config

Host bis144.vse.cz
   User pavlicek
   ProxyJump pavlicek@bis.vse.cz

a poté se přihlásit pomocí ssh bis144.vse.cz.

ProxyJump je zjednodušeným zápisem mnohem staršího a obecnějšího ProxyCommand, který tuneluje stdin (standardní vstup) a stdout (standardní výstup) skrz proxy servery a bastiony.

V následujícím zápisu do konfiguračního souboru .ssh/config na notebooku je pro cílový server bis144.vse.cz nadefinován přístup skrz bastion bis.vse.cz:

Host bis144.vse.cz
   User pavlicek
   ProxyCommand ssh pavlicek@bis.vse.cz -W %h:%p

Za %h uvedeného u parametru -W se doplní hostname z definice Host, popř. z parametru Hostname. Za %p se doplní číslo portu (defaultní je port 22). V ukázce jsou též uživatelská jména - parametr User je pro cílový server, v ProxyCommand je uvedeno uživatelské jméno pro bis.vse.cz. Z notebooku se na bis144.vse.cz přihlásím příkazem (předpokládám, že klíče jsou v ssh-agent na notebooku):

ssh bis144.vse.cz

2.5.8. Přihlášení skrz bastion - agent forward

Agent forwarding je jednodušší na nastavení, ale méně bezpečný. Pokud se na bastion dostane hacker či ho spravuje zlomyslný administrátor, tak mohou zneužít Váš klíč k přihlášení na další servery.

Agent forwarding se nastavuje na notebooku v souboru .ssh/config parametrem ForwardAgent:

Host bastion.vse.cz
   ForwardAgent yes

Konkrétní příklad včetně nastavení uživatelského jména:

Host bis.vse.cz
   User pavlicek
   ForwardAgent yes

Po nastavení se nejdříve přihlásíte na bastion (na bis.vse.cz). A zde na příkazové řádce se přihlásíte na cílový server (např. na bis144.vse.cz). Dotaz na klíč bude z bastionu (z bis.vse.cz) přesměrován na ssh-agent běžící na notebooku.


34

Uživatelské jméno lze přepsat na příkazové řádce pomocí parametru -l.

35
Soukromý klíč může být i v jiném souboru, při spuštění ssh zadáte cestu pomocí parametru -i, např.
ssh -i .ssh/druhy_klic pavlicek@bis.vse.cz
36

Rozhraní programu ssh-agent se též používá při agent forwarding, viz kapitola 1.4.9. Grafické verze programu pro správu klíčů a hesel mají obvykle v názvu keychain.

37

Úplný přehled – viz manuálové stránky, příkaz man scp.

38

Oba tunely nemohou být současně, neboť v obou případech se poslouchá lokálně na portu 7000. Pokud chcete mít současně připojení na obě databáze, tak musíte přiřadit rozdílné porty.