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.

Vladimír NeporAutorIng. Vladimír Nepor
PublikovánoAktualizováno
  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

    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)
  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. Nastavíme správná oprávnění – při příliš volných oprávněních SSH server klíč odmítne:
      chmod 700 ~/.ssh
      chmod 600 ~/.ssh/authorized_keys
    5. příkazem exit připojení k serveru ukončíme

    Na Mac / Linux lze kroky výše nahradit jedním příkazem spuštěným z klientského počítače, který klíč na server nahraje včetně oprávnění: ssh-copy-id -i ~/.ssh/nazev_klice.pub -p 22 username@server_ip

  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 authentication" 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.

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. Nastavte PermitRootLogin no (přímé přihlášení uživatele root zakázáno; administraci provádějte přes vlastního uživatele a sudo). Mírnější variantou je PermitRootLogin prohibit-password, která rootovi povolí jen přihlášení klíčem.
  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".

    Pokud výpis ukazuje yes, hodnotu pravděpodobně přepisuje soubor ve složce /etc/ssh/sshd_config.d/ (typicky 50-cloud-init.conf na cloudových instalacích). Soubory v této složce se načítají dříve a platí první nalezená hodnota – upravte proto PasswordAuthentication i v nich.

    Po tomto nastavení je přihlášení heslem vypnuté a k serveru se lze připojit pouze pomocí privátního klíče. Explicitně lze totéž vynutit záznamem AuthenticationMethods publickey v souboru /etc/ssh/sshd_config – vložte ho před případný blok Match (direktivy za Match platí jen pro daný blok). Pokud plánujete 2FA, tento záznam později nahraďte hodnotou z článku o 2FA.

  8. Restartujte SSH server
    • Na Ubuntu 24.04 a 26.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 authentication 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

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

Potřebujete bezpečně nastavit server?

Navrhneme, zabezpečíme a zdokumentujeme sítě i servery.

Servery a sítě