Robustnost serveru napsaného v Go

Webar

Robustnost serveru napsaného v Go
« kdy: 20. 04. 2017, 16:07:45 »
Zdravím, píšu malý jednoduchý server v Go a zajímalo by mě, jak ho napsat robustně. Nikdy tam nebude více než desítky spojení za minutu, jde mi spíše o zabezpečení proti různým útokům (poslání enormního množství dat, ponechání otevřených spojení apod.). Většina postupů asi bude obecných (nejen pro Go), jde mi o základní a nejnutnější opatření, aby ten server na webu "přežil".
« Poslední změna: 20. 04. 2017, 17:04:24 od Petr Krčmář »


john

Re:Robustnost serveru
« Odpověď #1 kdy: 20. 04. 2017, 16:44:07 »
Pokial nemusis znovu objavovat koleso, tak pouzi https://github.com/mholt/caddy. Pokial musis, tak sa skus tym caddy projektom inspirovat.

Tomas2

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Robustnost serveru napsaného v Go
« Odpověď #2 kdy: 20. 04. 2017, 20:02:32 »
máš důvod ho nepřesadit něčím jako nginx, haproxy, varnish? Tyhle kousky jsou dost hard tested v reálných prostředích, go a třeba zmiňované caddy není špatné, ale bál bych se toho, není to dobře otestované a nasazení je hodně slabé. Implementace neprošla žádným auditem nebo vývoj je tak rychlý, že audit zastará už za měsíc.

Nedávná chyba u cloudflare, kdy si udělali bug v nginx modulu toho je důkazem.

Re:Robustnost serveru napsaného v Go
« Odpověď #3 kdy: 21. 04. 2017, 13:09:04 »
Jak už bylo řečeno, většinou se jedná o obecná pravidla, která se jen volně váží na konkrétní implementaci. Pro inspiraci třeba https://www.cyberciti.biz/tips/linux-unix-bsd-nginx-webserver-security.html. Některé konfigurační věci v nginx je třeba v Go implementovat jako middleware (např. omezení velikosti requestu).

máš důvod ho nepřesadit něčím jako nginx, haproxy, varnish? Tyhle kousky jsou dost hard tested v reálných prostředích, go a třeba zmiňované caddy není špatné, ale bál bych se toho, není to dobře otestované a nasazení je hodně slabé. Implementace neprošla žádným auditem nebo vývoj je tak rychlý, že audit zastará už za měsíc.

Nedávná chyba u cloudflare, kdy si udělali bug v nginx modulu toho je důkazem.
Samozřejmě, že výše uvedené alternativy jsou poměrně rozšířené, na druhou stranu argumenty o auditu a vývoji jsou liché, protože platí i pro tyto systémy. Go není node.js, kde by vývoj probíhal překotným tempem z měsíce na měsíc. A právě zmiňovaná chyba v nginx modulu ukazuje, že i případný audit je platný jen pro tuto konkrétní auditovanou konfiguraci a nic jiného. HTTP server v Go je velmi stabilní a dovolím si říct že i relativně dost ověřený. Přidání další vrstvy může situaci zlepšit nebo zjednodušit, ale pokud to dělá někdo neznalý této technologie tak i paradoxně zhoršit.

Záleží na použití, nakonec v naprosté většině případů se chyby najdou v konkrétní implementaci v kódu a není možné jim jednoduše předejít nějakým filtrováním vstupních paketů. V důsledku proto pro jakýkoliv vstup platí: validovat, validovat, validovat.

Tomas2

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Robustnost serveru napsaného v Go
« Odpověď #4 kdy: 21. 04. 2017, 14:46:54 »
Samozřejmě, že výše uvedené alternativy jsou poměrně rozšířené, na druhou stranu argumenty o auditu a vývoji jsou liché, protože platí i pro tyto systémy. Go není node.js, kde by vývoj probíhal překotným tempem z měsíce na měsíc.

Mluvil jsem o caddy, nikoliv o Go, tam je implementace http stabilní a autorem je Brad F., který za sebou má projekty typu memcached. Problém tam je ale třeba s keepalive a dá se navytvářet tolik spojení, že server chytne OOM poměrně rychle. O auditu máš samozřejmě pravdu.

V Go si u https musím třeba sám logiku zabalení vyřešit, ať už přes modul crypto/tls či ještě chytřejší wrapper, tady je velké riziko, že prostě něco udělám špatně, že server bude náchylný na DoS či MitM. Nemožnost snadno řešit rate limiting, blacklisting či logování a nutnost si to implementovat, je obrovský vektor pro právě možné bezpečnostní chyby.

Webový server (či jakákoliv aplikace) není jen o samotné jádru, ale právě o těch stovkách vedlejších služeb a funkcí, které zajišťují jeho běh a na které je potřeba dát pozor.


Re:Robustnost serveru napsaného v Go
« Odpověď #5 kdy: 21. 04. 2017, 16:52:25 »
Myslím, že nejsme v rozporu... :)
Problém tam je ale třeba s keepalive a dá se navytvářet tolik spojení, že server chytne OOM poměrně rychle.
Pokud se používá defaultní instance Serveru, tak ano, to je ale tak pro testování na lokále. I v dokumentaci je uvedeno, že je potřeba vytvořit vlastní s vlastním nastavením.
 
V Go si u https musím třeba sám logiku zabalení vyřešit, ať už přes modul crypto/tls či ještě chytřejší wrapper, tady je velké riziko, že prostě něco udělám špatně, že server bude náchylný na DoS či MitM. Nemožnost snadno řešit rate limiting, blacklisting či logování a nutnost si to implementovat, je obrovský vektor pro právě možné bezpečnostní chyby.

Webový server (či jakákoliv aplikace) není jen o samotné jádru, ale právě o těch stovkách vedlejších služeb a funkcí, které zajišťují jeho běh a na které je potřeba dát pozor.
Tady úplně nerozumím, co máš na mysli tím zabalením. U https jen přidám certifikáty a mám regulérní https server kvality A podle SSL labs https://blog.bracebin.com/achieving-perfect-ssl-labs-score-with-go.
Logování je potřeba řešit stejně, takže to pak můžu mít vše v jednom logu.

Některé věci se určitě na nginx mohou řešit snadněji, ale potřeba přidávat další vrstvu, kterou je potřeba sledovat, je pro menší projekt, který nevisí na totální bezpečnosti (a to je 90% menších projektů), pro mne zbytečná vrstva navíc. A pokud si vybere nějaký slušný mux nebo mini framework (fuj, to je ale sprosté slovo) :), tak velkou část má pořešenu.

Tomas2

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Robustnost serveru napsaného v Go
« Odpověď #6 kdy: 21. 04. 2017, 18:01:25 »
ne, v rozporu nejsme.

Ano, myslím, přesně ten příklad, co jsi uvedl, je to jen hello world nad https, musíš si přes api dozapnout a doimplementovat SessionCache a její uvolňování, stejně tak je potřeba myslet na nedokončené inicializace session a spousty malých drobností, které se dají zneužít ke shození serveru.

Ano, pro vývoj nebo pro intranety je to super, používáme, užíváme, nemám výtku. Provozovat veřejně a produkčně to lze, ale je k tomu potřeba ještě spousta drobné práce a ladění.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Robustnost serveru napsaného v Go
« Odpověď #7 kdy: 21. 04. 2017, 18:19:09 »
máš důvod ho nepřesadit něčím jako nginx, haproxy, varnish? Tyhle kousky jsou dost hard tested v reálných prostředích, go a třeba zmiňované caddy není špatné, ale bál bych se toho, není to dobře otestované a nasazení je hodně slabé. Implementace neprošla žádným auditem nebo vývoj je tak rychlý, že audit zastará už za měsíc.

Nedávná chyba u cloudflare, kdy si udělali bug v nginx modulu toho je důkazem.
To je zbytečné, na amd64 stačí holé Go, od verze 1.8 je server dostatečně bezpečný, když se nastaví timeouty a limit requestu a hlaviček.

Tomas2

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Robustnost serveru napsaného v Go
« Odpověď #8 kdy: 21. 04. 2017, 19:32:15 »
zboj: pro mě je bezpečnost i to, že někdo může vzdáleně celý server poslat do kytek nebo ho vytížit k nepoužití. Samotný kód je v pořádku, ale sám píšeš "když se nastaví", ano, je potřeba desítky drobných úprav a ošetření. Tohle je primárně na vývoj a test, nikoliv na provoz venku, to ale neznamená, že se to k tomu nedá přizpůsobit, jen je potřeba se vyvarovat těm mraky modulům na githubu, které to "chtějí dělat dobře".

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Robustnost serveru napsaného v Go
« Odpověď #9 kdy: 22. 04. 2017, 15:43:55 »
zboj: pro mě je bezpečnost i to, že někdo může vzdáleně celý server poslat do kytek nebo ho vytížit k nepoužití. Samotný kód je v pořádku, ale sám píšeš "když se nastaví", ano, je potřeba desítky drobných úprav a ošetření. Tohle je primárně na vývoj a test, nikoliv na provoz venku, to ale neznamená, že se to k tomu nedá přizpůsobit, jen je potřeba se vyvarovat těm mraky modulům na githubu, které to "chtějí dělat dobře".
Jistě, ale v Go 1.8 už to nejsou desítky, ale jen pár věcí kolem implementace. Od této verze už to je na bezpečný provoz venku. A ano, různým 3rd party modulům je lepší se vyhnout, nejlepší je spolehnout se na standardní knihovnu.

Tomas2

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Robustnost serveru napsaného v Go
« Odpověď #10 kdy: 22. 04. 2017, 18:10:16 »
ale dokud někdo těch "pár" neveme a nezabalí to do standardní knihovny, bude to pořád na hraně. I 1.8 chytá v reálném provozu dost OOM, na uzavřené síti s ní není tolik problémů, po intranetu neběhá totiž tolik robotů.

zboj

  • *****
  • 1 507
    • Zobrazit profil
    • E-mail
Re:Robustnost serveru napsaného v Go
« Odpověď #11 kdy: 22. 04. 2017, 18:45:48 »
ale dokud někdo těch "pár" neveme a nezabalí to do standardní knihovny, bude to pořád na hraně. I 1.8 chytá v reálném provozu dost OOM, na uzavřené síti s ní není tolik problémů, po intranetu neběhá totiž tolik robotů.
To jsme si nerozuměli (resp. nepřesně jsem to napsal), ono to už v té standardní knihovně je, je to jen o konfiguraci.