Jak zabezpečit Linux server

Poslední aktualizace 20. 12. 2022


Úvod

V posledních letech se značně rozmohla forma DDoS útoků s využitím UDP reflexe se zesílením (UDP-Based Amplification Attacks), které spoléhají na veřejně přístupné nezabezpečené servery a pomocí amplifikačního faktoru zahlcují cíle množstvím požadavků.

Zjednodušeně, nemáte-li správně zabezpečené služby, které běží na vašem serveru, necháváte útočníkům otevřené dveře a umožňujete jim, aby váš server využili jako prostředníka pro útok. Když se jim to podaří, získají hned dvě výhody. Skrze váš server mohou útok zesílit, protože některé protokoly dovolí zvýšit původní sílu útoku o 10–100násobek. Současně mohou využívat i několika desítek až tisíců takových prostředníků. Neexistuje tudíž jediný bod, ze kterého útok vychází, a tak se pro cíl útoku komplikuje obrana při probíhajícím útoku. Pokud jste se stali prostředníkem útoku, většinou to zjistíte až ve chvíli, kdy dojde k oznámení o účasti na útoku ze strany poskytovatele připojení vašeho serveru, případě cíle útoku.

Připravili jsme pro vás návody pro zabezpečení některých běžně zneužívaných UDP protokolů.

Poznámka: Více informací o možných zneužitelných UDP službách lze najít na: https://www.us-cert.gov/ncas/alerts/TA14-017A.

O mechanismu útoků:

Vypnutí DNS rekurze

Pokud je DNS rekurze na serveru povolena, server se na základě požadavku od klienta dotazuje dalších DNS serverů pro resolve celého DNS jména před odesláním odpovědi nazpět. Toto nastavení značnou mírou zvyšuje zranitelnost serveru k amplifikačním útokům. Rekurze by měla být na serveru VŽDY zakázána pro IPv4/IPv6 klienty, kteří jsou mimo sítě, kde chcete rekurzívní DNS poskytovat.

Pokud u serveru nepotřebujete rekurzivní dotazování, můžete je vypnout následovně:

Pokud využíváte služby BIND

  1. Připojte se přes SSH na svůj server.
  2. Otevřete si konfigurační soubor named.conf.
    • pro Debian umístěn v /etc/bind/named.conf
    • pro Ubuntu umístěn v /etc/bind/named.conf
    • pro Centos umístěn v /etc/named.conf
  3. V souboru najděte: recursion. Server s povolenou rekurzí má nastaveno: recursion yes;.
  4. Změňte na: recursion no; a uložte konfigurační soubor.
  5. Je třeba restartovat DNS službu: service named restart.

Pokud využíváte Dnsmasq

  1. Připojte se přes SSH na svůj server.
  2. Otevřete si konfigurační soubor dnsmasq.conf, který je umístěn v /etc/dnsmasq.conf.
  3. V souboru najděte no-resolv a tento řádek odkomentujte – Dnsmasq pak nebude přeposílat žádné dotazy na adresy umístěné v /etc/resolv.conf, což je chování, které se typicky označuje jako rekurze.
  4. Je třeba restartovat službu: service dnsmasq restart.

Otestovat nastavení můžete například zde: https://openresolver.com, stačí pouze zadat IP vašeho serveru. Pokud se objeví Recursive resolver is not detected on máte zabezpečeno.

V případě, že potřebujete využívat služby rekurzivního dotazování, je potřeba je zabezpečit. Toho docílíte pomocí omezení IP adres, které mohou odesílat rekurzívní dotazy směrem k serveru na určité rozsahy.

Pokud používáte BIND

Je možné pro omezení klientů, kteří mají povoleny rekurzívní dotazy mechanismus ACL.

acl "trusted" {
192.168.0.0/16;
10.153.154.0/24;
localhost;
localnets;
};
options {
...
allow-query { any; };
allow-recursion { trusted; };
allow-query-cache { trusted; };
...
};

Příklad bezpečné konfigurace pro BIND naleznete na: https://www.cymru.com/Documents/secure-bind-template.html

Zabezpečení Portmap

Portmap je služba, která dynamicky přiřazuje porty. Využívá ji například NFS. Představuje však širokou zranitelnost, a to kvůli nízké úrovni autentifikačního mechanismu a možnosti přidělit široký rozsah portů službám, které ovládá.

Ověřit zneužitelnost můžete z jiného serveru příkazem rpcinfo aaa.bbb.ccc.ddd (IP adresa testovaného serveru). Pokud Vám odpovědí nebude rpcinfo: can't contact rpcbind: : RPC: Unable to receive, je potřeba server zabezpečit. Omezte provoz až na výjimky, kde službu potřebujete dále využívat.

Nejběžnějším řešením je zabezpečit komunikaci na úrovní  firewallu operačního systému, a to zamezením komunikace na portu 111 – základní návody jak přidat pravidla do firewall. Pokud potřebujete tuto komunikaci využívat částečně, pak můžete přidat pravidla, která povolí komunikaci jen pro specifické IP adresy či přímo rozsahy. Značným způsobem tak snížíte riziko zneužití.

Ubuntu/Debian

Jako základní firewall slouží UFW (Uncomplicated Firewall). Jedná se o defaultní firewall sloužící k zjednodušení iptables konfigurace.

Zablokování veškeré komunikace na portu 111:

sudo ufw deny 111

V případě že potřebujete komunikaci využít, můžete postupně přidat výjimky. Např. TCP komunikace pro IP a.b.c.d:

sudo ufw allow from aaa.bbb.ccc.ddd to any port 111 proto tcp

Pokud potřebujete přidat rozsah, funguje i:

sudo ufw allow from aaa.bbb.ccc.ddd/24 to any port 111 proto tcp

Nezapomeňte ani na IPv6. IPv6 mode musí být v UFW povolen. Zkontrolovat to můžete v konfiguračním souboru umístěném v /etc/default/ufw. Pro povolení musí obsahovat IPV6=yes. Po skončení úprav můžete překontrolovat veškerá pravidla příkazem: sudo ufw status numbered

Upozornění: Nezapomeňte pravidla firewall uložit.

Centos

Pro Centos Z/8 můžete využít FirewallD. Jedná se o kontroler pro pravidla iptables.

Komunikaci na port 111 zablokujete:

firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 port port=111 protocol=udp reject'
 
firewall-cmd --zone=public --add-rich-rule='rule family=ipv6 port port=111 protocol=tcp reject'

V případě že potřebujete komunikaci využít, můžete postupně přidat výjimky. Např. TCP komunikace pro IP aaa.bbb.ccc.ddd:

firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=aaa.bbb.ccc.ddd port port=111 protocol=tcp accept'
Upozornění: Nezapomeňte pravidla firewall uložit.

V případě že chcete zabezpečit přímo pomocí vkládání pravidel pro iptables:

Připojte se přes SSH na svůj server a přidejte pravidla do IP tables:

  1. Tímto pravidlem zakážete veškerou UDP komunikaci na port 111:
    iptables -A INPUT -p udp --dport 111 -j DROP
  2. V případě že z nějakého důvodu potřebujete UDP komunikaci, můžete zadat s výjimkou. Např. takto zůstane povolen rozsah 192.168.0.0./24:
    iptables -A INPUT -p udp -s! 192.168.0.0/24  --dport 111 -j DROP
  3. Zakažte také TCP komunikaci (případně bez povolení rozsahu stejně jako v předchozím případě):
    iptables -A INPUT -p tcp -s! 192.168.0.0/24  --dport 111 -j DROP
  4. Vložte pravidlo pro localhost:
    iptables -A INPUT -p tcp -s 127.0.0.1  --dport 111 -j ACCEPT

Totéž proveďte i pro IPv6, v prvním kroku jste zablokovali veškerou komunikaci. Pokud potřebujete vložit výjimku, tak např. pro localhost můžete provést následovně:

A INPUT -p udp -s  0:0:0:0:0:0:0:1 --dport 111 -j ACCEPT

Zabezpečení NTP

Nezabezpečené NTP servery mohou být využity pro distribuované DDoS útoky pomocí reflexe (váš server bude prostředníkem).

V nových verzích NTP jsou bezpečnostní mezery ošetřeny, proto v prvním kroku zjistěte, jakou verzi máte.

  1. Připojte se přes SSH na svůj server.
  2. Zjistěte verzi vašeho serveru příkazem: ntpd –version.
  3. Verze serveru musí být 4.2.7p26 nebo vyšší, v opačném případě je potřeba zabezpečit server.
  4. Zkontrolujte ještě příkazem: ntpdc -n -c monlist localhost.
  5. Otevřete si konfigurační soubor ntp.conf (umístění pro Debian, Centos i Ubuntu je /etc/ntp.conf).
  6. Do souboru přidejte řádky:
    restrict -4 default nomodify nopeer noquery notrap
    restrict -6 default nomodify nopeer noquery notrap
    disable monitor7
  7. V případě že váš NTP server nemusí odpovídat na dotazy z veřejných IP adres, přidejte také:
    restrict 127.0.0.1
    restrict ::1
  8. Uložte změny provedené v souboru.
  9. Restartujte NTP službu příkazem: service ntpd restart.
  10. Zkontrolujte, zda je zabezpečeno: ntpdc -n -c monlist localhost.

Zabezpečení Memcached

Memcached je velmi populární software, který se využívá pro cachování komponent, a tím pádem zkrácení času nezbytného pro odbavování požadavků. Je však častým terčem DDoS útoků pomocí UDP protokolu.

Pro Ubuntu:

  1. Připojte se přes SSH na svůj server.
  2. Otevřete si konfigurační soubor memcached.conf (typicky umístěn /etc/memchached.conf).
  3. Server by měl poslouchat na localhostu, zkontrolujte tedy přítomnost řádku: l 127.0.0.1 případně editujte.
  4. Pro budoucí zabezpečení přidejte na konec souboru řádek: -U 0. Ten zajistí nepřístupnost Memcached přes UDP.
  5. Uložte změny v souboru a restartujte službu: sudo service memcached restart.
  6. Pomocí příkazu sudo netstat -plunt | grep memcached, vypište stav a prověřte, zda Memcached běží pouze na localhostu (local address 127.0.0.1) a zda poslouchá pouze na TCP protokolu.

Pro Centos:

  1. Připojte se přes SSH na svůj server.
  2. Otevřete si konfigurační soubor memcached.conf (typicky umístěn: /etc/sysconfig/memcached).
  3. Najděte řádek OPTIONS a přepište jej na:
    OPTIONS="-l 127.0.0.1 -U 0"
  4. Případně řádek přidejte. To zajistí provoz Memached pouze na localhostu a nepřístupnost přes UDP protokol.
  5. Uložte změny v souboru a restartujte službu:
    sudo service memcached restart
  6. Pomocí přikazu sudo netstat -plunt | grep memcached vypište stav a prověřte, zda Memcached běží pouze na localhostu (local address 127.0.0.1) a zda poslouchá pouze na TCP protokolu.

Máte nejasnosti nebo nápad na zlepšení článku?

Napište nám