Безопасно оценивать Perl-код на виртуальной машине в Интернете

update 2: я получил эту работу, и она живет:)

обновление: Пожалуйста, проверьте комментарии, @ikegami ответ работает, но с небольшой проблемой. Возможно, я делаю что-то довольно простое.


Недавно я решил, что мне нужно хорошо изучить Linux/Perl, а затем я начал создавать этот www.tryperl.com в качестве учебного проекта. Это Cloud IDE.

(Прошло всего несколько месяцев с тех пор, как я впервые положил руки на perl, linux, bash, osx, поэтому, пожалуйста, пройдите на меня)

В настоящее время я код eval с Safe.pm, но мой план игры:

Отдельная виртуальная машина Amazon EC2, которая будет проверять perl-код небезопасный и возвращает результат. Виртуальная машина будет заблокирована из Интернета и сбалансирована. Я могу затем reset эту машину из моментального снимка время от времени.

Это в основном код, который я буду использовать для кода perl на сервере, я использую Time:: Out для управления тайм-аутом:

my $code = ..
my $arg = ..

#create a file with random name
my $filename = rand().".pl";
open(FILE,">$filename")
print FILE $code;
close(FILE);

#use Time::Out to timeout after 10 secs

my $ret = timeout 10 => sub {
  #run the file just created with $arg as an argument. << This is IMP 
  my $r = `perl $filename $arg`;
  return $r;
};
if ([email protected]){
    return [email protected];
}   
return $ret;

Мои Проблемы

  • Могу ли я как-то избежать создания физического файла и передать $code с помощью $arg? Как open(FILE,"perl <some_magic> | "). Может показаться глупым, но я должен был спросить: (). Это было решено @ikegami в комментариях.

  • Я не могу использовать Capture:: Tiny. Я попытался сделать это внутри блока тайм-аута:
    my ($stdout, $stderr, $count) = capture { system('echo Hello') };
    Но я продолжал получать пустые строки!:( Это потому, что он находится в таймауте? (Мне все равно не слишком много об этом)

  • Есть ли другие недостатки безопасности, которых я не вижу? Должен ли я делать предел fork? Как мне начать это делать? (Ссылки и некоторые указатели были бы хороши)

  • Автор http://www.perltuts.com говорит в этой статье, он использует qemu и debian чтобы запустить его код. Помимо ограничения fork, Является ли его подход семантически похожим на мои? (Простите мое невежество здесь снова, Помните, что я коснулся окна Linux всего несколько месяцев назад)

Мой блок разработчика - OSX 10.8, производственный сервер - RHEL для интерфейсов и Ubuntu для Perl eval Machine. Я бегу по EC2. Подробнее см. Полный стек здесь.

Любой подробный ответ будет оценен и вознагражден репутацией и единорогом:)

Ответ 1

После 13 дней напряженной работы я, наконец, сделал это!

Я исследовал FreeBSD Jails, мой отсутствие сетевого взаимодействия и факт что мне пришлось перестроить ОС, много раз меня отгоняли. FreeBSD действительно круто! Я скоро вернусь к нему.

Я мрачно посмотрел на OpenVZ, а затем благодаря @ewwhite Я снова просмотрел Linux Containers и дал ему правильный снимок.

Документы не велики, но эта статья действительно помогала всем.

  • Я настраиваю несколько контейнеров под балансировщиком нагрузки: HAProxy.
  • У меня есть perl-установка внутри каждого контейнера с модулями cpan, которые мне нужны.
  • My PerlExecutor - приложение Dancer, которое работает на Starman, оно работает под управлением ограниченного пользователя, который имеет меньше привилегий и имеет пределы в limits.conf
  • Контейнер заблокирован из Интернета.

Одно ограничение. Я мало знаю о сети, поэтому я заблокировал тюрьмы из Интернета, отключив переадресацию портов на хосте. Тем не менее, тюрьмы по-прежнему должны быть в сети, чтобы хост мог общаться с ним, в результате вы все равно можете сделать ping внутри тюрьмы, которая разрешит домен, но он выиграл 't ответьте. Таким образом, любые веб-запросы внутри терпят неудачу. Я также выполняю строковое сканирование для Ping и блокирую его.

Любые предложения или улучшения будут очень приветствуемыми!

Я хотел бы поблагодарить @JakeFeasel @ikegami @ewwhite @chris-s и ребятам на ubuntu.SE и unix.SE за их помощь:

Это выглядит так:

TryPerl Architecture Diagram