Блог пользователя Kenny_HORROR

Автор Kenny_HORROR, 13 лет назад, По-русски

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

  1. Обеспечение безопасности сервера (не будем забывать, что недобросовестных пользователей это прямо открытая возможно собрать и запустить вирус/эксплоит прямо на сервере).
  2. Обеспечение достаточной производительности, а также введение некоторых ограничений на  исполняемый код (например ограничения на используемую память для процесса и т.п.)
  3. О других возможных проблемах.

Вот такой вопрос.

PS: Было бы очень интересно услышать мнение и советы тех кто делал что-либо подбное/администрации данного ресурса (при условии что это не является комерческой тайной =) ).

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Здесь написано про ограничения по памяти...
13 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Если не секрет - а что за проект? :)

Ответ на ваш вопрос существенно зависит от операционной системы. В Линуксе есть целая куча путей такое сделать (патчи к ядру вроде ejudge'овского, какая-то недавно появившаяся функциональность ядра вроде cgroups, виртуализация на уровне ядра kvm). В freebsd есть что-то подобное линуксовым фичам, например, jail. В windows уже гораздо сложнее - например, на этом сайте такое не очень реализовано (в частности, многие системные вызовы работают, и эксплоиты скорее всего прокатят). Так что если нужна безопасность - разумнее запускать в виртуальной машине.
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Касательно ОС - Linux. Ну а проект, пока что смысла называть нету (в данный момент это пока что это скорее концепт =) ).
    • 13 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Ну так и концепт интересен - для чего может потребоваться исполнять пользовательский код :) В голову приходят только тестирующие системы/обучающие проекты и сервисы "посчитать что-то на кластере".
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Я думаю что 95% "концептов" разрабатываемых завсегдадаями CodeForces являются прототипами систем для проведения контестов или хотя бы решения задач. ;-)
    • 13 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Если линукс то возможно на первое время удобно настроить AppArmor.

      Собственно ограничить-то нужно запись в файлы - для этого просто отдельный пользователь совсем ограниченный или chroot и запретить по сети стучаться - с помощью фаервола или того же AppArmor.

      Потом, когда концепт дойдёт до какой-то актуальной стадии, можно будет о более сложных идеях подумать в зависимости от типа сервера на котором запускаетесь и т.п. %)

      UPD: Виртуальная машина (или просто машина отделённая от сервера и забирающая с него файлы для проверки по особому каналу) вообще говоря удобнее, но для этого нужно чтоб сервер был довольно мощным (и уж точно не виртуальным), чтоб машину можно было клонировать (предпочтительно) и т.п. Так что это я б отложил на потом...
      • 13 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        chroot + пользователь без привилегий не помогут от эксплоитов, да и без эксплоитов можно сделать очень много гадостей - например, fork-bomb.
        Если уж использовать что-то вроде AppArmor - лучше сразу SELinux, он более активно развивается и вроде возможностей у него побольше.
        По поводу виртуальных машин - если критична производительность, можно попробовать использовать "псевдо"-виртуальные машины вроде lxm (которые реализованы при помощи того же cgroups), правда, там уровень безопасности конечно гораздо ниже, чем при использовании полноценных виртуальных машин.
        • 13 лет назад, # ^ |
          Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

          Насчёт SELinux пожалуй согласен.

          UPD. А вообще, если с непривычки, то AppArmor по-моему всё-таки попроще настроить.

          Вообще же тут автору вопрос - компилирует ли он запускаемые программулины на своей стороне, или запускет полученые бинарники. Если первое - то появляются некоторые дополнительные возможности...
  • 13 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    В Windows как вариант всегда можно клонировать заранее созданную виртуальную машину, запускать код в ней, и убивать ее сразу как только код выполнился.
    Помню еще Михаил говорил давно, что песочница в Windows как-то непредсказуемо ведет себя с .NET, поэтому он отказался от Visual C# и на CodeForces используется Mono.