Безопасно оценивать 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]()