Можно ли запустить скрипт bash в своего рода песочнице?

13

Нашему продукту необходимо выполнить неизвестный скрипт bash на тонком сервере для достижения определенной цели. Этот скрипт bash предоставляется пользователем. Мы заинтересованы в том, чтобы только определенные команды были разрешены, а все остальные - нет. Кроме того, нам нужно заменить некоторые команды другими.

Так, например, мы хотели бы выполнить скрипт и разрешить следующие команды: echo cat awk

Но не разрешать любую другую команду (мы не хотим указывать здесь конкретный список).

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

Есть идеи, как это сделать?

вон там
источник

Ответы:

9

Самый простой способ - использовать chroot-тюрьму, содержащую только те команды, которые вы хотите, чтобы скрипт мог запускать. Затем вы запускаете сценарий через оболочку, которая вызывает chrootкаталог и затем выполняет сценарий.

Игнасио Васкес-Абрамс
источник
17

Не существует 100% -го безопасного запуска сценария на виртуальной машине, что, по-видимому, помешало бы сценарию достичь своей цели. Но есть две функции, которые могут вам помочь. Если вы обеспокоены тем, что скрипт был написан злоумышленником, этих функций недостаточно; но если вас беспокоит только то, что скрипт может причинить вред вашей системе, потому что он написан неосторожным программистом или имеет разные цели, любая из этих двух функций обеспечивает достойную среду для песочницы.

  • Вы можете запустить ограниченную оболочку , вызвав bash как bash -r. Я отсылаю вас к руководству по bash для подробного описания; Основная идея заключается в том, что скрипт не может вызывать команды, которые не находятся в $PATH, не могут изменяться $PATH, не могут перенаправлять в файл или из файла, и некоторые другие ограничения. Это довольно просто настроить, но если неизвестный скрипт слишком сложен для просмотра, он может использовать много вещей, которые запрещены в ограниченной оболочке.

  • Вы можете установить chroot тюрьму. Идея состоит в том, чтобы настроить дерево каталогов /some/rootи запустить сценарий в среде, которая считает, что /some/rootэто целая файловая система ( chrootсокращение от корня изменения). После того, как дерево каталогов настроено, запустите скрипт (скопированный в /some/root/myscript) как chroot /some/root /bin/bash /myscript. Например, вы должны создать каталог /some/root/binс командами, которые вы хотите разрешить, и программа chroot будет видеть этот каталог как /bin. Вам нужно будет скопировать все, что нужно для выполнения программы внутри chroot: библиотеки, файлы данных bash, сам скрипт и т. Д. Скрипт может быть /procподключен внутри chroot; Вы можете сделать это с помощью команды, как mount -t proc proc /proc.

    Если вам нужно сделать все дерево каталогов доступным для сценария, скажем /var/example, у вас есть несколько вариантов. Вы можете сделать копию под /some/root. Вы можете создавать жесткие ссылки (если они работают для вашего приложения и chroot находится в одной файловой системе). В Linux вы можете сделать mount --bind /var/example /some/root/var/example«прививку» /var/exampleвнутри chroot. Обратите внимание, что символическая ссылка не может работать, поскольку цель ссылки определяется внутри chroot.

    Обратите внимание, что chroot не обеспечивает абсолютную безопасность, особенно против процессов, выполняющихся от имени root. Например, корневой процесс может создать файл устройства внутри chroot и получить к нему доступ ко всему диску. Процесс chroot по-прежнему может устанавливать сетевые подключения (вы можете запретить это, не включив в него любую сетевую программу и убедившись, что ненадежная программа не может создать файл и сделать его исполняемым или перезаписать существующий исполняемый файл).

Жиль "ТАК - перестань быть злым"
источник
Вам нужно будет скопировать все необходимое , я могу сделать символические или жесткие ссылки, а не копировать?
kyb
1
@kyb Жесткая ссылка: да. Символическая ссылка: нет, символическая ссылка может указывать только на файл, который вы видите, она не позволяет вам избежать использования chroot. Жесткие ссылки трудно использовать для этого и неудобно: они ломаются, если вы заменяете файл, они открывают оригинальную копию в случае, если она доступна для записи внутри chroot. Если вы хотите сделать доступным целое дерево, скопируйте его или выполните монтирование только для чтения.
Жиль "ТАК - перестань быть злым"
Мне нужно , чтобы сделать доступные команды общих , как grep, awk, unitsи т.д. Нужен ли мне скопировать каждый бин файл и все вручную или зависимости есть некоторые полезные хак сказать явно , что утилиты должны работать в Chroot?
KYB