2

Как ограничить доступ к монтированию encfs для (a) определенного процесса (ов)?

По умолчанию encfs виден только текущему пользователю (кроме случаев использования параметра --public ).

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

Поэтому я хочу запускать encfs одним и тем же пользователем, а ограничение доступа для каждого процесса обрабатывается, например, группами управления (cgroups) или пространствами имен.

1 ответ1

2

В приведенных ниже решениях используются пространства имен с помощью команды unshare . Процессы в других пространствах имен не увидят монтирование.

Мы не можем использовать unshare -r потому что он запускается с правами группы nogroups , что не нравится в encfs/fuse.

Решение 1 (будет запрашивать рут права при каждом запуске)

Мы используем sudo unshare чтобы создать привязку и пометить ее как приватную. После этого мы меняем пользователя на sudo caller (sudo -u "#$SUDO_UID" -g "#$SUDO_GID") и явно удаляем права root (sudo -K). В этот момент мы можем вызвать encfs и начать делать что-то с your_program_here . Когда завершено, монтирование частного связывания удаляется родительским корневым bash (поэтому без повторного запроса пароля пользователя root), поэтому он больше не виден root через mount -l .

enc_dir="/path/to/enc_dir"
mount_point="/path/to/plain_dir"
RUN_CMD="mount --bind \"$mount_point\" \"$mount_point\"; \
         mount --make-private \"$mount_point\"; \
         sudo -u \"#\$SUDO_UID\" -g \"#\$SUDO_GID\" \
             bash -c \"sudo -K; \
                       encfs \\\"$enc_dir\\\" \\\"$mount_point\\\"; \
                       your_program_here \\\"\\\$@\\\"; \
                       fusermount -u -z \\\"$mount_point\\\" \
                     \" - \"\$@\"; \
        umount \"$mount_point\""
sudo unshare -m bash -c "$RUN_CMD" - "optional" "arguments"

your_program_here может быть любым, например, bash для командной строки. Вы можете передать аргументы этой программе ($ 1 = "необязательный" $ 2 = "аргументы") правильно.

Источник: Запустить команду sudoed после завершения скрипта? ответ от Celada + см. источники решения 2.

Решение 2 (имеет критическую уязвимость при использовании unshare> = v2.27.1)

Чтобы не запускать unshare от имени пользователя root, нам нужно использовать бит setuid.

sudo groupadd unshare
sudo adduser $USER unshare
sudo chmod u+s /usr/bin/unshare
sudo chown root:unshare /usr/bin/unshare

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

Затем (возможно, потребуется новый терминал):

unshare -m

Теперь у нас должна быть оболочка со знаком $ user, а не # root. Теперь нам нужно явно указать private или rprivate в опциях монтирования (объяснение в источниках ниже), а затем запустить encfs.

enc_dir="/path/to/enc_dir"
mount_point="/path/to/plain_dir"
sudo mount --bind "$mount_point" "$mount_point"
sudo mount --make-private "$mount_point"
encfs "$enc_dir" "$mount_point"

Процессы, запущенные из этой оболочки, смогут просматривать точку монтирования. Другие процессы не будут.

Источник: Скрытие зашифрованной папки в общей системе без корневого доступа (unshare -m), которую прокомментировал Филипп Вендлер и Кант (' Wendler & Cant'), получают пространства имен монтирования для каждого процесса для работы

Решение 3? (Лучший Представитель Породы)

Возможности дальнейшего изучения: Вероятно, есть что-то, что нужно сделать, поместив скрипт Solution 1 в файл .sh и установив setuid bit + chown, как в Solution 2. #$SUDO_*ID Переменные идентификатора могут нуждаться в замене чем-то другим, а эффективность sudo -K должна быть проверена.

Кроме того, переменные enc_dir и mount_point не должны быть параметризуемыми, поскольку они не используются безопасно. В противном случае они должны быть экранированы, или, что лучше, они должны быть переданы как первые параметры, не являющиеся общими (следовательно, $ @ следует заменить диапазоном позиционных параметров $ {@:2}).

Или заполните запрос функции для поддержки encfs/fuse в unshare -r чтобы unhare разработчики ...

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