2.6. Základy konfigurace SSH serveru (openssh)

Sice existuje více implementací protokolu SSH, v Unixu včetně Linuxu má v současné době dominantní postavení balík OpenSSH distribuovaný pod licencí typu BSD. Hlavní klientské programy (ssh, ssh-agent, ssh-keygen) byly stručně popsány v předchozí kapitole. Zde stručně popíšeme sshd - SSH server daemon - včetně zabezpečení konfigurace.

V srpnu 2018 byla vydána verze 7.8, v jednotlivých distribucích Unixu a Linuxu je ale obvykle k dispozici starší verze programy. Následující popis bude zaměřen na verzi 7.4p1, která je v Debian Stretch.

Podrobnou dokumentaci získáte z manuálových stránek pomocí příkazů:

man sshd
man sshd_config

2.6.1. Daemon sshd

Daemon sshd standardně poslouchá na portu 22, což lze ověřit příkazem netstat s přepínači -at, který vypíše otevřená tcp spojení (pomocí grep omezím výpis na port 22):

netstat -atn | grep ':22'
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 146.102.18.87:22        146.102.93.146:50387    ESTABLISHED
tcp        0      0 146.102.18.87:22        217.112.172.43:58602    ESTABLISHED
tcp        0      0 146.102.18.87:22        146.102.93.145:60033    ESTABLISHED
tcp        0      0 146.102.18.87:22        217.112.172.43:58604    ESTABLISHED

Ve výpisu je vidět, že naslouchá na port 22 a dále že jsou otevřena spojení z 3 různých IP adres. Z IP adresy 217.112.172.43 jsou otevřena dvě souběžná spojení.

Program ps -ef vypisuje spuštěné procesy, pomocí grep omezím výpis na daemon sshd:

ps -ef | grep sshd
root      6111     1  0 Sep21 ?        00:00:07 /usr/sbin/sshd -D
root     30035  6111  0 12:26 ?        00:00:00 sshd: pavlicek [priv]
pavlicek 30046 30035  0 12:26 ?        00:00:00 sshd: pavlicek@pts/1
root     14569  6111  0 14:30 ?        00:00:00 sshd: test99 [priv]
test99   14575 14569  0 14:30 ?        00:00:00 sshd: test99@pts/14
root     14697  6111  0 14:35 ?        00:00:00 sshd: test99 [priv]
test99   14703 14697  0 14:35 ?        00:00:00 sshd: test99@pts/15
root     21220  6111  0 Sep21 ?        00:00:00 sshd: xabcd01 [priv]
xabcd01  21230 21220  0 Sep21 ?        00:00:01 sshd: xabcd01@pts/0,pts/5

Při nastartování serveru se spustí program /usr/sbin/sshd a tím se vytvoří proces (zde s číslem procesu 6111). Tento proces poslouchá na portu 22 a čeká na navázání spojení od nějakého klienta. Pro tento typ procesů se používá označení daemon.

Když se připojí uživatel, tak se pro toto spojení vytvoří dva procesy. První proces vytvoří daemon a tento proces běží též pod uživatelem root (u spojení uživatele pavlicek je to proces 30035). Tento proces vytváří a spravuje transportní vrstvu protokolu ssh (viz kapitola 2.3). Po vytvoření transportní vrstvy a autentizaci uživatele spustí další proces, nyní s právy přihlášeného uživatele (proces 30046 pro spojení uživatele pavlicek). Tento proces obsluhuje jednotlivá spojení (jednotlivé kanály), např. spouští shell (příkazovou řádku) konkrétního uživatele. Samostatné procesy umožňují minimalizovat škody v případě úspěšného útoku na implementaci sshd.

2.6.2. Jak upravit konfiguraci pro sshd

Konfigurace daemonu sshd se mění v souboru /etc/ssh/sshd_config. Úpravy může provádět pouze uživatel root. Na svém serveru můžete získat toto oprávnění např. příkazem:

sudo -i

U následujících příkazů předpokládám, že jste tento příkaz úspěšně spustili, tj. že máte oprávnění uživatele root.

Před změnami si udělejte zálohu, např. příkazem

cp /etc/ssh/sshd_config /etc/ssh/sshd_config_zaloha

Pro editaci použijte editor nano (jednodušší pro začátečníky) či editor vim (mnohem více možností, barevná syntaxe).

nano /etc/ssh/sshd_config
# či
vi /etc/ssh/sshd_config

Po úpravě a uložení souboru zkontrolujte syntaxi úprav pomocí příkazu sshd -t. V následující ukázce se vypíší chyby

sshd -t
/etc/ssh/sshd_config: line 105: Bad configuration option: llowUsers
/etc/ssh/sshd_config line 105: Directive 'llowUsers' is not allowed within a Match block

Pokud nejsou syntaktické chyby, tak restartujte sshd pomocí příkazu

systemctl restart sshd

Nezavírejte otevřené ssh spojení. I když příkaz sshd -t nevypsal chyby syntaxe, tak stále mohou být v sshd_config chyby, které způsobí, že se nebudete moci přihlásit. Např. zakážete přihlašování heslem i klíčem.

Otevřete nové ssh spojení a ověřte, že se můžete úspěšně přihlásit.

Pokud se nemůžete přihlásit, tak zkontrolujte, zda je spuštěn proces sshd pomocí příkazu:

ps -ef | grep sshd
root      3680     1  0 17:12 ?        00:00:00 sshd: root@pts/0
root      3824     1  0 17:35 ?        00:00:00 /usr/sbin/sshd -D
root      3876  3689  0 17:41 pts/0    00:00:00 grep --color=auto sshd

Ve výpisu musíte najít /usr/sbin/sshd -D. Pokud tento řádek nenajdete, tak se při restartu nespustil proces sshd. Důvod najdete ke konci logu /var/log/daemon.log.

less /var/log/daemon.log

Pokud proces /usr/sbin/sshd běží, tak důvod, proč se nemůžete přihlásit najdete ke konci souboru /var/log/auth.log.

less /var/log/auth.log

2.6.3. Struktura konfiguračního souboru, podmíněné sekce

Parametry v konfiguračním souboru se skládají z klíčového slova a jedné či více hodnot, na řádku může být pouze jedno klíčové slovo. Komentáře začínají znakem #. V následující ukázce je začátek konfiguračního souboru:

# Package generated configuration file
# See the sshd_config(5) manpage for details
Port 22
AddressFamily inet

Na začátku konfiguračního souboru /etc/ssh/sshd_config se uvádějí parametry s globální platností. Za nimi následují podmíněné (Match) bloky - zadává se podmínka a na dalších řádcích parametry pro spojení odpovídají podmínce. Blok je ukončen buď následujícím podmíněným blokem či koncem souboru.

...
PermitRootLogin no
...
Match address 146.102.0.0/16,127.0.0.1/32
   PermitRootLogin without-password

V globální části konfiguračního souboru je zakázáno přihlášení uživatele root. Podmínkou v sekci je spojení ze školních IP adres (146.102.0.0/16) či z přímo z vlastního serveru (127.0.0.1). Pokud je podmínka splněna, tak se povolí přihlášení uživatele root pomocí klíče.

Vedle IP adres klienta se v podmínkách často používá uživatelské jméno (user) či skupina (group) - oboje např. pokud část uživatelů nemá mít možnost vytvářet tunely či pokud některý uživatel může pouze kopírovat soubory.

2.6.4. Zabezpečení SSH serveru

Následují doporučení pro zabezpečení SSH serveru.

2.6.4.1. Zákaz přihlášení pomocí hesla

Pokud mají správci a uživatelé ověřeno přihlašování klíčem, tak je vhodné zakázat přihlašování pomocí hesla. U parametru PasswordAuthentication změňte hodnotu na no:

PasswordAuthentication no

Následující pokusy o přihlášení pomocí hesla poté skončí chybou, viz následující ukázka:

ssh bis145.vse.cz
Permission denied (publickey).

Je vhodné též zakázat ChallengeResponseAuthentication, která se používá při např. při vícefaktorové autentizaci pro zadání hodnoty druhého faktoru. V závislosti na konfiguraci knihovny PAM může totiž umožnit přihlašování pomocí hesla.

ChallengeResponseAuthentication no

Na bis.vse.cz je povoleno přihlašování heslem pouze ze školní sítě. V konfiguraci využita podmíněná sekce (a jak si určitě pamatuje z předchozí části, tak podmíněné sekce musí být až na konci konfiguračního souboru):

# ... část globální konfigurace
PasswordAuthentication no
# ... další část globální konfigurace
#
Match address 146.102.0.0/16
    PasswordAuthentication yes

2.6.4.2. Zákaz přihlášení uživatele root

Pokud se správci mohou stát privilegovanými pomocí sudo, tak ve většině případů neexistují důvody pro povolení přihlašování pod uživatelem root. Výjimkou mohou být nástroje po vzdálenou administraci serveru jako je ansible. Ale i v těchto případech byste měli povolit přihlášení uživatele root pouze z vybraných IP adres (viz příklad v předchozí kapitole).

Parametr PermitRootLogin určuje možnosti přihlášení uživatele root. Podporuje hodnoty:
yes (může se přihlašovat bez omezení),
no (nemůže se přihlásit),
without-password (nemůže se přihlásit heslem),
forced-commands-only (lze spustit pouze vybrané příkazy, např. zálohování).

2.6.4.3. Omezení tunelů

Na serveru obvykle nepotřebujete spouštět Xkové (grafické) aplikace a proto zakažte X11Forwarding:

X11Forwarding no

Na serveru často nepotřebujete ani ostatní typy tunelů. Zakážout se pomocí:

PermitTunnel no

Vhodné je to na serverech, kam se přihlašuje větší množství uživatelů. Zákazem tunelů omezíte možnosti zneužití serveru jako proxy např. k anonymnímu surfování či ke stahování torrentů. Pro vybrané uživatele může povolit tunely v podmíněném (Match) bloku.

2.6.4.4. Omezení uživatelů (AllowUsers, AllowGroups)

Pomocí parametrů AllowUsers, AllowGroups, DenyUsers a DenyGroups můžete omezit přihlášení na konkrétní uživatele či uživatelské účty. Doporučuji použít pouze jeden z těchto parametrů - před použitím dvou či více si předem pečlivě prostudujte v dokumentaci, jak se vzájemně ovlivňují (logická operace AND).

Osobně preferuji použití AllowGroups a včetně vytvoření speciální skupiny uživatelů, kteří se mohou hlásit. Na bis.vse.cz je následující řádek:

AllowGroups root sudo users

Mohou se hlásit členové skupin root (obsahuje uživatele root), sudo (uživatelé s možností stát se privilegovaní pomocí příkazu sudo) a členové skupiny users.

2.6.4.5. Naslouchání na jiném portu

Tuto radu považuji za kontroverzní. Je potřeba zvážit výhody a nevýhody pro konkrétní situaci.

Pokud je server otevřen do Internetu, tak v logu najdete mnoho pokusů o hádání hesla. Za den to jsou tisíce pokusů, zvlášť pokud máte povoleno přihlašování pomocí hesla. Změnou čísla portu se počet pokusů výrazně sníží, obvykle na jednotky pokusů. Tím snížíte zátěž serverů i pravděpodobnost náhodného úspěchu útočníka.

Změna portu není účinná vůči útočníkovi, který se zaměří na Váš server. Jednoduchým skenem najde port, na kterém SSH daemon poslouchá. Změna portu je též nepříjemná pro uživatele - pokud mají přistupovat k většímu počtu serverů a na každém je jiné číslo SSH portu, tak budou zmateni a se nebudou schopni přihlásit. V podstatě jim neúmyslně omezíte přístup ke službám.

Změna portu v sshd_config je jednoduchá:

Port 2244

2.6.4.6. Omezit počet pokůsů o přihlášení

Útočníci se pomocí skriptů neustále snaží o přihlášení na dostupné servery - pro různé účty a s různými hesly. I když je vypnuté přihlašování pomocí hesla, tak to zbytečně zatěžuje server. Používají se různé metody a jejich kombinace. Omezení počtu pokusů může vést k odmítnutí služby, kdy se nepřihlásí ani legální uživatel.

Pomocí parametru MaxAuthTries v sshd_config lze omezit počet pokusů o přihlášení v průběhu jednoho připojení. Defaultní hodnota je 6, takže uživatel může zkusit šest chybných hesel, než server ukončí spojení. Přestože najdete mnohá doporučení na snížení této hodnoty na 3 či méně, tak to příliš nedoporučuji, neboť to může zablokovat přihlášení pomocí klíčů. Když má uživatel v agentovi např. 4 klíče, tak se postupně zkouší pomocí nich přihlásit. A pokud by bylo omezení na tři pokusy, tak se čtvrtý klíč nikdy nezkusí.

Další metody stručně:

  • omezení ve firewallu - lze omezit počet souběžných spojení z IP adresy i počet navázaných spojení z IP adresy za určitou dobu.

  • specializované aplikace jako file2ban - tyto aplikace průběžně čtou logy a pokud je z nějaké IP adresy více neúspěšných pokusů o přihlášení, tak tuto IP adresu na určitou dobu (např. 12 hodin) zablokují.

  • PAM moduly - pro PAM existuje více modulů, které ovlivňují přihlašování. Lze omezit počet souběžných přihlášení od jednoho uživatele. Modul Pam_Tally2 umožňuje blokovat na určitou dobu (např. 3 hodiny) IP adresy, ze kterých byl větší počet neúspěšných přihlášení (např. více než 5 za posledních 30 minut).