Sandbox изоляция приложений

Impress изолирует каждое приложение в отдельном V8-контексте через модуль vm. Утечки лечатся пересозданием sandbox без рестарта процесса.

Зачем

В голом Node.js все require'ы попадают в один глобальный неймспейс. Если одно приложение упало или потекло — рушится весь процесс. Сложно хостить несколько приложений в одном Node-сервере безопасно.

Sandbox в Metarhia

  • На каждое приложение — свой V8 context.
  • В sandbox-конфиге явно перечислены доступные модули.
  • Утечка в одном приложении → удаляем sandbox, создаём новый. Соседи не страдают.

sandbox-fs

«Sandbox-fs — это файловая система, обёрнутая так, чтобы из песочницы приложение не могло выйти выше. Не хотелось бы, чтобы одно приложение ходило в папку к другому.»

  • Виртуальная корневая папка для каждого app.
  • Попытка fs.readFile('../other-app/...') упирается в стену.

Sandbox-конфиг

sandbox: {
  modules: ['fs', 'crypto', 'lodash'],   // явный whitelist
  globals: { /* доп. глобалки */ },
}

Если у двух приложений в whitelist одна и та же библиотека — у каждого своя копия в своём sandbox.

Hot reload через sandbox

  • Изменили файл applications/foo/api/get.js.
  • Impress подгружает новый код в sandbox без рестарта.
  • Старые соединения дорабатывают на старом коде, новые — на новом.

Контейнеризация без Docker

автор: Impress сам контейнеризирует. Внутри одного процесса — N приложений. Внутри одного приложения — M процессов. Many-to-many так в Docker не сделать.

Сравнение

Docker Impress sandbox
Гранулярность контейнер = процесс один процесс — N apps
Изоляция OS-level (cgroups, namespaces) V8 vm
Файловая система контейнер sandbox-fs
Перезапуск рестарт контейнера пересоздание sandbox
Накладные расходы высокие минимальные
Безопасность сильная средняя (sandbox JS пробивается)

Sandbox JS — не полная замена Docker. Это эффективная изоляция «дружественных» приложений в одном процессе.

🎓 Источники

См. также