Безопасный способ запустить чужой код (песочница) на моем сервере?

Я хочу создать веб-сервис, который локально запускает чужой код. Естественно, я хочу ограничить доступ их кода к определенному каталогу песочницы, чтобы они не могли подключаться к другим частям моего сервера (БД, основной веб-сервер и т. Д.)

Как лучше всего это сделать?

Запустите VMware / Virtualbox:

  • + Думаю, это максимально безопасно. Даже если кому-то удастся взломать, они взломают только гостевую машину

  • + Может ограничивать процессор и память, которые используют процессы

  • + Простота настройки - просто создайте виртуальную машину

  • - Сложнее подключить каталог песочницы от хоста к гостю

  • - Трата дополнительной памяти и ЦП для управления виртуальной машиной

Запуск непривилегированного пользователя:

  • + Не тратит лишние ресурсы

  • + Каталог песочницы - это просто простой каталог

  • ? Не можете ограничить ЦП и память?

  • ? Я не знаю, достаточно ли это безопасно

По-другому?

Сервер под управлением Fedora Core 8, остальные коды написаны на Java и C ++.


person amitkaz    schedule 27.04.2009    source источник
comment
Подробнее по теме: security.stackexchange.com/questions/32375/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 06.08.2014
comment
Отвечает ли это на ваш вопрос? Как безопасно запускать отправленные пользователем скрипты в песочнице node.js?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 29.06.2020


Ответы (9)


  1. Работа от имени непривилегированного пользователя по-прежнему позволяет локальному злоумышленнику использовать уязвимости для повышения привилегии.
  2. Разрешение выполнять код в виртуальной машине также может быть небезопасным; злоумышленник может получить доступ к хост-системе, поскольку недавний Отчет об уязвимости VMWare показал.

На мой взгляд, разрешение запускать собственный код в вашей системе в первую очередь не является хорошей идеей с точки зрения безопасности. Возможно, вам стоит пересмотреть решение о том, чтобы разрешить им запускать собственный код, это, безусловно, снизит риск.

person Alex B    schedule 27.04.2009
comment
ну ... конечно, это не лучшая идея с точки зрения безопасности, но мне нужно это сделать, поэтому я должен пойти на компромисс. Я знаю, что не будет 100% безопасности, если я позволю другим людям запускать код (нигде нет 100% безопасности) - Это не сайт банка, где люди имеют огромную мотивацию для взлома .., я просто хочу получить столько же рентабельности, сколько Я могу. - person amitkaz; 27.04.2009
comment
Используйте какую-либо форму песочницы, но рассмотрите возможность запрета запуска собственного кода. Это возможно? - person Alex B; 28.04.2009
comment
Мы могли бы расширить этот аргумент до наличия уязвимостей на веб-серверах, поэтому вам не следует запускать веб-сайт. На самом деле есть уязвимости в веб-браузерах, поэтому вам не следует просматривать Интернет! - person BlueRaja - Danny Pflughoeft; 11.06.2010
comment
@BlueRaja, чтобы не сказать, что вы не можете вообще разрешать пользователям запускать код (например, Google App Engine позволяет запускать байтовый код Java), но собственный код имеет плохую репутацию: не превращение локальных корневых уязвимостей в удаленные корневые уязвимости. - person Alex B; 12.06.2010
comment
Актуальна ли эксплуатация уязвимостей для повышения привилегий в 2014 году? - person Hello World; 19.05.2014
comment
@HelloWorld это 2k15, и это актуально, и если вы не сделаете все привилегии равными, так будет всегда. Да, люди кодируют лучше и безопаснее, но всегда есть вектор атаки, с которым можно справиться. Виртуализация, вероятно, подходит, но в зависимости от вашего варианта использования вы можете выбрать что-то вроде усиленного gentoo (тюрьма LXC, selinux, ...). Такой подход дает вам больше возможностей, но сделать все правильно может быть непросто. Просто убедитесь, что минимизировано воздействие небезопасных вещей (X-сервер, видеодрайверы). Ожидаемое снижение производительности такой установки должно составить около 5%. - person Tomas Pruzina; 28.02.2015

Чтобы ограничить ЦП и память, вы хотите установить ограничения для групп процессов (ограничения ресурсов POSIX применяются только к отдельным процессам). Вы можете сделать это с помощью cgroups.

Например, чтобы ограничить запуск памяти путем монтирования файловой системы cgroups памяти:

# mount cgroup -t cgroup -o memory /cgroups/memory

Затем создайте новый подкаталог для каждой группы, например

# mkdir /cgroups/memory/my-users

Поместите процессы, которые вы хотите ограничить (процесс с PID «1234» здесь), в эту группу:

# cd /cgroups/memory/my-users
# echo 1234 >> tasks

Установите общий лимит памяти для группы:

# echo 1000000 > memory.limit_in_bytes

Если процессы в группе разветвляют дочерние процессы, они также будут в группе.

Вышеупомянутая группа устанавливает предел резидентной памяти (т.е. ограниченные процессы начнут менять местами, а не использовать больше памяти). Другие контрольные группы позволяют ограничивать другие параметры, например время процессора.

Вы можете либо поместить свой серверный процесс в группу (чтобы вся система со всеми ее пользователями подпадала под ограничения), либо заставить сервер помещать каждый новый сеанс в новую группу.

person Thomas Leonard    schedule 10.05.2009

chroot, тюрьма, контейнер, VServer / OpenVZ / и т. д., как правило, более безопасны, чем работает как непривилегированный пользователь, но легче, чем полная виртуализация ОС.

Кроме того, для Java вы можете доверять встроенной песочнице JVM, а для компиляции C ++ - NaCl утверждает, что может изолировать x86-код в песочнице.

Но, как говорится в ответе Чекерс, в прошлом была доказана возможность причинения злонамеренного ущерба практически из любой «песочницы», и я ожидаю, что в будущем будет постоянно обнаруживаться (и, надеюсь, исправляться) все больше дыр. Вы действительно хотите использовать ненадежный код?

person ephemient    schedule 27.04.2009

Прочтение страницы codepad.org/about может дать вам несколько интересных идей.

http://codepad.org/about

person Alix Axel    schedule 28.04.2009

Узнайте у ulimit и у друзей, как ограничить возможность доступа непривилегированных пользователей к DOS на машине.

person Douglas Leeder    schedule 27.04.2009

Попробуйте немного узнать о настройке политик для SELinux. Если вы используете коробку Red Hat, все в порядке, поскольку они упаковывают ее в дистрибутив по умолчанию.

Это будет полезно, если вы знаете, к чему код не должен иметь доступа. Или вы можете сделать наоборот и предоставить доступ только к определенным вещам.

Однако эти правила сложны и могут потребовать больше времени, чем вы можете пожелать.

person supercheetah    schedule 10.05.2009

Используйте Ideone API - самый простой способ.

person kuszi    schedule 11.08.2010
comment
API Ideone ограничивает количество запросов до 1000 в месяц. Это одна из причин, по которой я хочу создать своего собственного онлайн-судью. - person shashankg77; 15.07.2013
comment
@SinnerShanky Если вам нужен сервис онлайн-судьи, то готовых сервисов очень много. Например. DOMjudge - это тот, который вы можете установить на своем собственном сервере. Вы также можете использовать SPOJ, который позволяет устанавливать настраиваемые соревнования (и использует тот же движок, что и ideone). Кстати: Ideone позволяет больше подавать в платном варианте. - person kuszi; 16.07.2013

попробуйте использовать lxc в качестве контейнера для вашего сервера apache

person amin    schedule 15.01.2011

Не знаете, сколько усилий вы хотите вложить в эту вещь, но сможете ли вы запустить Xen, как веб-хосты VPS?

http://www.xen.org/

Это позволит получить полный root-доступ к их небольшому участку сервера без ущерба для других пользователей или базовой системы.

person Travis    schedule 10.05.2009