„Пусни го в пясъчник“ звучи като една инструкция. На практика хората имат предвид четири често срещани граници и те спират много различни неща. Изборът на грешната или ви оставя уязвими, или прави всяко изпълнение по-бавно и по-скъпо, отколкото е нужно.
Това сравнение приема, че кодът е наистина недоверен: написан от езиков модел, подаден от потребител или пристигнал в pull request от някой, когото не познавате. Кодът, който сте написали сами, има други нужди.
Какво може да се обърка
Преди да сравним границите, полезно е да назовем за какво служат. Недовереният код може да:
- Прочете каквото не бива: променливи на средата, SSH ключове, файлове в домашната ви директория, крайни точки за метаданни на облака.
- Изчерпи ресурсите: да влезе в безкраен цикъл, да прави fork, докато машината заседне, да напълни диска.
- Злоупотреби с мрежата: да сканира други хостове, да праща спам, да копае криптовалута, да вика вътрешните ви услуги.
- Остане трайно: да инсталира cron задача или услуга, която надживява задачата.
- Избяга: да използва бъг в слоя отдолу, за да изпълни код на самия хост.
Всяко ниво по-долу се справя с някои от тези неща и не с други.
Ниво 1: процес
Най-простият пясъчник е дъщерен процес: subprocess.run с таймаут, може би под отделен потребител, с лимити на ресурсите и филтър seccomp, ако сте щателни.
Спира: неконтролираното време (таймаутът), част от изчерпването на ресурсите (лимитите), някои опасни системни извиквания (seccomp). Не спира: четенето на всичко, което този потребител може да чете, мрежовия достъп, трайното оставане чрез всичко, в което потребителят може да пише, и всеки бъг в ядрото. Типичен провал: кодът чете файл, за който сте забравили, че е четим, или „ограничен“ интерпретатор на език се оказва с вратичка. Историята е пълна с пясъчници вътре в езика, които не са издържали.
Времето за старт е на практика нула. Добре е за код, който сте написали вие; не е граница за код, който не сте.
Ниво 2: контейнер
Namespaces дават на кода собствен изглед към файловете, процесите и мрежата; cgroups ограничават CPU и паметта; премахнатите capabilities и seccomp стесняват това, което може да поиска от ядрото.
Спира: четенето на файловете на хоста (освен ако не са монтирани), виждането на други процеси, неограниченото използване на ресурси, голяма част от проблема с трайното оставане, ако контейнерът се изхвърля след това. Не спира: бъг в споделеното ядро на хоста. Всички контейнери на машината говорят с едно и също ядро, така че достъпна уязвимост в ядрото е изход. Типичен провал: конфигурацията, а не екзотични експлойти. Привилегирован контейнер, сокетът на container runtime, монтиран вътре, мрежата на хоста, включена „само за дебъгване“. Всяко от тях тихо премахва границата.
Времето за старт е милисекунди. Съществуват подсилени варианти, включително ядра в user space, които прихващат системните извиквания, преди да стигнат до хоста, на известна цена в скорост и съвместимост. За код от хора, на които вярвате, добре конфигурираният контейнер е разумен избор по подразбиране.
Ниво 3: microVM
MicroVM работи със собствено ядро под хипервайзор, като пълна VM, но с почти целия емулиран хардуер премахнат. Firecracker е най-известният пример.
Спира: всичко, което спира контейнерът, плюс проблема със споделеното ядро. За да стигне до хоста, кодът трябва да пробие хипервайзора или едно от шепа виртуални устройства — много по-малка повърхност от интерфейса на системните извиквания на ядро. Не спира: злоупотребата с това, което ѝ давате. Отвореният изходящ трафик пак може да бъде злоупотребен; тайните, които вкарате, пак могат да изтекат. Типичен провал: политиката, а не изолацията. Някой подава продукционен токен, „за да минат тестовете“, или оставя изходящия трафик неограничен за натоварване, което няма нужда от него.
Времето за старт е от част от секундата до около секунда, с няколко мегабайта допълнителна памет. Това е достатъчно бързо, за да създавате по една за всяка задача и да я изтривате след това, което решава и трайното оставане: няма към какво да се върне.
Ниво 4: пълна виртуална машина
Обикновената VM, или VPS, има същия вид граница като microVM: хардуерна виртуализация и хипервайзор. Разликата е във всичко около нея: пълен модел на устройствата, цяла ОС, публичен IP, ако искате, и жизнен цикъл, измерван в дни или месеци.
Спира: същите класове проблеми като microVM, с малко по-голяма повърхност за атака, защото се емулира повече хардуер. Не спира: злоупотребата със собствената ѝ мрежова идентичност. VM с публичен IP, която изпълнява злонамерен код, вкарва в блоклист своя IP, което има значение, ако същият IP праща и пощата ви. (Ако това вече се е случило, вижте какво да правите, когато IP адресът ви е в блоклист.) Типичен провал: живее твърде дълго. VM, създадена за един експеримент, събира идентификационни данни и състояние и бавно се превръща в доверената машина, която трябваше да пази.
Времето за старт е от десетки секунди до минути, а таксуването обикновено е месечно. Това е правилната форма за дълго работеща услуга, която се нуждае от входящи портове, и грешната форма за изпълнение на код за 20 секунди.
Сравнението
| Процес | Контейнер | MicroVM | Пълна VM | |
|---|---|---|---|---|
| Собствено ядро | не | не | да | да |
| Основна граница | права на потребителя | namespaces + споделено ядро | хипервайзор, миниатюрен модел на устройствата | хипервайзор, пълен модел на устройствата |
| Време за старт | ~0 | ms | ~0.1–1 с | 10 с – минути |
| Допълнителна памет | няма | малка | няколко MiB | десетки–стотици MiB |
| Изхвърляне след всяка задача | лесно | лесно | лесно | бавно, скъпо |
| Входящи портове / публичен IP | на хоста | на хоста | обикновено няма | да |
Изборът
- Код, написан от вас или екипа ви: процес или контейнер е достатъчен.
- CI за собствените ви клонове: контейнер на вашия runner.
- Код от агент, подавания от потребители, външни pull requests: microVM за всяка задача, изтривана след това.
- Недоверена услуга, която трябва да приема връзки или да работи седмици: отделна VM със собствен IP, далеч от всичко, което държи идентификационните ви данни или праща пощата ви.
Каквото и да изберете, отгоре важат две правила: не слагайте вътре нищо, което не бихте дали на автора на кода, и решете съзнателно какво може да прави мрежата.
Къде са нашите продукти
За ниво 3 предлагаме пясъчници за код: Firecracker microVM, които стартират за около секунда, с изходящ интернет, без входящи портове и с таксуване на секунда. Насочени са точно към третата точка по-горе; страницата за защитите на MCP обяснява как да ограничите какво може да прави агент с тях. За ниво 4 VPS като тарифата AI agent ви дава цяла машина за месец. Разработените примери в пясъчник за AI агенти показват модела с microVM от край до край, а от какво се нуждаят AI агентите от инфраструктурата разглежда изолацията като едно от няколко изисквания.
Коментари
Още няма коментари. Бъди първият.