Альтернатива привязки в не привилегированном контейнере Docker

Вопрос или проблема

Я хочу запустить несколько процессов с разными представлениями на /some/path, чтобы один видел /other/path1, а другой видел /other/path2.

Я узнал, что это можно сделать с помощью unshare и mount --bind. Но я нахожусь внутри непривилегированного контейнера, который не позволяет выполнять необходимые системные вызовы.

Есть ли какие-либо альтернативные методы для этого? Может быть, какой-то инструмент, который может перехватить системный вызов open?

Я нашел отличный инструмент под названием proot, который может сделать именно то, что мне нужно.

Он также предоставляет статически скомпилированный бинарный файл, который можно просто использовать.

PRoot — это реализация в пользовательском пространстве chroot, mount –bind и binfmt_misc. Это означает, что пользователям не нужны никакие привилегии или настройки, чтобы использовать произвольный каталог в качестве новой корневой файловой системы, делать файлы доступными в другой части иерархии файловой системы или прозрачным образом выполнять программы, скомпилированные для другой архитектуры ЦП через QEMU в пользовательском режиме. Также разработчики могут использовать PRoot как универсальный механизм инструментирования процессов Linux благодаря его механизму расширения, см. CARE для примера. Технически PRoot полагается на ptrace, непривилегированный системный вызов, доступный в каждом ядре Linux.

Ответ или решение

Альтернативы привязки в пространстве имен внутри непривилегированного контейнера Docker

Когда речь заходит о создании изолированных сред для запуска различных процессов с разными представлениями одной и той же директории, многие пользователи сталкиваются с ограничениями, накладываемыми непривилегированными контейнерами Docker. В частности, стандартные методы, такие как использование unshare и команды mount --bind, невозможны из-за ограниченного доступа к необходимым системным вызовам. Однако существует подход, который может оказаться полезным для решения этой задачи – это использование инструмента PRoot.

Что такое PRoot?

PRoot — это пользовательская реализация chroot, mount --bind и binfmt_misc, обеспечивающая множество возможностей, которые обычно требуют повышенных привилегий. Поскольку PRoot работает в пространстве пользователя и использует системный вызов ptrace, его можно использовать для создания изолированных сред без необходимости в доступе с повышенными правами.

Вот несколько ключевых характеристик PRoot:

  • Изоляция: PRoot позволяет запускать программы в директории, которая рассматривается как корневая (root) файловая система, без фактического изменения корневой файловой системы системы или контейнера.
  • Переопределение путей: Можно легко перенаправить доступ к файлам из одного каталога в другой, обеспечивая разные виды доступа для различных процессов.
  • Поддержка различных архитектур: PRoot может использоваться в сочетании с QEMU для запуска программ, скомпилированных для других архитектур, что увеличивает его гибкость.

Как использовать PRoot в непривилегированном контейнере?

  1. Установка PRoot: Скачайте статически скомпилированный бинарный файл PRoot с официального сайта и разместите его в доступном для выполнения месте в вашем контейнере.

  2. Запуск процессов с различными путями: Для запуска процесса с различными путями используйте синтаксис PRoot, чтобы определить, какие директории будут доступны для разных процессов. Например:

    proot -r /path/to/new/root -b /other/path1:/some/path command1
    proot -r /path/to/new/root -b /other/path2:/some/path command2

    Здесь -r указывает на новую корневую файловую систему, а -b позволяет связать указанную директорию с местоположением в новой корневой файловой системе, таким образом позволяя различным экземплярам видеть разные виды на /some/path.

  3. Мониторинг и отладка: PRoot также может быть использован для анализа и отладки процессов благодаря поддержке инструментов для их инъекции.

Заключение

PRoot предоставляет мощный набор инструментов для работы в непривилегированных контейнерах Docker, позволяя создавать гибкие и изолированные среды с различными представлениями файловых систем. Это решение подходит как для разработчиков, так и для системных администраторов, работающих с контейнеризированными приложениями. Используйте PRoot для достижения OF системного контроля и гибкости, не прибегая к привилегированным операциям, тем самым улучшая безопасность и управляемость ваших контейнеров.

Оцените материал
Добавить комментарий

Капча загружается...