Jsme pod DDOS útokem 5 Gbps

Řada z vás si všimla, že máme poslední dva dny problémy s dostupností. S pomocí technické podpory datacentra Master DC se nám je daří držet na uzdě, bohužel tím, že máme vypnutý provoz směrem ze zahraničí. Ale pojďme se na to podívat popořadě.

DDOS je typ útoku, u kterého desítky tisíc počítačů z celého internetu posílají požadavky na jeden server. V našem případě jde o UDP flood a TCP SYN flood o síle 3 až 5 Gbps v závislosti na denní době. Přes noc útok ustal a ráno zase začal.

V serverech máme 1 Gbps síťové karty, takže podle grafů server končil se svým firewallem někde u 890 Mbps, což je tak 200-400 × víc, než běžný průměrný provoz. Cokoli dalšího se už k serverů nedostalo a bylo zahozeno switchi na cestě přes datacentrum. Na běžný provoz na lince už nedostalo a tak se server tvářil, že neodpovídá. Packet loss v této době byl 95 %, tedy 19 paketů z 20 se nedostalo do cíle.

Podobné útoky jsou bohužel každodenní realitou internetu a neexistuje proti nim efektivnější obrana než linka a síťové prvky, které ten provoz zvládnou.

Cílem útoku jsme s jistotou nebyli my, protože by nám útočník pravděpodobně šel po homepage, která je oddělená od ostatních aplikací. Cílem je jeden z našich klientů a bohužel nemáme jak zjistit, který to je. Všechny aplikace z nového Roští jsou schovány za IP adresu určenou pro load balancery, takže pokud někdo má útočit na našeho klienta, půjde po této adrese, což se stalo.

Naším současným opatřením je vypnutí provozu ze zahraničí. Klienti, o kterých víme, že jsou na tomto provozu závislí, tak je přesměrováváme na jiný load balancer, který není pod útokem. Nemůžeme ale takto přesunout všechny, protože nevíme, na který konkrétní web je veden útok.

Naštěstí ale víme, je infrastruktura Master DC si s něčím takovým umí poradit, takže jediným problém je, dostat tento provoz od serverů pryč. Rozhodli jsme se tedy load balancer umístit do Master Cloudu, kde je k dispozici služba Radware DefensePro. Všechen provoz tedy půjde sem a odsud bude přesměrován na server, kde běží konkrétní aplikace. Řešení je tedy stejné, jen load balancer se přesune z našich serverů do cloudu.

Radware DefensePro funguje na základě statistiky. Dokáže si zmapovat běžný provoz a všechno ostatní odfiltruje. Nemáme s tímto řešením žádné zkušenosti, ale věříme, že v Master DC vědí, proč ho mají. Teď jen doufáme, že útok opadne na dostatečně dlouhou dobu, aby se Radware DefensePro naučilo, jak naši uživatelé komunikují. Tahle změna bude vyžadovat úpravu DNS záznamů. Uživatelé, kteří mají DNS u nás, se nemusí o nic starat. Ostatním pošleme email s informacemi. Ke změně dojde během neděle, takže příští týden už pojedeme zase bez zádrhelů.

PHP 7.0 je tu a k němu nový server

Dlouho jsme na blog nic nepsali, ale teď se nám podařilo dokončit něco, co stojí za zmínku. Nasadili jsme stabilní PHP 7.0, které už se nemusíte bát používat produkčně. Kromě toho máme nový server a také jste si mohli všimnout změn při placení. Ale teď postupně.

Mezi obrazy máme PHP 7.0 už nějaký čas, ale uživatelům jsme ho nedoporučovali. Čekali jsme na podporu ze strany komunitního repositáře Dotdeb, který nám PHP 7.0 naservíroval do Debianu a my se mohli soustředit „jen“ na integraci do našeho prostředí. Dělali jsme dříve nějaké pokusy s vlastními buildy PHP, ale Dotdeb má celý proces odladěný a není důvod této práce nevyužít.

S PHP 7.0 jsme se rozhodli změnit jednu věc – už nepoužíváme Apache, ale Nginx + PHP-FPM. Proti Apachi nic nemáme, ale mod_php pouvažujeme za špatný koncept. Jedinou velkou překážkou by mohla být podpora pro .htaccess, která je bez Apache samozřejmě pryč. Nicméně u nás máte plnou kontrolu nad web serverem a jeho konfigurací, takže pokud .htaccess opravdu potřebujete, tak použijte nástroj na převedení .htaccess do konfigurace Nginxu na winginx.com a váš kód bude opět fungovat a navíc rychleji. Je to dáno tím Apache se zapnutou podporou .htaccess s každým requestem testuje přítomnost .htaccess v aktuálním adresáři i nadřazených adresářích a pokud na nějaký narazí, tak ho zpracuje. Tato operace se nedá cachovat, protože by pak Apache nereagoval na změny v těchto souborech.

Během ledna jsme pořídili nový server, nainstalovali a umístili do racku. Pár týdnů se zdánlivě nic nedělo, ale to není tak úplně přesné, protože jsme do administrace dodělávali podporu pro více serverů. Ta tam byla již od začátku, ale až s novým serverem jsme tuto funkci začali testovat a nakonec dostali až do produkce. Nová administrace má teď k dispozici tři web servery a na nich spoustu místa pro nové aplikace. Aplikace založené v posledních 14 dnech tedy už běží na novém, rychlejším hardwaru.

Abych nezapomněl, už u nás můžete platit kartou. Od začátku jsme pracovali na vlastním fakturačním systému, který jsme měli ještě před založením Roští a bylo nám líto ho nevyužít. A tak jsme se v lednu s Martinem bavili o Fakturoidu, že by mohl mít pro Roští docela pozitivní přínos a také bychom se zbavili jednoho systému, o který se musíme starat.

Netrvalo to moc dlouho a pustili jsme se do implementace. Úpravy kódu zabraly jen pár hodin, za to migrace dat a ladění celého platebního workflow nás stálo 4 dny. Ale vyplatilo se. Máme platbu kartou, nemusíme se starat o fakturaci, účetní si exportuje data, která potřebuje a účetně jsme otevřeli Roští platbám z celého světa a hlavně z docela komplikované Evropy.

Koncem roku jsme se také stali plátci DPH. Bohužel jsme kvůli tomu museli mírně zvednout ceny. Na druhou stranu nám to pootevřelo dveře k větším klientům.

A co budeme dělat dál? Určitě domény. Už máme hotový kód, který z domén dělá záznam v databázi, což je klíčové pro mnoho věcí. Částečně jsme implementovali podporu pro SSL certifikáty k těmto doménám a se slinou v koutku už koukáme na Let’s encrypt, které nám ale spoustu věcí úplně neulehčuje, třeba limitem kolik certifikátů můžeme stáhnout za hodinu a za den. Kromě certifikátů se nám konečně otevře cesta k registraci domén. Nechci slibovat nějaké termíny, ale doufám, že příště vám už budu psát o tom, jak implementujeme API nějakého registrátora.

Druhá věc, kterou máme v plánu, je naše API. K němu máme napsáno jen velmi málo. Máme dokumentaci, kterou zatím upravujeme a diskutujeme nad tím, co má být vlastně cílem, k čemu ho budeme používat my a k čemu naši uživatelé, ale už nejsme daleko od skutečné implementace. Opět nebudu slibovat termíny, ale slíbím vám API, přes které budete moct přidávat, upravovat, mazat a monitorovat aplikace. Stejně jako domény, tak API vyžaduje nějaký refactoring v naší administraci. Část logiky dnes máme na místech, kde ji úplně nechceme a než se pustíme do API, musí být tato část vyřešena.

A to je zatím vše. Pracujeme na Roští každý den a jsme rádi, že se vám líbí. Víme to, protože za poslední tři měsíce jsme vyrostli dvakrát. Děkujeme, že jste s námi a že díky vám můžeme posunovat hosting v České Republice za hranice FTP a PHP.

Velká várka oprav

Máme za sebou více jak dva měsíce provozu nové administrace a tak jsme se pustili do nějakého opravování. Něco už je nasazené, něco bude. Ale začneme od začátku.

Minulý týden jsme se byli podívat na LinuxDays a říct vám něco o Dockeru na webhostingu. Rozhodli jsme se to pojmout propagačně a zaměřit se na pokročilejší uživatele, kteří už o Dockeru něco vědí. Přednášel jsem já a moji nervozitu prosím přehlédněte 🙂

A teď už k opravám. Možná jste postřehli, že příkaz „enable-redis„, který vám nakonfiguruje v kontejneru Redis databázi, nefungoval. Používal konfiguraci s chybami a navíc pro jinou verzi Redisu. Naše chyba, málo jsme tuhle vlastnost otestovali, teď už to je opravené.

Měli jsme problém s tím, že se nám na serverech začali množit kontejnery, ke kterým nepatřila žádná appka. Ukázalo se, že někdy v minulosti došlo k výpadku RQ workera pro jednu z našich front, což vedlo k tomu, že se nějaký čas tato chyba projevovala. Důsledky jsme identifikovali a odstranili až nyní. Píši to jen pro zajímavost, protože uživatele to nějak neovlivnilo.

Další problém byl způsobem chováním Dockeru, které popisuji i v přednášce nahoře – mění se chování Docker API. I když používáme stále verzi API 1.18, tak s aktualizací na Docker 1.8.2 došlo k odstranění cpuShare parametru z volání API, které vytváří kontejner. Změnu chápu, ale že se to promítlo i do starších verzí API, to už méně. Výsledek byl nefunkční přepínač „High CPU“ v administraci. Naštěstí byla oprava jednoduchá a nasadili jsme ji rychle.

Další chyba byla logická a týkala se hlášky o tom, že je kontejner v chybovém stavu. Ta se má zobrazit 60 sekund poté, co nebyl kontejner vytvořen, i když o to uživatel skrze administraci požádal. Při rozhodování jestli hlášku zobrazit nebo ne, jsme používali datum vytvoření kontejneru a aktuální čas, takže při změně parametrů se objevila hned, jak se spustil task s vytvořením na pozadí.

Na přání jednoho z uživatelů jsme upravili PHP kontejner tak, aby obsahoval modul pro MongoDB. Z PHP je tedy nyní možné přistupovat do Monga.

PHP image jsme také trochu překopali. Nyní už podporujeme jen verze 5.6 a nově 7.0. Starší aplikace mohou zůstat na současných imagích. Nové už musí použít tyto. Pokud budete chtít starší verzi i k nové aplikaci, napište nám prosím na podporu. V současné době je využití starších verzí opravdu minimální. PHP 7.0 ještě nepoužívejte v produkci, máme ji jen pro otestování. Chybí ji většina modulů, například GD.

Dále jsme na homepage upravili stránku s ceníkem tak, aby vás méně mátla. Ujasnili jsme cenu za zálohování a za certifikáty.

Na starém Roští se objevil problém s placením přes GoPay. Došlo k nějakým úpravám API na straně GoPay, o kterých nám zapomněli říct 🙁 Podpora pro GoPay v novém Roští je na cestě, ale ještě pořád máme před sebou nějaké důležitější tasky. Snad se tedy dočkáte v listopadu.

U PHP kontejnerů se při přesměrování objevil problém, kdy Apache přidával port 8000 do URL adresy a stránka pak nefungovala. Trápilo nás to dlouho, ale konečně jsme to vyřešili. Už se tedy tohoto bugu nemusíte bát.

A to je všechno. Většina oprav už je nasazena, další se objeví během zítřka. Děkujeme za podporu a budeme se těšit u dalšího reportu.

Každý commit se počítá

Možná víte, že většina nových funkcí na Roští vzniká během pravidelných hackathonů, které se konají jednou za měsíc. Zbytek měsíce službu udržujeme, opravujeme chyby a sbíráme podněty na další hackathon. Poslední víkend jeden hackathon proběhl, nazvali jsme ho HackX+1 a tady je malý souhrn.

Nejdříve název. Je to první hackathon, při jehož přípravě jsme použili milestony z GitLabu a protože netušíme, kolikátý hackathon už to je, použili jsme X + 1. Až zjistíme hodnotu X, samozřejmě nahradíme 🙂 Milestone jsme připravovali 14 dní a nakonec vybrali 18 issues, které musely být opraveny, aby se vám administrace dobře používala.

Ohromně nám pomohla vaše odezva za posledních 14 dní. Chat, který máme na webu od Smartsupp využíváte hojně a dáváte nám vědět o všem, děkujeme za to. Navíc když dojde k nějaké chybě a my o ní dostaneme hlášení, hned to s vámi přes něj řešíme a vysvětlujeme vám situaci. Chat vnímáme jako velký boost naší podpory a víme, že vy taky.

Mazání PostgreSQL databází

A teď k novinkám. První týden od nasazení jsme hodně bojovali s PostgreSQL databází, konkrétně s mazáním databází. Pokaždé, kdy jsme si mysleli, že je problém odstraněný se objevil někde znovu. Během hackathonu jsme kód znovu prošli a našli poslední místo, kde se tato chyba ještě schovávala. Teď už je to v pořádku.

Máme i Redis a Cron

Potřebovali jsme vám dát už v administraci někde vědět, že můžete použít Redis, Memcached, Cron a supervisor. V tom nám pomohla záložka Servicy a malé info u databáze.

admin1

 

admin1

Oddělení vypnutých aplikací

Jeden z našich uživatelů nás upozornil, že by bylo dobré oddělit aplikace, které neběží od těch, které běží. Už na starém Roští jste po nás chtěli možnost aplikaci vypnout, což jsme v nové implementovali a teď už to je i vidět 🙂 Na screenshotu si všimněte také flagu „Zastaralý obraz„, který se bude zobrazovat, pokud bude existovat nová verze obrazu pro technologii, kterou aplikace používá. Nový obraz většinou obsahuje opravy chyb a novou verzi technologie v minoritní částí označení. Třeba aktualizace PHP 5.6.7 na 5.6.11.

stoppedapps

Překlad údajů v History tabu

Toto máme zatím upraveno napůl. Byly tu chyby, které dělaly History tab úplně nepoužitelný. Teď už je na jeho výstup spolehnutí, ale utekly nám překlady akcí, které se provádějí. Abyste pochopili, že to není úplně triviální problém, vysvětlím, jak to funguje. Když dojde k nějaké akci jako je vytvoření aplikace nebo restart aplikace, přesune se tato úloha do pozadí. To děláme pomoci python-rq. Ten funguje tak, že mu nahrajeme do Redisu co se má dělat a on si to v úplně jiném procesu začne zpracovávat nezávisle na tom, co děláte na webu. Nemusíte díky tomu čekat několik sekund, než se vám načte administrace, ale tento proces na pozadí nemá vůbec představu pro „koho pracuje“, nemá k dispozici původní request a nastavení jazyka. Výchozím jazykem je angličtina a tak jsou tyto hlášky anglicky. Pokusíme se to dořešit v jednom z dalších hackathonů.

admin1

Vychozí DNS záznamy se vytvářeli na pozadí

Při přidání nové domény docházelo k malému nedorozumění. Hned po přidání vás administrace hodila na seznam DNS záznamů, který byl .. prázdný. Vytváření výchozích záznamů jsme přesunuli na pozadí, takže k němu docházelo až několik sekund po přidání domény. Takže jste nám začali přidávat záznamy vlastní, ale než jste uložili první, už tam byly ty výchozí. Chyba je tedy odstraněna a myslím, že bude lepší, když na ní všichni zapomeneme 🙂

Dokumentace

Minulý týden jsme psali dokumentaci a během hackathonu v tom pokračovali. Dokončili jsme stránky o:

  • Emailech
  • Ruby
  • Supervisoru
  • Memcached
  • Redisu
  • a rozebrali jsme základní pojmy

Na výsledek se můžete podívat zde na https://docs.rosti.cz/.

Změna hesla

Během posledního roku, kdy vyvíjíme novou administraci, jsme si nevšimli, že jsme neimplementovali formulář na změnu hesla. Děkujeme trpělivému uživateli, který nás na to upozornil.

admin1

Narazili jsme během implementace na to, že pokud přijdete přes Twitter, nemáme váš e-mail, takže není možné se do administrace přihlásit i když máte heslo. Administrace vás tedy upozorní, že je e-mail potřeba nastavit. Pomůže nám to i při řešení problémů, které se mohou objevit.

Nové kontejnery

Aktualizovali jsme všechny kontejnery. PHP můžete používat ve verzích 5.4.43, 5.5.27, 5.6.11, Node.js 0.10.40, 0.12.7, Ruby 1.9.3, 2.2.2 a Python 2.7.10, 3.4.3 a teď nově 3.5.0b3. Chtěli bychom přinášet buildy zatím beta větví jednotlivých technologií, ale musíme k tomu připravit nějakou automatizaci. I když vytvořit image s novou verzí je jednoduché, trvá to skoro hodinu ho dostat do produkce.

Malou novinkou pro všechny PHP aplikace je ještě možnost editovat nastavení Apache. Užívejte s rozvahou 🙂

Ukazatel využití RAMky a diskového prostoru

Na Roští účtujeme aplikace na základě využité paměti RAM a diskového prostoru, nicméně jsme vám neukázali, kolik toho vlastně aplikace bere. Osobně mám z této novinky největší radost a to nejen proto, že jsem ji implementoval sám 🙂 Je to prostě super mít nějaká metadata. Na pozadí navíc sbíráme historii za posledních 24h, takže vám během dalšího hackathonu dáme snad i nějaký graf.

admin1

Pokud žádná data nevidíte, běžte do karty Parametry a klikněte na uložit. U aplikací vytvořených před víkendem se musí zrebuildnout kontejner, což se dělá právě takto. Rebuild provedeme za vás, ale pravděpodobně až o víkendu. Data se zobrazí během 10 minut.

A to je zatím vše

Na závěr bychom se vám chtěli omluvit, protože jedna ze změn, konkrétně graf využití paměti, si vyžádala restart serveru. Byly tu i další důvody, třeba přechod na poslední verzi Docker API, ale to jsme mohli pozdržet, nebylo to blokující. Každopádně jsme se dohodli, že napíšeme na Twitter, že dojde k výpadku, ale už jsme se nedohodli na tom, kdo to udělá. V noci z neděle na pondělí, kolem 1:00 došlo k půlhodinovému výpadku, který jsme, ač neúmyslně, nehlásili.

Výpadky hlásíme do speciálního Twitter účtu https://twitter.com/rosti_cz_status, tak pokud máte na Roští důležité aplikace a chcete být informovaní, mrkněte občas tam.

Děkujeme za přízeň a zůstaňte s námi. Čeká nás totiž ještě spousta nových a skvělých věcí. Mám nakousnout? Tak jo, ale jen trochu. Prioritou pro příště je pro nás předělat správu domén u aplikací, což povede k tomu, že si budete moci sami bez naší pomoci přidat k doméně SSL certifikát, také možnost doménu registrovat u nás a nebo koupit SSL certifikát u nás na jeden klik. Kromě toho se budeme soustředit také na platby přes GoPay.

GoPay je taková věc, které se k nám nechce. Martin ho už měl skoro hotový, ale pořád se mu nelíbily některé detaily. Místo toho, aby kód odeslal do GITu třeba i nedokončený, spoléhal se na svůj domácí stroj, kterému pak ze dne na den odešel SSD disk. A jaké z toho plyne ponaučení? Každý commit se počítá!

A to už je opravdu všechno, dobrou noc! 🙂

admin1

 

Pouštíme nové Roští

Nové Roští (http://nove.rosti.cz/) se klube už nějakou dobu. Poslední týdny jsme ho chtěli už několikrát prohlásit za stabilní, ale pořád se objevovaly problémy, které nám stály v cestě.

Kdo nás trochu sleduje tak ví, že je nové Roští postavené kolem Dockeru. Začínali jsme s verzí 0.9, které nás v prvních týdnech držela trochu pod krkem, protože jsme každých několik dní museli restartovat kontejnery a někdy dokonce celý docker server. Vydáním verze 1.2 tento problém odpadl a aktuální verze 1.6 můžeme v klidu prohlásit za rock stable a jedeme na ní bez jediného zádrhelu.

Nicméně nám ve spuštění doposud bránila nekompletní administrace. Když jsme se posunuli dál, narazili jsme nakonec na něco, kvůli čemu jsme museli spuštění odložit. Kromě toho se sami sobě ještě vymlouváme na stěhování serverů a nebo třeba na hokej 🙂

A teď konečně to na co my, a doufáme že i vy, čekáte. V sobotu 23. května 2015 budeme vykopávat novou administraci do světa. Bude označena sice jako beta, ale jediným důvodem je, že nemá kompletní rozhraní pro e-maily. Druhým nepříjemným detailem je synchronní komunikace s kontejnery. Dost pravděpodobně se tam najdou i nějaké WTF bugy, ale myslíme, že už se nám je podařilo většinou odstranit. Přeci jen novou administraci už nějaký čas sami aktivně používáme. Až se nám podaří odstranit zmíněné problémy a nová administrace nahradí funkčně starou, spustíme ji na doméně admin.rosti.cz a teprve pak prohlásíme za stable.

P.S.: Zatím stále za aplikace v nové administraci nestrháváme kredity. Strhávat začneme od soboty a ten, kdo se zapojil či zapojí do testování, dostane od nás nějaké bonusové kredity navíc.