Я хочу выполнить команду в Linux так, чтобы она не могла создавать или открывать какие-либо файлы для записи. Он по-прежнему должен иметь возможность читать файлы в обычном режиме (таким образом, пустой chroot-файл не является опцией) и при этом иметь возможность записи в уже открытые файлы (особенно в stdout).
Бонусные баллы, если запись файлов в определенные каталоги (т.е. в текущий каталог) все еще возможна.
Я ищу решение, которое является локальным для процесса, то есть не включает настройку таких вещей, как AppArmor или SELinux для всей системы, а также привилегий root. Это может включать установку их модулей ядра.
Я смотрел на возможности, и они были бы хороши и просты, если бы была возможность создавать файлы. ulimit - другой подход, который был бы удобен, если бы он охватывал этот вариант использования.
strace
говорит, какие файлы открывает программа. почему ты хочешь сделать это? Это конкретная программа, или вы хотите это для тестирования или что-то еще? Можете ли вы запустить программу как пользователь / группа, у которой нет прав на запись почти везде, кроме текущей директории? Современные дистрибутивы Linux используют идею группы для каждого пользователя, поэтому это должно быть относительно легко настроить.Ответы:
Как насчет создания пустого chroot, а затем связать и смонтировать основную файловую систему как доступную только для чтения внутри chroot?
Вероятно, должно быть что-то вроде этого для создания привязки только для чтения:
Вы можете связать и смонтировать другие каталоги, к которым у джейла также будет доступ на запись. Будьте осторожны, если вам нужно привязать-монтировать специальные каталоги (/ dev /, / proc /, / sys /), монтировать их как есть может быть небезопасно.
источник
/foo/
путь к основной файловой системе?Кажется, что правильный инструмент для этой работы
fseccomp
основан наsync-ignoring
f-коде Бастиана Бланка, я придумал этот относительно небольшой файл, который не позволяет всем его дочерним элементам открыть файл для записи:Здесь вы можете видеть, что все еще можно читать файлы:
Это не препятствует удалению файлов, их перемещению или другим файловым операциям, кроме открытия, но это можно добавить.
Инструментом, который позволяет это без необходимости писать код на C, является syscall_limiter .
источник
Не могли бы вы написать замену
open(…)
функции и загрузить ее с помощью LD_PRELOAD?источник
open
... Ну, я бы рассмотрел использование существующего решения, которое использует этот подход, да.write(…)
другое.Самым простым решением, вероятно, является программа-обертка, которая создает новое пространство имен файловой системы с соответствующими файловыми системами, смонтированными только для чтения, а затем исполняет программу, которую вы пытаетесь ограничить.
Это то, что
systemd
происходит, когда вы используетеReadOnlyDirectories=
для пометки определенные каталоги только для чтения для службы. Существует такжеunshare
команда,util-linux
которая может выполнить работу по созданию нового пространства имен, так что вы можете сделать что-то вроде:где
wrapper
тогда просто нужно перемонтировать файловые системы, как требуется, перед запуском реальной целевой программы.Единственная проблема заключается в том, что вам нужно быть,
root
чтобы создать новое пространство имен ...источник
Вы можете запустить его в chroot, монтируя специальные версии
/tmp
и тому подобное внутри. Возможно, systemd поможет, и особенно systemd-nspawn (1) , который выглядит так, как вы хотите.источник
Виртуальная машина позволила бы сценарию писать в любом месте, не влияя на хост-систему, и проверять, куда она на самом деле пытается писать, что, кажется, является целью.
Например, вы можете легко запустить Arch Linux с
источник
Выполнение первоначальной настройки от имени пользователя root - действительно самый простой способ. В частности, chroot в монтируемом монтировании только для чтения - это путь наименьшего сопротивления.
Вы можете использовать bindfs вместо того,
mount --bind
чтобы создавать представление только для чтения без необходимости быть пользователем root. Тем не менее, вам нужно сделать что-то как root, чтобы предотвратить доступ к другим файлам, например, chroot.Другой подход заключается в том,
LD_PRELOAD
что библиотека подключается к открытию файла и не позволяет писать. Это не требует особых привилегий. С точки зрения безопасности это можно обойти, но это нормально для вашего случая использования, когда вам нужно только содержать определенную функцию, а не произвольный собственный код. Однако я не знаю существующей библиотеки для этого.LD_PRELOAD
может также использоваться, чтобы ограничить программу представлением только для чтения, созданным с помощьюmount --bind
илиbindfs
; опять же, я не знаю о существующей библиотеке.В Debian и его производных вы можете настроить среду schroot . Schroot является setuid root и должен быть настроен как root, но может быть выполнен любым авторизованным пользователем.
Метод, который не требует какого-либо взаимодействия со стороны root - это запустить процесс на виртуальной машине. Вы можете настроить KVM или VirtualBox, или пользовательский режим Linux . Он немного тяжелый и будет означать дополнительное потребление памяти, но не должно существенно влиять на скорость необработанных символьных вычислений.
Как "заточить" процесс, не будучи root? может дать некоторое вдохновение.
источник
Один из способов по крайней мере предотвратить процесс от записи файлов (но не от их создания) -
ulimit -f 0
сначала вызвать . Это прервет процесс, как только он попытается записать файл, но создание пустых файлов все еще возможно.источник