Postup vygenerování, aktivace a používání SSH klíčů k SSH přístupu na Ubuntu Server

Výchozí způsob přihlašováni k Ubuntu serveru prostřednictvím SSH je pomocí uživatelského jména a hesla. Nevýhodou je, že vaše heslo je obvykle něco poněkud „jednoduchého“ co do délky a tedy náchylného k brute-force útokům. Dále jej zadáváte prostřednictvím klávesnice, nejste tedy imunní proti keylogger softwarům. SSH klíč je oproti heslu exponenciálně těžší prolomit a tedy při správné práci s ním je bezpečnost přihlašování zásadně navýšena.

  1. Vygenerování ed25519 SSH klíčů

    Na počítači (Widnows / Mac / Linux), na kterém nejste k serveru skrze SSH připojeni (pokud jste, odhlaste se), v příkazovém řádku nebo terminálu, zadejte příkaz:

    ssh-keygen -t ed25519 -C "your_email_address@example.com, PC name"
    • parametr -t definuje typ klíče ed25519
    • dobrovolný parametr -C přidává poznámku, k jakému uživateli a počítači je klíč vázán.

    Potvrďte / určete novou cestu a název souboru (aby jste je snadno rozpoznali), kde mají být klíče uloženy a v dalším kroku vymyslete, zadejte a opětovným zadáním potvrďte bezpečnostní frázi, která se stane samotný heslem privátního SSH klíče. Buďte si dále vědomi, že zadabou bezpečnostní frázi v případě zapomenutí nelze obnovit.

    Do zadané složky v kroku výše se vygenerovaly 2 SSH klíče.

  2. Zjištění veřejného klíče

    Veřejný SSH klíč je soubor s koncovkou ".pub". Obsah veřejného klíče zjistíme jeho otevřením skrze Příkazový řádek / Terminál.

    type %USERPROFILE%\.ssh\nazev_souboru.pub
    cat ~/.ssh/nazev_souboru.pub

    Veřejný klíč začíná typem "ssh-ed25519 AAAAC..."

  3. Vzdáleně se přihlásíme k serveru pomocí uživatelského jména a hesla

    1. Připojíme počítač (z kterého se vzdáleně připojujeme) a server, k němuž se připojujeme, do stejné lokální sítě (totožného routeru)
    2. Připojíme se vzdáleně k serveru
      • Spustíme Putty klienta nainstalovaného v počítači, přejdeme na záložku "Sessions".
      • Zadáme pole "Host" značící IP adresu serveru (zjistíme v routeru) a port, skrze nějž se k serveru připojujeme (výchozí je 22 - v dalších krocích jej zakážeme, nyní jej však použijte).
      • V otevřeném okně příkazového řádku zadejte uživatelské jméno a heslo pro připojení k serveru (bylo definováno při instalaci serveru)
      • Spustíme terminál
      • V terminálu zadáme ssh příkaz s odkazem na konkrétního uživatele, IP serveru a port:
        ssh username@server_ip -p 22

        Poznámka: ssh příkaz pracuje s defaultním přihlašováním pomocí klíčů. Nemáme-li jej specifikován v rámci ssh příkazu, počítač zkusí všechny. Máme-li v počítači, z něhož se přihlašujeme vyšši počet known host serverů, můžeme překročit maximální počet pokusů a dostat od serveru zamítnutí přístupu s oznámením "Too many authentication failures", jelikož žádný s použitých klíčů nebyl pro náš server validní. Oprava je snadná, v rámci ssh příkazu se jasně specifikuje metoda autentizace, v tomto případě heslo.

        ssh -o IdentitiesOnly=yes -o PreferredAuthentications=password username@server_ip -p 22
      • Zadáme heslo pro připojení k serveru (bylo definováno při instalaci serveru)
  4. Nahrání veřejného klíče na server

    1. Na serveru vytvoříme příkazem mkdir -p ~/.ssh složku pro uložení veřejných SSH klíčů.
    2. Příkazem nano ~/.ssh/authorized_keys otevřeme soubor authorized_keys a vložíme do něj veřejný klíč zjištěný v kroku 1. (vkládáme celý řádek, začínající ssh-ed25519 ...)
    3. Soubor "authorized_keys" stisknutím kláves ctrl+x uložíme a zavřeme.
    4. příkazem exit připojení k serveru ukončíme
  5. Vzdálené přihlášení k serveru pomocí privátního SSH klíče

    Používáme-li OS Windows a Putty klienta, námi vygenerovaný formát privátního klíče v kroku 1 (soubor bez koncovky) není ve formátu podporovaném Putty klientem. Je tedy nezbytné si jej převést, a to následujícím způsobem:

    1. Příkazem type %USERPROFILE%\.ssh\nazev_souboru si zobrazíme privátní klíč a celý tak, jak je, včetně "-----BEGIN OPENSSH PRIVATE KEY-----" a "-----END OPENSSH PRIVATE KEY-----" zkopírujeme do .txt souboru, který si uložíme.
    2. Stáhneme program "puttygen.exe (a RSA and DSA key generation utility)" z oficiálního Putty webu.
    3. Otevřeme stažený program "PuTTY Key Generator", dole vybereme typ "EdDSA" → (Ed25519). V horní liště zvolíme možnost "File → Load private key". Přepneme na zobrazení "All FIles (*.*)" a vybereme .txt soubor, do nějž jsme privátní klíč v předchozím kroku uložili. Zadáme passphrase, kterou jsem definovali při tvorbě klíče. Jestliže vše prošlo, dostaneme upozornění "Successfully imported foreign key...".
    4. Stiskneme tlačítko "Save private key" a privátní SSH klíč v Putty podporovaném .ppk formátu uložíme opěd do složky .ssh. Je-li něco nejasné, postup se screenshoty naleznete zde.
    5. Otevřeme Putty klient, přejdeme do sekce "Connections → SSH → Auth → Credentials" a v poli "Private key file for authentization" zvolíme "Browse" a vybereme .ppk soubor uložený v předchozím kroce.
    6. Přejdeme do sekce "Session", zadáme pole "Host" a "Port", a po stisknutí tlačítka "Open", v nově otevřeném příkazovém okně zadáme uživatelské jméno (login as:), načež namísto požadavku na heslo bychom měli vidět identifikaci veřejného klíče, v rámci něhož se připojujeme s požadavkem na vložení passphrase.
    7. Zadáme passhprase a přihlásíme se.
    ssh username@server_ip -p 22 -i ~/.ssh/private_key

SSHD konfigurace

Možnosti přihlášení skrze SSH na úrovni celého systému i jednotlivých uživatelů lze nastavovat v konfiguračním souboru /etc/ssh/sshd_config. Ten lze otevřít následujícím příkazem:

sudo nano /etc/ssh/sshd_config

Jelikož soubor je otevírán prostřednictví sudo i se změnovými právy, pro jeho otevření může být vyžadováno uživatelské heslo (uživatelské heslo, s kterým jste se k serveru přihlašovali).

Do souboru /etc/ssh/sshd_config se zanáší definice dle potřeb SSH přihlašování, viz níže. Ačkoli samotnou změnou nedojde k automatickému odhlášení, přesto, z bezpečnostních důvodů je vhodné být k serveru připojen ve 2 instancích (2 oknech), aby jste v případě testovacího odhlášení se v jednom a nemožnosti se opětovného přihlášení měli stále možnost navrácení provedených změn z druhého okna.

  1. Jestliže nemáte otevřen soubor /etc/ssh/sshd_config, otevřete jej příkazem sudo nano /etc/ssh/sshd_config
  2. Najdeme záznam #AuthorizedKeysFile a odkomentujeme jej odstraněním # z jeho začátku
  3. Najděte záznam KbdInteractiveAuthentication a nastavte jej na hodnotu no. Současně se ujistěte, že není zakomentován (nezačíná #)
  4. Najděte záznam PasswordAuthentication yes a změňte jej na hodnotu no. Ujistěte se, že není zakomentován (nezačíná #)
  5. Ujistěte se, že záznam PermitRootLogin má hodnotu prohibit-password (PermitRootLogin prohibit-password)
  6. Soubor ukončete příkazem ctrl+x a při ukončování uložte.
  7. Zadejte příkaz sudo sshd -T | grep -i passwordauthentication a ověřte, že jeho výpisem je záznam "passwordauthentication no".

    V tomto nastavení je možné k serveru přistupovat jak pomocí kombinace username + private key, tak i klasicky username + password. Chceme-li, aby byla možná varianta jen s použitím privatekey, na konci souboru /etc/ssh/sshd_config je nutné definovat AuthenticationMethods publickey.

  8. Restartujte SSH server
    • Na Ubuntu 24.04
      sudo systemctl restart ssh
    • Na Ubuntu 22.04
      sudo systemctl restart sshd
      sudo systemctl restart ssh
  9. Odhlaste se příkazem logout.
  10. Při opětovném přihlášení bez public key by jste měli dostat po zadání uživatelského jména chybovou hlášku "No supported authentization methods available (server sent: publickey)". Při použití privatekey by přihlášení mělo být úspěšné.
  11. Poznámka: Přihlášení pomocí uživatelského jména a hesla je stále možné lokálně - pomocí klávesnice připojené k serveru
  1. Jestliže nemáte otevřen soubor /etc/ssh/sshd_config, otevřete jej příkazem sudo nano /etc/ssh/sshd_config
  2. Na konec souboru vložte následující definici:
    Match User <specificUserName>
    	ChallengeResponseAuthentication yes
        AuthenticationMethods keyboard-interactive

    Tento předpis přepisuje pro uživatele <specificUserName> následující globální nastavení:

    • PasswordAuthentication no na yes
    • AuthenticationMethods na keyboard-interactive (password + Google 2FA)
  3. Soubor ukončete příkazem ctrl+x a při ukončování uložte.
  4. Restartujte SSH server
    • Na Ubuntu 24.04
      sudo systemctl restart ssh
    • Na Ubuntu 22.04
      sudo systemctl restart sshd
      sudo systemctl restart ssh

Kontrola autentizačního logu

Čelíte-li problémům s přihlášením libovolného uživatele skrze SSH, zkontrolujte autentizační log.

sudo tail -f /var/log/auth.log