Omezovali jsme vlastní služby
API Mythexu povoluje 300 požadavků za minutu z jedné síťové adresy. Ten limit slouží k ochraně před jedním člověkem nebo skriptem, který API zahlcuje. V produkci začal odmítat naše vlastní služby – část našeho edge, která servíruje publikované aplikace, a službu, která spouští agenta AI – protože každá z nich volá API jen z pár adres. Požadavky nesoucí náš interní přihlašovací token jsou nyní vyjmuty, a všichni ostatní jsou omezeni přesně jako dřív.
Příznak
API začalo některá volání našich vlastních služeb odpovídat 429 Too Many Requests. Zasáhly tři typy volání a každý z nich je důležitý pro někoho, kdo Mythex používá:
- Zjišťování, která aplikace žije na vlastní doméně. Když návštěvník otevře publikovanou aplikaci na její vlastní doméně, náš edge se zeptá API, kde je tento web. 429 tam znamená návštěvníka, který se na web nedostane.
- Ukládání běžícího tahu agenta. Zatímco agent pracuje, jeho postup se průběžně ukládá, aby odpověď přežila obnovení stránky nebo přerušené spojení. 429 tam znamená postup, který se neuložil.
- Kontrola přístupu k náhledu. Náhled aplikace, kterou stavíte, je chráněný a brána se ptá API. 429 tam znamená náhled, který se neotevře.
Žádné z těchto volání nedělali lidé. Všechna dělali my.
Proč se to stalo
Limit požadavků na adresu dělá jeden předpoklad: jedna adresa je zhruba jeden volající. Pro lidi je to dost přesné. Pro naši vlastní infrastrukturu je to velmi špatně.
- Služba edge, která servíruje publikované aplikace a náhledy, volá API z několika sdílených odchozích adres. Každý návštěvník každé publikované aplikace a každá kontrola náhledu přichází, jako by pocházela z jedné z těch několika.
- Orchestrátor – služba, která spouští tahy agenta – volá API z jedné adresy kontejneru. Každý běžící tah, pro každého uživatele, sdílí tuto adresu.
Rozpočet určený pro jednoho člověka se tedy dělil mezi všechen provoz celé služby. Ty služby ho mezi sebou spotřebovaly a limiter udělal, co měl: odmítl je.
Oprava
Naše vlastní služby už dokazují, kdo jsou. Každé interní volání nese interní token a každá trasa v interní části API ho zkontroluje, než cokoli udělá.
Limiter teď používá stejnou kontrolu. Požadavek, jehož token odpovídá internímu, je na allow listu a nepočítá se do rozpočtu na adresu. Vše ostatní se počítá přesně jako předtím: 300 požadavků za minutu na adresu.
Dva detaily zabránily tomu, aby z toho vznikla díra:
- Špatný token nedostane výjimku. Allow list odpovídá jen skutečnému internímu tokenu. Požadavek s vymyšleným tokenem se počítá a omezuje jako kterýkoli jiný a interní trasy ho stále odmítají s
401 Unauthorized. - Samotný limit se nezměnil. Číslo jsme nezvedli, abychom udělali místo. Zvýšení by problém skrylo jen na chvíli, nanovo by se objevil s růstem provozu a oslabilo by ochranu pro případ, pro který limit existuje.
Nastavení limiteru jsme přesunuli do jedné malé funkce a napsali na ni testy. Jeden pošle 20 požadavků s interním tokenem na limiter nastavený na 5 a očekává, že všech 20 uspěje. Další pošle obyčejné požadavky z jedné adresy a očekává, že prvních pět uspěje a ostatní budou odmítnuty. Třetí pošle požadavky s padělaným tokenem a očekává, že budou odmítnuty stejně.
Co jsme si z toho odnesli
- Limity nesou předpoklady. „Jedna adresa, jeden volající“ je zabudováno do limitu na adresu. Přestane platit, jakmile vaše vlastní služby sedí za sdílenými adresami – a mnohé sedí: load balancery, edge sítě, kontejnery, kancelářské sítě.
- Rozlišujte vlastní provoz podle identity, ne podle adresy. Adresy říkají, jak provoz přichází, ne kdo ho poslal. Už jsme měli přihlašovací údaj, který dokazuje, že volání je naše; limiter se na něj jen nedíval.
- Neopravujte to zvýšením čísla. Vyšší limit by 429 na chvíli schoval, chránil by méně a později by selhal znovu.
- Sledujte, koho omezujete. 429, které dopadne na vlastní službu, je hlášení chyby o vašich limitech, ne známka, že limiter funguje.
Co to znamená, pokud stavíte na Mythexu
Na vaší straně nic měnit nemusíte. Publikované aplikace na vlastních doménách, tahy agenta a náhledy už nezávisí na tom, jak vytížený je zbytek Mythexu. Provoz vaší aplikace je věc vaší aplikace: limit popsaný tady platí pro naše API, ne pro aplikace, které publikujete.
Pokud provozujete vlastní backend, stejná past platí pro každý rate limit, který přidáte. Dobrým místem pro začátek jsou naše průvodce co je API a kontrolní seznam zabezpečení pro aplikace postavené s AI. Další případ, kdy naše vlastní infrastruktura překážela sama sobě, najdete v článku jak jsme dosáhli nula chyb 502 při nasazení.