.. _ssh-unix: 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. 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 ``@``: .. code-block:: bash :emphasize-lines: 1 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: .. code-block:: none 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: .. code-block:: none 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. .. code-block:: bash :emphasize-lines: 1,3 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í: .. code-block:: bash :emphasize-lines: 1 ssh -v pavlicek@bis.vse.cz 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): .. code-block:: none 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: .. code-block:: none 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í. .. code-block:: none 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: .. code-block:: bash :emphasize-lines: 1 man ssh_config 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. .. code-block:: bash :emphasize-lines: 1 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: .. code-block:: bash :emphasize-lines: 1 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. .. code-block:: bash :emphasize-lines: 1 ssh-copy-id pavlicek@bis.vse.cz 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: .. code-block:: bash :emphasize-lines: 1 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: .. code-block:: bash :emphasize-lines: 2 # na vlastním notebooku, ne na bis.vse.cz!!! eval "$(ssh-agent -s)" SSH klíč poté přidáte pomocí programu ``ssh-add``: .. code-block:: bash :emphasize-lines: 2 # 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ů: .. code-block:: bash :emphasize-lines: 1 ssh pavlicek@bis.vse.cz 'ls -l' > bis_soubory.lst 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: .. code-block:: bash :emphasize-lines: 2,4 # 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: .. code-block:: bash :emphasize-lines: 1 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. 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): .. code-block:: bash :emphasize-lines: 1 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]_: .. code-block:: bash :emphasize-lines: 1 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: .. code-block:: bash :emphasize-lines: 1 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``. .. code-block:: bash :emphasize-lines: 1,3 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: .. code-block:: bash :emphasize-lines: 1 ssh -D 10000 -N pavlicek@bis.vse.cz 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``: .. code-block:: bash :emphasize-lines: 1 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`` .. code-block:: none 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``: .. code-block:: none 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): .. code-block:: bash :emphasize-lines: 1 ssh bis144.vse.cz 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: .. code-block:: none Host bastion.vse.cz ForwardAgent yes Konkrétní příklad včetně nastavení uživatelského jména: .. code-block:: none 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.