Patys ribojome savo paslaugas
Mythex API leidžia 300 užklausų per minutę iš vieno tinklo adreso. Ta riba skirta apsaugoti nuo vieno asmens ar scenarijaus, kuris bombarduoja API. Gamyboje ji ėmė atmesti mūsų pačių paslaugas — mūsų edge dalį, kuri teikia publikuotas programėles, ir paslaugą, kuri vykdo DI agentą — nes kiekviena jų kreipiasi į API tik iš kelių adresų. Užklausos, kurios neša mūsų vidinį prisijungimo raktą, dabar neribojamos, o visi kiti apribojami kaip ir anksčiau.
Simptomas
API pradėjo kai kuriems mūsų pačių vidiniams kvietimams atsakyti 429 Too Many Requests. Paveikti buvo trys kvietimų tipai, ir kiekvienas jų svarbus tam, kas naudojasi Mythex:
- Paieška, kuri programėlė yra prie tinkintos domeno. Kai lankytojas atidaro publikuotą programėlę savo domene, mūsų edge klausia API, kur ta svetainė. 429 čia reiškia lankytoją, kuris negali pasiekti svetainės.
- Veikiančio agento etapo išsaugojimas. Kol agentas dirba, jo eiga saugoma tuo metu, kad atsakymas išliktų atnaujinus puslapį ar nutrūkus ryšiui. 429 čia reiškia eigą, kuri neišsaugota.
- Peržiūros prieigos tikrinimas. Redaguojamos programėlės peržiūra yra užrakinta, o užraktas klausia API. 429 čia reiškia peržiūrą, kuri neatsidaro.
Nė vienas iš šių atvejų nebuvo žmonės, kurie kreipėsi į API. Visi jie buvo mes patys.
Kodėl taip nutiko
Riba pagal adresą daro vieną prielaidą: vienas adresas maždaug yra vienas kreipiantis. Žmonėms tai beveik tiesa. Mūsų pačių infrastruktūrai tai labai neteisinga.
- Edge paslauga, kuri teikia publikuotas programėles ir peržiūras, į API kreipiasi iš kelių bendrinamų išeinančių adresų. Kiekvienas publikuotos programėlės lankytojas ir kiekvienas peržiūros patikrinimas atrodo kaip atėjęs iš vieno iš tų kelių.
- Orkestratorius — paslauga, kuri vykdo agento etapus — į API kreipiasi iš vieno konteinerio adreso. Kiekvienas vykstantis etapas, visiems vartotojams, dalijasi juo.
Taigi biudžetas, skirtas vienam asmeniui, buvo dalijamas tarp viso paslaugos srauto. Tos paslaugos jį tarpusavyje išeikvojo, o riboklis padarė tai, ko jam buvo liepta: jas atmetė.
Sprendimas
Mūsų pačių paslaugos jau įrodo, kas jos yra. Kiekvienas vidinis kvietimas neša vidinį žetoną, o kiekvienas maršrutas po API vidine dalimi patikrina tą žetoną prieš atlikdamas bet ką.
Riboklis dabar naudoja tą patį patikrinimą. Užklausa, kurios žetonas sutampa su vidiniu, patenka į leidžiamųjų sąrašą ir nebeskaičiuojama pagal adresui skirtą biudžetą. Viskas kita skaičiuojama kaip anksčiau: 300 užklausų per minutę vienam adresui.
Dvi detalės neleido tam virsti skyle:
- Neteisingas žetonas pravažiuoti negali. Leidžiamųjų sąrašas atitinka tik tikrą vidinį žetoną. Užklausa su išgalvotu žetonu skaičiuojama ir ribojama kaip bet kuri kita, o vidiniai maršrutai ją vis tiek atmeta su
401 Unauthorized. - Pati riba nepasikeitė. Skaičiaus nekėlėme, kad sukurtume vietos. Jį pakėlus problema būtų paslėpta tol, kol srautas vėl išaugtų, ir būtų susilpninta apsauga tam atvejui, kuriam riba ir skirta.
Ribos nustatymus perkėlėme į vieną nedidelę funkciją ir parašėme testus. Vienas siunčia 20 užklausų su vidiniu žetonu riboklį, nustatytą leisti 5, ir tikisi, kad visos 20 pavyks. Kitas siunčia paprastas užklausas iš vieno adreso ir tikisi, kad pirmosios penkios pavyks, o vėlesnės bus atmestos. Trečias siunčia užklausas su suklastotu žetonu ir tikisi, kad jos bus atmestos tokiu pat būdu.
Ką iš to pasiėmėme
- Ribos turi prielaidų. „Vienas adresas, vienas kreipiantis“ įrašyta į ribą pagal adresą. Ji nebegalioja, kai jūsų pačių paslaugos stovi už bendrinamų adresų — o daugelis taip ir stovi: apkrovos balansuotojai, edge tinklai, konteineriai, biurų tinklai.
- Savo srautą atskirkite pagal tapatybę, o ne pagal adresą. Adresai nusako, kaip srautas atkeliauja, o ne kas jį siuntė. Mes jau turėjome raktą, kuris įrodo, kad kvietimas yra mūsų; riboklis tiesiog į jį nežiūrėjo.
- Nesprendžiame skaičiaus didinimu. Didesnė riba būtų panaikinusi 429 klaidas kuriam laikui, apsaugojusi mažiau ir vėliau vėl sugedusi.
- Žiūrėkite, kas gauna ribojimą. 429, kuris patenka į jūsų pačių paslaugą, yra pranešimas apie jūsų ribų klaidą, o ne ženklas, kad riboklis veikia.
Ką tai reiškia, jei kuriate su Mythex
Jums nieko keisti nereikia. Publikuotos programėlės tinkintuose domenuose, DI agento etapai ir peržiūros nebepriklauso nuo to, kiek apkrautas likęs Mythex. Jūsų programėlės paties srautas yra jūsų reikalas: čia aprašyta riba taikoma mūsų API, o ne publikuojamoms jūsų programėlėms.
Jei turite savo backend, ta pati spąstai taikosi bet kuriai ribai, kurią pridedate. Pradėti galite nuo mūsų gidų apie tai, kas yra API ir AI sukurtų programėlių saugumo kontrolinio sąrašo. O dar vieną mūsų infrastruktūros atvejį, kai ji pati trukdė sau, rasite kaip pasiekėme, kad diegimai neturėtų 502 klaidų.