Выборочный доступ на чтение для смонтированного раздела только для чтения

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

У меня файловая система root только для чтения, защищенная dm-verity, и чистое хранилище пользовательских данных для записи. Тем не менее, мне нужно создать небольшой набор файлов на rootfs, которые требуют модифицируемого постоянного хранилища. Насколько я знаю, общим подходом для этого является использование файловых систем, похожих на unionfs, например, overlayfs. Проблема с overlayfs заключается в том, что, похоже, она не обеспечивает гранулярность на уровне файлов. Что я имею в виду: если я хочу сделать файл /etc/resolv.conf модифицируемым, мне нужно будет смонтировать всю папку /etc соответствующим образом.
mount -t overlay overlay -o lowerdir=/etc,upperdir=/opt/storage/etc-up,workdir=/opt/storage/etc-wd,noexec /etc

Я пытался использовать привязочные монтирования файлов вместо overlayfs, чтобы обойти это, поэтому идея заключалась в том, чтобы скопировать целевой файл в хранилище для записи при загрузке, а затем смонтировать его в оригинальное место. Однако, по-видимому, в некоторых случаях, например, при добавлении пользователя, программное обеспечение также пытается создать некоторые временные файлы в папке /etc (например, файлы блокировок), поэтому это не сработало для меня (создание файла, конечно, завершилось неудачей, потому что оригинальная rootfs смонтирована в режиме только для чтения). Мне интересно, есть ли решение, которое поможет мне сделать то, что я хочу. Требования можно резюмировать следующим образом:

Большинство rootfs навсегда остается только для чтения (уже реализовано, rootfs должен быть смонтирован в режиме только для чтения).
Я могу статически определить во время сборки образа, что file1, file2 … file_n исключены из этого списка “навсегда-только-для-чтения” данных.
Я могу определить, что новые файлы могут быть созданы в folder1, folder2 … folder_n.

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

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

В современных системах на базе Linux часто возникает необходимость ограничить доступ к файловой системе, смонтированной в режиме только для чтения, сохраняя при этом возможность модификации определённых файлов или директорий. Ваше описание задачи указывает на применение dm-verity для защиты корневой файловой системы и наличие чистого хранилища с возможностью записи для пользовательских данных. Рассмотрим ваш запрос более подробно, выделив ключевые моменты и возможные решения проблемы.

Проблема

Вы хотите оставить основное дерево файловой системы (rootfs) доступным только для чтения и при этом иметь возможность модифицировать только определённые файлы и директории. Вы упомянули, что использование overlayfs не подходит из-за того, что оно обеспечивает уровень монтирования, при котором целые директории становятся доступными для записи вместо отдельных файлов.

Вы также столкнулись с проблемой использования связывающих (bind) монтирований, поскольку некоторые программы могут пытаться создавать временные файлы в защищённых директориях, что приводит к ошибкам, так как корневая файловая система монтируется в режиме только для чтения.

Решение

Чтобы реализовать описанную вами функциональность, можно рассмотреть несколько стратегий, которые позволят вам достигнуть поставленных целей:

  1. Индивидуальные монтирования и привязка файлов:

    • Вместо связывающего монтирования целых директорий можно по умножить отдельные файлы при загрузке системы. Например, для файла /etc/resolv.conf:
      cp /etc/resolv.conf /opt/storage/resolv.conf
      mount --bind /opt/storage/resolv.conf /etc/resolv.conf

      Это позволит редактировать связанный файл, сохраняя при этом оригинал недоступным для записи.

  2. Использование overlayfs с upperdir для отдельных файлов:

    • Новая возможность в overlayfs позволяет создавать слои для отдельных файлов, но это требует дополнительных манипуляций. Вам необходимо будет создать отдельное место для хранения временных файлов, которые будет использовать программа, например, для /etc/passwd:
      mkdir /opt/storage/etc-wd
      cp /etc/passwd /opt/storage/passwd
      mount -t overlay overlay -o lowerdir=/etc,upperdir=/opt/storage/etc-up,workdir=/opt/storage/etc-wd,noexec /etc/passwd
  3. Использование механизма ACL (Access Control Lists):

    • Вы также можете рассмотреть возможность использования списков контроля доступа (ACL). Это позволит определить, какие пользователи или группы могут модифицировать конкретные файлы, не меняя разрешений всей директории.
    • Убедитесь, что поддержка ACL включена в вашем ядре и монтируйте файловую систему с опцией acl, например:
      mount -o remount,acl /
    • Затем можно задавать права доступа для определенных файлов:
      setfacl -m u:username:w /etc/resolv.conf
  4. Создание временных директорий:

    • В случае, если программе нужно создать временные файлы, вы можете создать отдельные директории на разделах, доступных для записи. Например, можно создать директорию /opt/tmp для хранения временных файлов и настроить программы на использование этой директории:

      mkdir /opt/tmp
      export TMPDIR=/opt/tmp

Заключение

Выборочное предоставление прав доступа на запись в файловую систему, смонтированную в режиме только для чтения, возможно при комплексном использовании нескольких инструментов и подходов. Каждый из предложенных методов имеет свои плюсы и минусы, и их можно комбинировать в зависимости от конкретных требований вашей среды.

Важно также учитывать специфику используемого программного обеспечения, которое может влиять на то, как управляются временные файлы и директории. Регулярное тестирование и мониторинг помогут убедиться в правильности и безопасности выбранных решений.

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

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