Ochrana SSH démona proti útokům (2)
Další možností jak předejít útokům (úvod do této problematiky a jedno z možných řešení lze nalézt zde) je úplné vypnutí autentizace na základě jména a hesla a používání pouze autentizace na základě klíčů.
Jak to funguje?
Vygenerujeme si na daném klientském počítači (ze kterého se na server/další počítač budeme přihlašovat) pár klíčů (soukromý a veřejný) a veřejný klíč si pomocí bezpečného kanálu (tedy opět přes SSH) zkopírujeme na server. Poté co ověříme funkčnost tohoto způsobu přihlašování, tak na serveru zakážeme přihlášení pomocí jména a hesla. Pro názornost budu klientskou stanici nazývat client
a server budu nazývat server
. Uživatel bude na obou stanicích stejný (může se samozřejmě lišit, to není podmínkou) - bude se jmenovat ondra
.
Nastavení
ondra@client:~$ ssh-keygen -t dsa
Tímto jsme si vytvořili veřejný a soukromý klíč na klientské stanici. Pokud se chcete přihlašovat pod nějakým heslem (pro přesnost - není to klasické heslo, ale passphrase), tak jej zadejte, pokud ne, tak jej zadejte prázdné. Pokud jsme nezměnili adresář pro uložení klíčů, tak je nalezneme v adresáři /home/ondra/.ssh/
, kde id_dsa
je soubor se
soukromým klíčem a id_dsa.pub
je soubor s veřejným klíčem. Veřejný klíč následně zkopírujeme na server a přejmenujeme tímto příkazem (záměrně nepoužívám příkaz scp
pro kopírování, protože by mohlo dojít k přepsání stávajícího souboru s klíčema):
ondra@client:~$ cat ~/.ssh/id_dsa.pub | ssh ondra@server "cat >> .ssh/authorized_keys"
Tento příkaz nebude fungovat pokud na serveru nemáte vytvořený adresář
.ssh
. Ještě je víc než vhodné změnit práva souboru
authorized_keys
(SSH odmítne spojení v případě, že práva na tomto souboru budou příliš benevolentní). Lze to provést zase vzdáleně za pomoci
ssh
a to takto:
ondra@client:~$ ssh ondra@server chmod 600 .ssh/authorized_keys
Teď už zbývá jen vyzkoušet komunikaci, tzn. připojit se k serveru pomocí příkazu ssh ondra@server
. Pokud jste nastavili passphrase, tak po vás bude požadováno její zadání.
Pokud výše uvedené funguje, tak můžeme přistoupit k hlavnímu kroku a tím je zakázání autentizace pomocí hesla a tím zabránění útokům, kdy se útočník snaží periodicky hádat jednoduchá hesla. Autentizace zakážeme na serveru tak, že změníme následující direktivy (v souboru /etc/ssh/sshd_config
) na hodnoty no
.
PasswordAuthentication no ChallengeResponseAuthentication no PermitRootLogin no
Změna volby ChallengeResponseAuthentication
na hodnotu no
je velice důležitá, protože pokud by byla ponechána zapnutá a systém by
využíval pro přihlášení PAM (což u většiny distribucí využívá), tak by přihlášení uživatele, bez ohledu na hodnotu direktivy PasswordAuthentication
, probíhalo klasickým způsobem - tedy na základě uživatelského jména a hesla.
Po tomto kompletním nastavení musíme restartovat/reloadnout démona sshd
a to například následujícím způsobem:
/etc/init.d/sshd reload
Pokud se přihlásíte ze stanice ze které byl generován klíč, tak bude (po případném zadání passphrase) přihlášení úspěšné. Při přihlašování z jiné (nedůvěryhodné) stanice nám ssh démon odpoví následující hláškou:
Permission denied (publickey,gssapi-with-mic).
což znamená, že naše nastavení je správné.