Jak zajistit svůj zásobník LEMP

 

 

LEMP, to znamená Linux, (EngineX) NGINX, MariaDB (nebo MySQL) a PHP. Díky své flexibilitě a jednoduchosti NGINX pomalu přebírá internet.

V tomto tutoriálu se pokusíme prostřednictvím příkladů špatných a správných postupů projít kroky správného zabezpečení webového serveru Linuxu.

Tak jaký je termín Bezpečnost? Často můžete slyšet IT Engineery, kteří říkají "Naše síť je bezpečná" or "Naše servery jsou bezpečné" tyto věty, i když jsou široce používány, nejsou technicky správné, jako v mnoha knihách a publikacích to zjistíte Bezpečnostní protože termín není statickou hodnotou, nýbrž stupněm.

Z Wikipedie definice je:

"Bezpečnost je stupeň odolnosti nebo ochrana před škodami. Platí pro všechny zranitelné a / nebo cenné majetek, jako je osoba, obydlí, komunita, položka, národ nebo organizace. "

Pokud jde o servery nebo aplikace, měli bychom si vždy uvědomit, že čím bezpečnější je jejich server nebo aplikace, tím méně je přístupná (je těžší získat přístup). Samozřejmě, nejlepší příklad pro toto je přísloví:

"Nejbezpečnější server je ten, který je vypnutý.".

Stejně tak směšné, jak to může znít, je to příležitostně praktikováno některými organizacemi, kde jsou jejich nejbezpečnější servery udržovány offline a / nebo v naprosto uzavřených sítích a jsou napájeny pouze tehdy, když potřebují být.

Očekávané publikum

Než začneme dále, musíme upozornit na to, že tato příručka je určena pro středně pokročilé uživatele s určitými znalostmi týkajícími se instalace a konfigurace zásobníku LEMP. Budeme předpokládat, že vy (čtenář) již máte příslušné znalosti pro manipulaci s operačním systémem Linux. Tato příručka není pro začátečníky. Mnoho dalších souvisejících témat je spojeno s touto příručkou a podobně instalace zásobníku LEMP, instalace certifikátů SSL, konfigurace ověřování veřejným klíčem a mnoho dalších je mimo rozsah tohoto výuku. Nicméně můžete získejte od nás VPS a uděláme to pro vás zdarma (a ještě víc!). Takže ve skutečnosti nepotřebujete žádné administrátorské dovednosti v Linuxu, pokud získáte od nás řízené VPS.

Předpoklady

  • Použijeme jednoho z našich CentOS 7 VPS, ale pokyny jsou podobné i pro jiné distribuce, například ubuntu;
  • Pokročilé znalosti pro správu operačních systémů Linux;
  • Základní znalosti o síti. TCP / IP, protokoly, porty;
  • Znalosti pro vytváření základních konfigurací NGINX;
  • MySQL databázové know-how;
  • PHP know-how;

Zabezpečení samotného systému Linux

Linux od přírody je velmi bezpečný operační systém. Například viry nemohou nebo mohou zřídka poškodit OS.

Navzdory tomu existuje řada opatření, která by měla být brána v úvahu, aby člověk mohl mít ještě bezpečnější systém.

Vždy máte k dispozici nejnovější aktualizace softwaru a zabezpečení

To se však již předpokládalo, ale domníváme se, že je třeba jej zmínit kvůli úplnosti této příručky. Bez ohledu na to, co děláte, pokud váš systém není aktuální, budou zneužity současné a staré chyby a váš server bude nakonec ohrožen, nikoliv lidmi, ale automatizovanými boty, kteří vyhledávají tyto chyby zabezpečení. Hacker si ani neuvědomí, že váš server byl napaden, jeho scénář to pro něj udělá. Měli byste vždy aktualizujte svůj systém. Jedná se o jakýkoli software a aplikaci, která je na vašem serveru, a na něm běží jakákoli webová stránka (CMS). Pokud používáte aplikaci WordPress jako webovou stránku, musí být aktualizována, jakmile bude vydána nová verze.

Zajištění vzdáleného přihlášení

  1. Zřejmé - The root heslo by mělo být velmi dlouhá a silná kombinace písmen, čísel a symbolů.
  2. Změňte výchozí port SSH (22) na náhodný port.
  3. Dálkové kořenové přihlašování by mělo být zakázáno.
  4. Je třeba použít mechanismus ověřování veřejného klíče namísto přihlašování hesel.
  5. Při používání výše uvedených standardních uživatelských účtů Linuxu byste měli používat. Tito uživatelé by měli mít možnost eskalovat oprávnění root.

Například:

Nastavíme heslo pro root na něco jako `BvP7mW # zX9rwK! PSA ^ jk`

Pokud je to základní instalace Linuxu (CentOS), nainstalujte nejprve sudo.

# yum nainstalovat sudo

Vytvořte standardního uživatele:

# useradd -d / home / adminjohn adminjohn # passwd adminjohn <zadat-adminjohn's-very-strong-password-dvakrát>

Grant admin john je schopen eskalovat oprávnění root:

# visudo

Na konci souboru najděte část, kde se uvádí:

## Umožňuje lidem ve skupinovém kole spouštět všechny příkazy% wheel ALL = (ALL) ALL

A ujistěte se, že linka není doprovázena.

Nyní přidejte náš adminjohn jako člena skupiny.

# usermod -a-G wheel adminjohn

Upravit / etc / ssh / sshd_config a nastavte následující:

Poznámka: Zatímco to děláte, buďte velmi opatrní, protože se můžete snadno odemknout z vašeho serveru. Vždy se ujistěte, že máte přístup k konzole nebo dvě nebo více kořenových relací otevřených, abyste mohli otestovat a vrátit zpět změny.

# vim / etc / ssh / sshd_config Port 29862 PermitRootLogin ne

Díky těmto nastavením je zakázáno vzdálené spuštění kořenového přihlašování, nicméně náš uživatel adminjohn bude se moci přihlásit přes ssh a pak může přepnout na root pomocí příkazů sudo su - Pokud je potřeba.

Tento systém lze dále vylepšit implementací autentizace pomocí veřejného klíče. To je však složitější a je mimo rozsah tohoto průvodce.

Linux firewall

Většina systémů Linux dnes používá buď IPTables or Firewalld jako jejich firewall. Klíčovým pojmem, který zde chápeme, je, že pokud chceme, aby náš firewall byl účinný, musíme v zásadě implementovat tzv. popřít všechny zásady výjimek.

Například: Pokud váš server používá pouze webovou stránku aplikace WordPress, pak by měl každý případný firewall povolit pouze přístup k portům 80 (HTTP), 443 (HTTPS) a 22 (SSH) nebo jinému portu, o kterém se rozhodnete. V našem příkladu bychom měli povolit přístup k 80, 443 a 29862. Můžeme však dále rozšířit své využití a také otevřít port 25, pokud chceme posílat e-maily z našich stránek. Pokud si nejsme jisti, můžeme vždy použít příkaz netstat -tulnp abychom zkontrolovali všechny aktivní porty na našem serveru a rozhodli se, co by mělo a nemá být použito.

Zakázání nepoužívaných služeb

Chcete-li jít ještě o krok dále, na libovolném serveru Linux je nutné vždy zakázat všechny nepoužívané služby / aplikace, protože to výrazně omezí útokový povrch serveru. Čím více služeb přidáte, tím více zvětšíte útočnou plochu serveru a tím větší náchylnost k útoku se stává. Moderní implementace Linuxu, jako jsou CentOS 7 a Ubuntu 16, používají systemd jako jejich démon init. Služby, které potřebují přístup k síti, lze snadno identifikovat pomocí služby netstat -tulnp příkaz.

V níže uvedeném příkladu vidíme, že náš systém (CentOS 7) běží dovecot, postfix (master), sshd, vsftpd a nginx.

# Netstat -tulnp Aktivní připojení k Internetu (pouze servery) Proto Recv-Q-Q Poslat Místní název adresa Cizí adresa Stav PID / Program tcp 0 0 0.0.0.0: 993 0.0.0.0: * POSLOUCHEJTE 444 / holubník tcp 0 0 0.0.0.0: 995 0.0.0.0: * POSLOUCHEJTE 444 / holubník tcp 0 0 0.0.0.0: 587 0.0.0.0: * POSLOUCHEJTE 442 / master tcp 0 0 0.0.0.0: 29862 0.0.0.0: * POSLOUCHEJTE 30430 / sshd tcp 0 0 0.0.0.0: 110 0.0.0.0: * POSLOUCHEJTE 444 / holubník tcp 0 0 0.0.0.0: 143 0.0.0.0: * POSLOUCHEJTE 444 / holubník tcp 0 0 0.0.0.0: 80 0.0.0.0: * POSLOUCHEJTE 241 / Nginx: master P tcp 0 0 0.0.0.0: 21 0.0.0.0: * POSLOUCHEJTE 119 / vsftpd tcp 0 0 0.0.0.0: 25 0.0.0.0: * POSLOUCHEJTE 442 / master

Pokud se rozhodneme, že nepotřebujeme dovecot, může být zakázáno pomocí:

# # Buďte opatrní, abyste nezakazovali nic zásadního systému

Druhý způsob zakazuje převrácení dovecot při příštím spuštění systému.

Poznámka: Starší systémy používají starší démony init, takže na těchto systémech jsou příkazy správy služeb odlišné. Ubuntu 14 například používá upstart a CentOS 6 používá sysvinit. Pokud se chcete dozvědět, jak můžete v těchto systémech zakázat / povolit služby, měli byste si prohlédnout jejich dokumentaci.

Zabezpečení NGINX

NGINX by měl běžet jako uživatel bez oprávnění root

Výchozí instalace NGINX nastavuje proces, který má být spuštěn jako nginx nebo www-data jako uživatel. Pokud je server spuštěn jako root, může být změněn nastavením příslušné směrnice v /etc/nginx/nginx.conf soubor.

uživatel nginx;

Mějte na paměti, že pokud je uživatel nastaven jako root a změníte jej, může to narušit vaše webové stránky, protože to může vyžadovat další přizpůsobení oprávnění root.

Normální oprávnění webového kořenového adresáře jsou 755 pro adresáře a 644 pro soubory.

Skrýt číslo verze Nginx

Čísla verzí jsou hackeři často využívána k zneužití již přítomných zranitelných míst.

Dejte to do bloku http /etc/nginx/nginx.conf:

# vim /etc/nginx/nginx.conf server_tokens vypnutý;

Vynucení pomocí protokolu HTTPS

Pokud se zaměřujete na vysoce zabezpečené stránky, měli byste vždy standardizovat názvy adres URL a vynucovat uživatele, aby používali protokol HTTPS. Obvykle vývojáři umístí záhlaví do svého webu WordPress, nicméně správný způsob, jak to udělat, je z vlastního NGNIXu.

V níže uvedeném příkladu máme dva bloky serveru. Prvním je jediný účel je zachytit standardní požadavky HTTP a přesměrovat je na požadavky HTTPS.

server {poslech 80; název_serveru yoursite.com www.yoursite.com; návrat 301 https: //yoursite.com$request_uri; }}
server {poslech 443; název_serveru yoursite.com www.yoursite.com; ssl_protocols TLSv1.1 TLSv1.2; # [...]}

Omezit HTTPS na TLSv1.1 a TLSv1.2

Viz výše uvedený příklad. V bloku serverů SSL ssl_protocls směrnice jasně definuje protokoly, které by měly být povoleny. Liberálnější přístup by zahrnoval i TLSv1:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Předávání nekontrolovaných požadavků na PHP

Mnoho online příruček o nastavení NGINX s PHP obsahuje následující oddíly:

umístění ~ * .php $ {fastcgi_pass backend; # [...]}

Ve výše uvedeném příkladu každá žádost končící . Php budou předány do FastCGI backend. Výchozí konfigurace PHP se pokusí odhadnout, který soubor chcete spustit, pokud zadané umístění nevede k skutečnému souboru php.

Pokud je například zadána žádost /yoursite.com/wp-content/uploads/1232.jpg/file.php který neexistuje, ale pokud /yoursite.com/wp-content/uploads/1232.jpg bude překladač PHP zpracovávat //yoursite.com/wp-content/uploads/1232.jpg místo toho. Pokud obsahuje vložený kód PHP, bude tento kód proveden odpovídajícím způsobem. Víte, co to znamená? Pokud máte stránky WordPress, které umožňují uživateli nahrát obrázky, útočník by mohl snadno nahrát škodlivý soubor, který se skryje jako obrázek a ohrozit váš web.

Existuje několik řešení, a to jak v konfiguraci NGINXu, tak v samotném PHP (viz níže v Securing PHP).

Jedním z přístupů je zajistit, aby jste zadali konkrétní soubory NGINX k provedení. Jedná se o nejbezpečnější metodu, ale bude také omezovat soubory povolené k provedení a může vám problémy později.

V následujícím příkladu náš server zpracuje pouze pojmenované soubory index.php, site.php a cms.php.

umístění ~ * (index.php | site.php | cms.php) .php $ {fastcgi_pass backend; # [...]}

Dalším přístupem je použití try_files směrnice. V níže uvedeném příkladu, pokud poskytnutý soubor neexistuje, NGINX hodí chybu 404.

umístění ~ * .php $ {try_files $ uri = 404; fastcgi_pass backend; # [...]}

V neposlední řadě zakažte zpracování skriptů pro libovolné složky, které nejsou pro tento účel určeny. Abychom byli přesnější, takové složky jsou obvykle složky, které obsahují jakýkoli druh nahrávání.

umístění / nahrání {location ~ .php $ {return 403;} # [...]}

Stále někde? Získejte plně spravovaný VPS od nás a kompletně a správně zajistíme váš server.

Zabezpečení MySQL / MariaDB

Na téma zabezpečování vaší databáze MySQL není mnoho a ve skutečnosti je nejlepším způsobem, jak zajistit, že není přístupná odkudkoliv kromě samotného hostitele. Po instalaci MySQL balíček obsahuje skvělý skript pro nasazení, který lze vyvolat pomocí mysql_secure_installation na vašem serveru. Scénář je skvělý, protože se ujistí, že nejsou žádné volné konce. Bude vás vyzvat k nastavení hesla uživatele MySQL, stejně jako k vypnutí vzdáleného přihlášení a odebrání testovací databáze.

Pro ty z vás, kteří již mají funkční servery a nechtějí spustit skript, je nejlepším místem ke kontrole /etc/my.cnf a ujistěte se, že máte bind-adresa = 127.0.0.1 hodnota nastavena a není komentována.

Dalším velmi bezpečným mechanismem je použití jednoho (číst alespoň jednoho) uživatele / databáze na jednom místě. Mnoho webových stránek využívá uživatele root mysql pro připojení webových stránek k databázi. Uživatel root má ve výchozím nastavení přístup ke každé jiné databázi. To znamená, že jakákoli objevená chyba zabezpečení na jednom webu může být potenciálně zneužita pro útočníka, aby získal přístup ke všem vašim databázím.

Dolní řádek je, pokud máte na svém serveru tři webové stránky, a proto by měli mít přístup k vlastní databázi nejméně tři uživatelé databáze.

Zabezpečení PHP

Samotný PHP poskytuje poměrně velký útokový povrch, zejména proto, že většina PHP implementací ve výchozím nastavení má poměrně liberální konfigurace, takže vývojáři mohou psát svůj kód bez přílišného potíží. Zde zmíněné podtémy jsou obecnými úvahami pro sysadminy. Ty však musí být dodatečně vyladěny podle potřeb developera. Zabezpečení PHP interpreta je vždy argumentem a debatou mezi sysadminy a vývojáři a může být provedeno správně, pouze pokud všichni společně pracují.

Vždy je argument a diskuse mezi sysadminy a vývojáři, takže je to možné jen tehdy, pokud oba pracují společně.

Typy PHP útoků

SQL Injection

Jedná se o zranitelnost samotné aplikace, obvykle špatně kódované PHP aplikace téměř vždy tuto chybu zabezpečení. Populární CMS systémy jsou vždy zabezpečeny proti tomuto typu útoku. O tomto typu útoku nelze říci mnoho, kromě toho, že nejlepším způsobem, jak tomu zabránit, je dobré vzdělání pro vývojáře.

XSS - Cross Site Scripting

Tyto typy slabých míst jsou těžko obhájitelné. Vývojáři běžně používaných CMS platforem jako WordPress, Joomla, Drupal apod. Jsou velmi opatrní a ujistěte se, že jejich kód je správně napsán a pravidelně opravován. Většina bezpečnostních opatření proti těmto a jiným typům útoků může být implementována prostřednictvím hlavního konfiguračního souboru PHP. Více o tom později.

Požadavky na falešnou žádost - CSRF

Typ útoku, který donutí koncového uživatele vykonat nežádoucí akce v webové aplikaci, kde je aktuálně ověřen. Pokud je uživatel správcem, může dojít k ohrožení celého webu. Bankovní a e-commerce stránky jsou obzvláště zaměřeny na tyto typy útoků, zejména proto, že útočníci mají zájem krást své informace o účtu, aby získali přístup k jejich prostředkům.

PHP.INI Tweaks

Zastavte zpracování PHP, pokud není nalezen soubor

Ujistěte se, že cgi.fix_pathinfo = 0 je ve skutečnosti nastavena na hodnotu 0 v php.ini. To způsobí, že tlumočník PHP vyzkouší pouze zadanou doslovnou cestu a zastaví zpracování, pokud není nalezen soubor. Vzpomínáte si na příklady z Předávání nekontrolovaných požadavků na PHP části Securing NGINX? Toto je poslední část skládačky NGINX / PHP-FPM.

Zakázání funkcí PHP Nebezpečné

Flexibilita PHP obsahuje ve výchozím nastavení mnoho funkcí, které lze použít nebo zneužívat v závislosti na tom, co si přejete dosáhnout. Například pro pokročilejší konfigurace PHP umožňuje vzdálené spouštění souborů, kde mohou být soubory vzdáleně spuštěny z jiného serveru. I když to může znít zábavně, je to také bezpečnostní chyba, kde útočník může otevřít a spustit libovolný soubor na vzdáleném serveru. To jim dovolí také nahrávat škodlivé soubory. Vzdálené spuštění souboru by mělo být zakázáno z konfiguračního souboru PHP.

disable_functions = exec, eval, phpinfo, passthru, shell_exec, systém, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source

Omezení nahrávání souborů

Viděli jsme, že prostřednictvím konfigurace NGINX můžeme omezit nahrávání souborů pouze do určitých adresářů na našich stránkách. Pokud však vaše stránky vůbec nepoužívají funkce nahrávání souborů, mohou a měly by být zcela zakázány.

file_uploads = Vypnuto

Samozřejmě, pokud aplikace používá funkci nahrávání souborů, může být logicky povoleno omezením velikosti velikosti nahrávání. V níže uvedeném příkladu lze nahrát soubory až do velikosti 1 megabajtů.

file_uploads = Na upload_max_filesize = 1M

Nastavte velikost POST na přiměřenou hodnotu

Metoda POST se používá vždy, když uživatel potřebuje odeslat nějaká data do vašeho serveru / webové aplikace a jako taková může být potenciálně zneužita pro škodlivé použití, například útok DoS. To také zahrnuje odesílání velkých souborů na váš server. Tato metoda je však také nedílnou součástí jakékoli webové aplikace, takže nejlepší způsob, jak se chránit, je omezit její hodnotu a nastavit ji na něco rozumnějšího. Pokud nepoužíváte nahrávání souborů, může být její hodnota nastavena na něco jako 4 KB nebo méně.

post_max_size = 1K

Pokud používáte funkci nahrávání souborů, měla by být nastavena na hodnotu, která je větší než hodnota upload_max_filesize na vašem serveru.

Omezení PHP úniku informací

Nastavením expose_php = Vypnuto, lze jednoduše skrýt informace, které PHP nainstaluje na server. To ve skutečnosti skryje podpis, který PHP opouští na hlavičku webového serveru. Dokumentace PHP uvádí, že ponechání této hodnoty na hodnotu ON není chybou zabezpečení. Nikdo však nemůže popřít skutečnost, že čím méně informací předkládáte vnějšímu světu, tím bezpečnější bude váš server.

Omezení maximální doby provádění PHP skriptu

Nastavte následující hodnoty ve vašem php.ini soubor. Mohou být později přizpůsobeny podle konkrétnějších potřeb.

# set v sekundách max_execution_time = 30 max_input_time = 30 memory_limit = 40M

Nejen, že nastavení těchto limitů je skvělou prevencí útoku DoS, ale mohou také chránit váš server pomocí nedbalého programování a nekonečných smyček. Co to v podstatě dělá, je následující:

  1. Nastaví maximální čas na 30 sekund, který může skript spouštět předtím, než je ukončen analyzátorem (PHP).
  2. Nastaví maximální čas na 30 sekund, že skript může analyzovat vstupní data, například POST a GET.
  3. Nastaví maximální velikost paměti na hodnotu 40 MB, což je hodnota, kterou je povoleno přidělit skript.

V mnoha konfiguracích PHP je hodnota memory_limit nastavena na -1, což je ve vývoji, ale jinak špatná volba.

Zakázat nepoužívané moduly PHP

PHP moduly jsou skvělé, protože umožňují a umožňují určité funkce vaší webové aplikace. Nejběžnějším příkladem je modul PHP pdo_mysql, který PHP umožňuje přístup k databázím MySQL. Všechny tyto moduly však mohou s sebou přinášet vlastní chyby a zranitelnosti a pokud nejsou použity, mohou být zakázány nebo odstraněny. Použitím příkazu php -m můžete vidět všechny nainstalované moduly PHP. Vypnutí nepoužívaných modulů snižuje povrch útoku PHP. V ideálním případě by měl být PHP přeinstalován a kompilován pouze pomocí potřebných modulů. Nicméně, pokud máte pocit, že to všechno je příliš mnoho, pak je můžete jednoduše zakázat tím, že odkomentujete jejich řádek v php.ini nebo přejmenujete jejich konfigurační soubor na /etc/php.d/module_name.ini na něco podobného /etc/php.d/module_name.ini.disabled.

závěr

Samotný server Linux je samozřejmě velmi bezpečný operační systém. To se nepočítá za žádnou nedbalost, proto by měly být vždy prováděny standardní bezpečnostní opatření. Přímé kořenové přihlášení se nikdy nedoporučuje a vždy se doporučuje autentizace s veřejným klíčem.

Správná implementace LEMP stacků je nezbytná pro jakékoli nastavení zabezpečeného webového serveru. Nicméně je třeba mít vždy na paměti, že je to jen jedna část zabezpečení. Zabezpečení serverů a webových aplikací by mělo být ve skutečnosti společným úsilím mezi vývojáři a správci systému. To je druhá část je v samotném kódu aplikace. Například, i když všechny výše uvedené jsou pečlivě plánovány a implementovány, ale vývojáři nezabezpečují MySQL dotazy správně, vaše aplikace bude zranitelná útokem MySQL Injection, který povede k úniku dat.

Konečně pravidelná instalace upgradu aplikací a bezpečnostních záplat je vždy jedním z nejlepších způsobů, jak chránit před jakýmikoli známými zranitelnostmi. Váš server a aplikace, pokud se necháte bez dozoru, budou nakonec ohroženy.

 

Zdroj

2 Komentáře

  1. SSD12

Napsat komentář

Tyto stránky používají Akismet k omezení spamu. Zjistěte, jak jsou vaše údaje komentářů zpracovávány.

GTranslate Your license is inactive or expired, please subscribe again!