<<TableOfContents: execution failed „] (viz také protokol)>>
OpenSSH (neboli Secure SHell) se stal de facto standardem pro vzdálený přístup, který nahradil protokol telnet. SSH učinil protokoly, jako je telnet, nadbytečnými z velké části díky tomu, že spojení je šifrované a hesla se již neposílají v prostém textu, aby je všichni viděli.
Výchozí instalace ssh však není dokonalá a při spouštění ssh serveru existuje několik jednoduchých kroků, které mohou instalaci výrazně ztížit.
Používejte silná hesla/uživatelská jména
Jednou z prvních věcí, které si všimnete, pokud máte spuštěný ssh a jste vystaveni vnějšímu světu, je, že pravděpodobně zaznamenáte pokusy hackerů uhodnout vaše uživatelské jméno/heslo. Obvykle hacker vyhledá port 22 (výchozí port, na kterém ssh naslouchá), aby našel počítače se spuštěným ssh, a pak se pokusí o útok hrubou silou. Doufejme, že se silnými hesly bude každý útok zaregistrován a zaznamenán dříve, než bude úspěšný.
Snad již používáte silná hesla, ale pokud ne, zkuste zvolit hesla, která obsahují:
- Minimálně 8 znaků
- Mix velkých a malých písmen
- Mix písmen a číslic
- Nealfanumerické znaky (např. speciální znaky jako ! “ £ $ % ^ atd.)
Přínos silných hesel není specifický pro ssh, ale má dopad na všechny aspekty zabezpečení systémů. Další informace o heslech naleznete v dokumentaci systému CentOS:
http://www.centos.org/docs/4/html/rhel-sg-en-4/s1-wstation-pass.html
Pokud rozhodně nemůžete zabránit uživatelům ve volbě slabých hesel, zvažte použití náhodně generovaných nebo obtížně uhodnutelných uživatelských jmen pro uživatelské účty. Pokud padouši nemohou uhodnout uživatelské jméno, pak nemohou heslo vynutit hrubou silou. Stále se však jedná o zabezpečení skrze zastírání a buďte si vědomi úniku informací o uživatelských jménech z takových věcí, jako jsou e-maily odesílané z uživatelských účtů.
Zakázat kořenové přihlašování
Nastavení serveru SSH je uloženo v souboru /etc/ssh/sshd_config. Chcete-li zakázat přihlašování kořenových uživatelů, ujistěte se, že máte následující položku:
# Prevent root logins:PermitRootLogin no
a restartujte službu sshd:
service sshd restart
Pokud potřebujete přístup roota, přihlaste se jako běžný uživatel a použijte příkaz su.
Omezit přihlašování uživatelů
Přihlašování pomocí SSH lze omezit pouze na určité uživatele, kteří potřebují vzdálený přístup. Pokud máte v systému mnoho uživatelských účtů, pak má smysl omezit vzdálený přístup pouze na ty, kteří ho skutečně potřebují, čímž se omezí dopad toho, že náhodný uživatel má slabé heslo. Do souboru /etc/ssh/sshd_config přidejte řádek AllowUsers následovaný seznamem uživatelských jmen oddělených mezerou Například:
AllowUsers alice bob
a restartujte službu sshd.
Zakázat protokol 1
SSH má dva protokoly, které může používat, a to protokol 1 a protokol 2. V případě, že se jedná o protokol 1, může být protokol 2 zakázán. Starší protokol 1 je méně bezpečný a měl by být zakázán, pokud nevíte, že jej výslovně vyžadujete. V souboru /etc/ssh/sshd_config vyhledejte následující řádek, odkomentujte jej a změňte podle obrázku:
# Protocol 2,1Protocol 2
a restartujte službu sshd.
Použijte nestandardní port
Ve výchozím nastavení naslouchá ssh příchozím spojením na portu 22. V případě, že se jedná o standardní port, je třeba jej změnit. Aby hacker zjistil, že na vašem počítači běží ssh, bude nejspíše skenovat port 22, aby to zjistil. Účinnou metodou je spuštění ssh na nestandardním portu. Stačí jakýkoli nepoužívaný port, i když vhodnější je port vyšší než 1024. Mnoho lidí volí jako alternativní port 2222 (protože je snadno zapamatovatelný), stejně jako je 8080 často znám jako alternativní port HTTP. Právě z tohoto důvodu to pravděpodobně není nejlepší volba, protože každý hacker, který skenuje port 22, bude pravděpodobně pro jistotu skenovat i port 2222. Lepší je vybrat nějaký náhodný vysoký port, který se nepoužívá pro žádné známé služby. Změnu provedete tak, že do souboru /etc/ssh/sshd_config přidáte tento řádek:
# Run ssh on a non-standard port:Port 2345 #Change me
a restartujte službu sshd. Poté nezapomeňte provést všechny potřebné změny v přesměrování portů ve směrovači a ve všech příslušných pravidlech brány firewall. Například v systému CentOS 7 (a vyšším) můžete změnit službu ssh firewalld vytvořením duplikátu jejího souboru služby v /etc/firewalld/ a změnou řádku portu:
$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-custom.xml
Poté změňte řádek portu v souboru /etc/firewalld/services/ssh-custom.xml tak, aby byl port stejný jako v konfiguračním souboru ssh:
<port protocol="tcp" port="2345"/>
Nakonec odeberte službu ssh, přidejte službu ssh-custom a znovu načtěte firewalld, aby se změna projevila:
$ firewall-cmd --permanent --remove-service='ssh'$ firewall-cmd --permanent --add-service='ssh-custom'$ firewall-cmd --reload
Nebo v systému CentOS 6 přidejte pravidlo iptable pro otevření nového portu ssh:
$ iptables -I INPUT -p tcp --dport 2345 -j ACCEPT
Nezapomeňte také zavřít starý port.
Na CentOS 6 a vyšším byste měli také aktualizovat selinux, správně označit zvolený port, jinak k němu nebude mít sshd přístup. Např:
$ semanage port -a -t ssh_port_t -p tcp 2345 #Change me
Protože ssh již nenaslouchá pro připojení na standardním portu, budete muset klientovi sdělit, na jaký port se má připojit. Při použití klienta ssh z příkazového řádku můžeme port zadat pomocí přepínače -p:
$ ssh -p 2345 myserver
nebo pokud používáte protokol fish v programu konqueror, např:
fish://myserver:2345/remote/dir
Pokud si říkáte, že to zní jako otrava, když musíte zadávat port při každém připojení, jednoduše přidejte položku určující port do místního souboru ~/.ssh/config:
# Client ~/.ssh/configHost myserverHostName 72.232.194.162 User bob Port 2345
A soubor: Soubor ~/.ssh/config musí mít následující oprávnění:
$ chmod 600 ~/.ssh/config
Filtrování SSH na firewallu
Pokud potřebujete vzdálený přístup pouze z jedné IP adresy (například z práce na domácí server), zvažte filtrování připojení na firewallu přidáním pravidla firewallu na směrovači nebo v iptables, které omezí přístup na port 22 pouze na tuto konkrétní IP adresu. V iptables toho lze dosáhnout například pomocí následujícího typu pravidla pro iptables (CentOS 6):
$ iptables -A INPUT -p tcp -s 72.232.194.162 --dport 22 -j ACCEPT
nebo pomocí nástroje firwalld (CentOS 7) pomocí pravidel rich-rules povolit ssh pouze na určitém portu. Zdrojovou adresou může být jedna adresa nebo základní adresa s bitovou maskou:
SSH také nativně podporuje TCP wrappery a přístup ke službě ssh lze podobně řídit pomocí hosts.allow a hosts.deny.
Pokud nemůžete omezit zdrojové IP adresy a musíte otevřít port ssh globálně, pak vám iptables stále mohou pomoci zabránit útokům hrubou silou tím, že zaznamenají a zablokují opakované pokusy o přihlášení ze stejné IP adresy. Například pomocí iptables
První pravidlo zaznamenává IP adresu každého nového pokusu o přístup k portu 22 pomocí modulu recent. Druhé pravidlo kontroluje, zda se tato IP adresa během posledních 60 sekund nepokusila připojit 4krát nebo vícekrát, a pokud ne, pak je paket přijat. Všimněte si, že toto pravidlo by vyžadovalo výchozí politiku DROP na vstupním řetězci.
Pokud používáte ssh na nestandardním portu, nezapomeňte podle potřeby změnit port. Pokud je to možné, je filtrování na bráně firewall mimořádně účinnou metodou zabezpečení přístupu k serveru ssh.
Pro systémy používající službu FirewallD (CentOS 7 nebo vyšší) použijte firewall-cmd:
První příkaz odstraní povolenější pravidlo služby, druhý zavede pravidlo, které přijme pouze 4 připojení za minutu a všechna připojení zaznamená.
Použití veřejných/soukromých klíčů pro ověřování
Použití šifrovaných klíčů pro ověřování nabízí dvě hlavní výhody. Zaprvé je pohodlné, protože při použití veřejných/soukromých klíčů již nemusíte zadávat heslo (pokud klíče nešifrujete pomocí ochrany heslem). Za druhé, jakmile je na serveru nastaveno ověřování pomocí páru veřejný/soukromý klíč, můžete ověřování pomocí hesla zcela zakázat, což znamená, že bez autorizovaného klíče nemůžete získat přístup – takže už žádné pokusy o prolomení hesla.
Vytvoření páru veřejných/soukromých klíčů a jejich instalace pro použití na serveru ssh je poměrně jednoduchý proces.
Nejprve vytvořte dvojici veřejných/soukromých klíčů na klientovi, který budete používat pro připojení k serveru (budete to muset provést z každého klientského počítače, ze kterého se připojujete):
$ ssh-keygen -t rsa
Pokud nechcete být při každém připojení stále žádáni o zadání přístupové fráze (což je v podstatě heslo pro odemknutí daného veřejného klíče), stačí při vytváření páru klíčů stisknout enter, když budete požádáni o zadání přístupové fráze. Je na vás, abyste se rozhodli, zda při vytváření klíče přidáte do klíče ochranné šifrování passphrase, nebo ne. Pokud klíč nechráníte heslovou frází, kdokoli, kdo získá přístup k vašemu místnímu počítači, bude mít automaticky ssh přístup ke vzdálenému serveru. Také root na místním počítači má přístup k vašim klíčům, i když se dá předpokládat, že pokud nemůžete důvěřovat rootovi (nebo je root kompromitován), pak máte skutečný problém. Šifrování klíče přidává další zabezpečení na úkor eliminace nutnosti zadávat heslo pro ssh server jen proto, aby bylo nahrazeno zadáním přístupové fráze pro použití klíče. To lze dále zjednodušit použitím programu ssh_agent
Nyní nastavte oprávnění k soukromému klíči:
$ chmod 700 ~/.ssh$ chmod 600 ~/.ssh/id_rsa
Zkopírujte veřejný klíč (id_rsa.pub) na server a nainstalujte jej do seznamu authorized_keys:
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
Poznámka: po importu veřejného klíče jej můžete ze serveru odstranit.
a nakonec nastavte oprávnění k souboru na serveru:
$ chmod 700 ~/.ssh$ chmod 600 ~/.ssh/authorized_keys
Výše uvedená oprávnění jsou vyžadována, pokud je v souboru /etc/ssh/sshd_config nastavena hodnota StrictModes na yes (výchozí nastavení).
Zajistěte, aby byly nastaveny správné kontexty SELinuxu:
$ restorecon -Rv ~/.ssh
Při přihlašování k serveru nyní nebudete vyzváni k zadání hesla (pokud jste při vytváření páru klíčů nezadali přístupovou frázi). Ve výchozím nastavení se ssh nejprve pokusí ověřit pomocí klíčů. Pokud nejsou nalezeny žádné klíče nebo ověřování selže, ssh se vrátí k běžnému ověřování heslem.
Pokud jste si ověřili, že se můžete úspěšně přihlásit k serveru pomocí páru veřejných/soukromých klíčů, můžete ověřování heslem zcela zakázat přidáním následujícího nastavení do souboru /etc/ssh/sshd_config:
# Disable password authentication forcing use of keysPasswordAuthentication no
Často kladené otázky (FAQ)
Q: CentOS používá verzi X OpenSSH a nejnovější verzí je verze Y. Proč? Verze X obsahovala závažnou bezpečnostní chybu, měl bych provést upgrade?
A: Ne. Upstreamový dodavatel má politiku zpětného portování bezpečnostních záplat z nejnovějších verzí do aktuální verze distribuce. Pokud máte aplikovány nejnovější aktualizace pro distribuci CentOS, jste plně opraveni. Další podrobnosti o zpětném přenosu bezpečnostních záplat naleznete zde:
http://www.redhat.com/advice/speaks_backport.html
Q: Jak přimět ssh, aby umožňoval ověřování bez hesla na základě klíče mezi počítači, které sdílejí domovské adresáře uživatelů pomocí NFS?
A: SElinux blokuje přístup roota ke sdíleným adresářům a souborům NFS, které ve výchozím nastavení nejsou světově čitelné, a proto sshd nemůže číst soubory s klíči uživatelů v ~/.ssh. Chcete-li přístup povolit, změňte nastavení use_nfs_home_dirs spuštěním následujícího příkazu jako superuživatel:
setsebool -P use_nfs_home_dirs 1
https://www.centos.org/forums/viewtopic.php?t=49194
Odkazy
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-openssh.html
http://www.dragonresearchgroup.org/insight/sshpwauth-tac.html
http://www.dragonresearchgroup.org/insight/sshpwauth-tac.html