13

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

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

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

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

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

2 ответа2

17

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

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

  • Вы можете установить chroot тюрьму. Идея состоит в том, чтобы настроить дерево каталогов /some/root и запустить скрипт в среде, которая считает, что /some/root - это целая файловая система (chroot - это сокращение от root для изменения). После того, как дерево каталогов настроено, запустите сценарий (скопированный в /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 к «graft» /var/example внутри chroot. Обратите внимание, что символическая ссылка не может работать, поскольку цель ссылки определяется внутри chroot.

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

9

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .