Почему обычный пользователь не может удалить btrfs подобъем

Часть цели снимков LVM - то, что можно создать их на лету; нет никакой потребности сделать это во время начальной загрузки. LVM заботится, чтобы удостовериться, что файловая система находится в согласованном состоянии, когда это создает снимок. Один из, если не наиболее популярный способ использования снимков LVM должен получить стабильное изображение фс, можно сделать резервное копирование, не имея необходимость завершать работу сервера.

12
05.09.2013, 13:23
3 ответа

Хорошо это было полезным опытом для меня, но я в конечном счете понял это. Я объясню свой процесс здесь так, чтобы было легче знать, как понять этот материал самостоятельно (документация BTRFS, поскольку я уверен, что Вы узнали, является относительно неполным в настоящее время).

Сначала я думал, что создание подобъема было ioctl с обработчиком, который не сделал никакой проверки возможности (который может или не мог быть проблемой безопасности в зависимости от того, была ли некоторая логика к ней), тогда как удаление ее изменяло метаданные непосредственно (и таким образом пользователь мог бы потребовать CAP_SYS_RAWIO работать правильно).

Для проверки я взломал btrfs-utils исходный код и это - то, что я нашел:

Create subvolume, cmds-receive.c Line 180:
         ret = ioctl(r->dest_dir_fd, BTRFS_IOC_SUBVOL_CREATE, &args_v1);

Delete subvolume, cmds-subvolume.c Line 259:
         res = ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &args);

Ну, это не полезно, они - оба ioctl's (интересное примечание стороны: "снимок" часто используется interchangably в исходном коде с "подобъемом" по некоторым причинам). Таким образом, я перешел к исходному коду ядра и нашел оба обработчика в fs/btrfs/ioctl.c.

В конечном счете я проследил его до btrfs_ioctl_snap_destroy() и на строке 2116:

     if (!capable(CAP_SYS_ADMIN)){

А именно, это - проверка, если у них нет возможности, но если у них действительно есть она, логика пропускает прямо к выполнению операции. Тело, если проверки оператора, чтобы видеть, является ли это обычный пользователь, который является владельцем inode подобъема и USER_SUBVOL_RM_ALLOWED Опция BTRFS, включают его, продолжает выполнять обработчик. Если у них нет ни одного, из которого ioctl обработчик выходит с ошибкой.

Таким образом, похоже, что уничтожение "снимка" (иначе "подобъем") обычно требует пользователя, который имеет CAP_SYS_ADMIN (или для USER_SUBVOL_RM_ALLOWED чтобы быть включенным и пользователь "владеет" данным подобъемом). Большой, что относительно того, чтобы создать снимок/объем?

Обработчик для ioctl, кажется, btrfs_ioctl_snap_create() этот обработчик, кажется, не содержит вызова к capable() прямо или косвенно. Так как это - основной способ, которым поддержан доступ, я беру это, чтобы означать, что создание подобъема всегда успешно выполняется. Это объясняет на функциональном уровне, почему Вы видите, что Вы видите.

Я не могу говорить с тем, почему это считают желательным за пределами основного варианта использования BTRFS, являющегося с сервером с ограниченным пользовательским доступом. Это не достаточно, но я не вижу кода для фактической остановки операции. Если Вы не можете найти ответ на то, почему это (и Вы хотите иметь его), Вам, вероятно, придется спросить относительно списка рассылки ядра.

Заключение

Мое исследование, кажется, указывает, что любой может создать подобъемы, но для удаления подобъема, который Вы любой должны иметь CAP_SYS_ADMIN или этому нужно верный и что вызывающий абонент является владельцем подобъема inode и USER_SUBVOL_RM_ALLOWED включенный.

Создание подобъема не имеет смысла, таким образом, я, вероятно, пропускаю некоторый косвенный способ, которым отклонена операция, так как это походит на простой способ к DoS система.

Примечание: Я не нахожусь в месте, где я могу проверить эту функциональность, но после того как я возвращаюсь домой, я могу установить если setcap волшебство работает, как это предсказывает.

13
27.01.2020, 19:55
  • 1
    Путем это имеет смысл (относительно Вашего беспокойства DoS), то, если rmdir позволяется на пустых подобъемах. Затем rm -r будет работать прозрачно. К сожалению, код просто (еще) не был разработан. Похоже, что кто-то сделал три попытки в 2010 и затем сдался :(. spinics.net/lists/linux-btrfs/msg06499.html –  sourcejedi 06.03.2016, 20:11

Удаление подобъема позволяет кому-то удалять связь с файлами, которыми они не владеют. По-моему, файлы, которые привилегированный пользователь пишет в месте, выбранном менее привилегированным пользователем, являются справедливой игрой, но человек, который внес некорневую функциональность удаления, вероятно, не чувствовал себя уверенно достаточно в том, насколько безопасный они семантика была, и было довольно отправить их как новую опцию монтирования (mount -o user_subvol_rm_allowed).

5
27.01.2020, 19:55
  • 1
    Ну, удивительно в UNIX® можно легко удалить связь с файлом, которым Вы не владеете — у Вас просто должно быть разрешение записи в его каталоге. –  poige 27.10.2013, 18:25
  • 2
    , у меня есть та же проблема на мягкой фетровой шляпе 20, у меня есть / домой в подобъеме, я использую пользовательский корень, но anyaway, я не могу удалить / домой –  c4f4t0r 19.01.2014, 03:58
  • 3
    poige, если рассматриваемый файл находится в папке, которой Вы не владеете, Вы не можете удалить связь с ним, и Вы не можете удалить связь с самой папкой, так как это все еще содержит материал в нем. Можно только сделать неразрушающие операции на этой папке, как перемещение его или переименование его. –  sleblanc 18.01.2015, 23:38

"Не удалить / домой" (который является @home).

Почему Вы хотели бы удалить подобъем, на котором находится Ваша учетная запись/home/, если Вы не создали снимок/home_snapshot_yymmdd для замены / домой?

Я плохо знаком с использованием btrfs, но это - то, что я узнал: / и @home (/и / домой) создаются btrfs, когда он установлен на Вашем HD как файловая система. Если Вы не делаете восстановление / домой от предыдущего снимка, насколько я понимаю, Вы отключили бы себя в коленях.

Однако можно смонтировать устройство, что / домой идет, КОРЕНЬ AS, использование монтируют/dev/sa/mnt/(или что когда-либо устройство работа btrfs система) Затем CD к/mnt/, и оттуда дайте удалить команду для @home. Затем можно использовать команду mv для перемещения @home_snapshot_yymmdd (или что когда-либо Вы назвали им) к @home. Перемещение может занять часы, в зависимости от размера @home. Затем CD назад в Вашу собственную учетную запись и проблему sudo umount/mnt/Вы никогда не имеете действительно выхода из системы или закрываете Вашу систему. Это - красота btrfs.

-1
27.01.2020, 19:55
  • 1
    Кажется, что они уже сделали так. Btrfs не делает и @home, если Вы не говорите им (или Ваш дистрибутив как Ubuntu делает это для Вас). –  Anthon 28.01.2014, 19:39

Теги

Похожие вопросы