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 přes SSH je pomocí uživatelského jména a hesla. Nevýhodou je, že vaše heslo je obvykle něco poněkud „krátkého“ a náchylného k brute-force útoků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
  6. Zakázání vzdáleného přihlašování přes uživatelské jméno a heslo

    Zákaz přihlašování pomocí hesla se provádí zásahem do konfiguračního souboru. 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. Příkazem sudo nano /etc/ssh/sshd_config otevřete konfiguraci SSH serveru. Jelikož používáme na začátku příkazu "sudo", otevíráme soubor se změnovými právy a tedy v případě nové session po nás bude vyžadováno uživatelské heslo (to heslo, s kterým jsme se dříve přihlašovali).
    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 příkazem sudo systemctl restart sshd
    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