Spousta služeb je v dnešní době provozována na serverech s různými linuxovými distribucemi. Oproti serverovým verzím operačních systémů od firmy Microsoft jsou zdarma. Všeobecně jsou považovány také za bezpečnější, ale vyžadují hlubší znalosti systémového administrátora pro zajištění jejich správné konfigurace. Nezáleží přitom, zdali systém běží ve Vaší vlastní infrastruktuře nebo se jedná o cloudová řešení společností Amazon, Microsoft či jiných. V tomto článku Vám předám tipy k zajištění vyšší bezpečnosti Vašich linuxových instancí. Součástí článku jsou také praktické ukázky zlepšování bezpečnosti distribucí operačních systémů založených na systému Debian.
Automatické instalace aktualizací
Mnoho serverů se stává cíli a obětmi hackerských útoků kvůli bezpečnostní díře v použitém operačním systému. Správci se většinou zdráhají aktualizovat systémy, jelikož tato činnost může přinést více starostí než užitku, kdy po aktualizaci systému mohou přestat fungovat nasazené aplikace. Nicméně se jedná o velmi důležitou akci pro udržení bezpečnosti operačního systému, a proto by měly být automatické instalace zapnuty vždy, zejména na kritických systémech. V případě nutnosti využití starších verzí operačních systémů, doporučujeme tyto počítače naprosto izolovat od sítě. K povolení automatických aktualizací na linuxovém sytému stačí pár příkazů.
$ apt update && apt dist-upgrade
$ apt install unattended-upgrades
$ dpkg-reconfigure –priority=low unattended-upgrades
Úspěšným spuštěním výše uvedených příkazů dosáhnete zapnutí automatických aktualizací systému a učiníte tak první krok ke zvýšení jeho zabezpečení.
Zabezpečení vzdáleného přístupu
Ke vzdálenému přístupu a správě linuxových serverů se běžně využívá zabezpečený komunikační protokol SSH. Ten byl vytvořen jako nástupce staršího Telnetu, který na rozdíl od SSH přenášel data v nešifrované podobě. Je považován za bezpečný, ale přesto je často zneužíván pro infiltraci systémů. To je zapříčiněno jeho nesprávným používáním, a proto Vám zde přiblížím několik možnosti zvýšení bezpečnosti při používání vzdáleného přístupu skrze tento protokol.
Je nepřípustné se vzdáleně přihlašovat privilegovaným účtem (uživatel root)! Přihlašování na vzdálený server by mělo vždy probíhat uživatelem s omezeným přístupem. Tento uživatel však může být členem skupiny sudo, což Vám po úspěšném přihlášení umožňuje provádět úkony pod privilegovaným uživatelem. Jak vytvořit uživatele s omezenými právy pro vzdáleného přihlašování je demonstrováno na následujících příkazech.
$ adduser USERNAME
$ usermod -aG sudo USERNAME
Přístup k SSH pomocí kryptografických klíčů
Pro vzdálený přístup se běžně využívá uživatelské jméno a heslo. Můžete využívat 30 znaků dlouhé komplexní heslo a cítit se relativně bezpečně. Stále však existuje možnost, že Vaše heslo je součástí souborů pro slovníkové útoky, nebo se může stát, že metodou lámání hrubou silou někdo Vaše heslo jednoduše uhodne. Jaká je tedy správná cesta pro bezpečné vzdálené přihlašování? Odpovědí je využití asymetrické kryptografie - veřejných a privátních klíčů. Nechci Vás zahltit informacemi o detailech principů kryptografie, ale demonstrovat její praktické použití.
Ve stručnosti se jedná o matematicky svázanou dvojici veřejného a privátního klíče reprezentovaného řetězcem znaků. Představte si, že vlastníte veřejný a privátní klíč. Ten privátní znáte pouze vy a veřejný všichni ostatní. Pokud někdo zašifruje zprávu Vaším veřejným klíčem, může být tato zpráva dešifrována pouze Vaším privátním a žádným jiným. Tím je zajištěn princip důvěrnosti, který říká, že kdokoliv Vám může poslat šifrovanou zprávu s vědomím, že vy jste jediný na světě, kdo ji je schopen opět přečíst. Kryptografie má i další široká použití, ale ta si nechám například do budoucích článků.
Zdroj: https://cheapsslsecurity.com
Prvním krokem je tedy vytvoření vlastní dvojice klíčů a následně je třeba svůj veřejný klíč nahrát do adresáře ~/.ssh na vzdálenému serveru spravujícího veřejné klíče legitimních uživatelů. Jak tuto akci provést opět demonstruji na příkazech níže.
$ ssh-keygen -b 4096
$ scp ~/.ssh/id_rsa.pub USERNAME@SERVER: ~/.ssh/authorizer_keys
V tuto chvíli po Vás server nebude chtít nikdy víc přihlašovací heslo, protože na místo toho proběhne ověření pomocí 4096 bitů dlouhého kryptografického klíče! Tím jste dosáhli mnohem vyššího stupně zabezpečení a zároveň odpadla nutnost pamatování si hesel.
Nicméně ostatní uživatelé se pořád mohou přihlašovat pomocí uživatelského jména hesla, a proto tuto možnost v následujícím kroku zakážete. Stále je povoleno přihlašování privilegované uživatele a služba SSH běží na výchozím portu, který je dobře známý všem hackerům. Pro odstranění těchto nedostatků stačí v souboru /etc/ssh/sshd_config upravit následující:
Port PORT
AddressFamily inet
PermitRootLogin no
PasswordAuthentication no
Po uložení provedení změn a restartování služby SSH je server téměř připraven k reálnému použití. Otestování provedených změn lze provést pokusem o přihlášení. Vzdálený server by neměl požadovat vstupní heslo a bezpečně bychom se měli dostat jeho prostředí.
$ ssh USER@SERVER -p PORT
Nasazení Firewallu
Poslední částí je správné nastavení firewallových pravidel pro zabezpečení celého vnějšího perimetru a povolení pouze žádoucí příchozí a odchozí komunikace. Nejprve se můžeme podívat, jaké otevřené porty operačního systému máme použity.
$ ss -tupln
Proveďte instalaci firewalu ufw (uncomplicated firewall) a povolte komunikace na portu, který jste si zvolili pro službu SSH. Povolte spuštění firewallu při startu operačního systému a nakonec se podívejte na seznam použitých pravidel.
$ apt install ufw
$ ufw allow PORT
$ ufw enable
$ ufw reload
$ ufw status
Dobrou praktikou je také potlačení protokolu ICMP, díky kterému nebude server reagovat na pokusy o zjištění jeho dostupnosti (příkaz ping). Tímto docílíte zakrytí existence serveru před očima, která by jej chtěla jednoduše a rychle odhalit. Provedete to přidáním následujícího řádku do souboru /etc/ufw/before.rules před blok pravidel upravující chování komunikace ICMP a následným restartem firewallu.
-A ufw-before-input -p icmp –icmp-type echo-request -j DROP
$ sudo ufw reload
Pokud se Vám povedlo úspěšně provést kroky popsané v tomto článku, učinili jste základní kroky k zabezpečení Vaších serverových linuxových instancí. Berte na vědomí, že syntax demonstrovaných příkazů se může lišit v závislosti na použité linuxové distribuci, avšak principy těchto zabezpečovacích mechanismů pro ně zůstávají totožné. Dosáhli jste tedy bezpečného způsobu vzdáleného přihlašování a zajistili si kontrolu nad datovým provozem probíhajícím skrze zabezpečený server.