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.