Чтение файлов, принадлежащих другому пользователю, без полномочий root

9

Я копирую серверы на резервный сервер. Каждый резервный сервер имеет свою собственную учетную запись на резервном сервере, и файлы пересылаются. Важно, чтобы разрешения оставались неизменными (используя rsync -p) для упрощения восстановления.

Я пытаюсь создать скрипт, который может читать файлы и создавать статистику. Мне не нравится, что этот сценарий запускается под пользователем root, и его также невозможно запустить для каждого резервного пользователя, так как сценарий должен иметь возможность читать все файлы всех пользователей. Тем не менее, это создает проблему, когда файл, например, chmodded 600. Я не хочу трогать разрешения, но другой пользователь, кроме пользователя root, и владелец не может прочитать его.

Определенный пользователь без полномочий root должен иметь возможность читать все файлы в каталоге или разделе независимо от уровня разрешений (и владелец файлов не должен иметь возможности предотвратить это). Есть ли способ добиться этого? Я использую FreeBSD с томом ZFS.

Evianon
источник
Это был мой первый вопрос на этом сайте :) Возможно, вы также можете посмотреть на это. unix.stackexchange.com/questions/91488/…
Рамеш

Ответы:

4

Использование sudo.

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

Например:

backupuser  ALL=(root) /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

В этом примере пользователь backupможет выполнить команду точно так, как показано:

sudo /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Если они вызывают sudo rsync...вместо sudo /usr/bin/rsyncкоманды сбой или если флаги или пути отличаются, команда завершается ошибкой.

Если вы делаете это в скрипте, то вы хотите разрешить использование этих команд без пароля:

backupuser  ALL=(root) NOPASSWD: /usr/bin/rsync -aH /files/to/backup/ /copy/of/backup/

Для получения дополнительной информации см. sudoers(5)Справочную страницу ниже Cmnd_list.

bahamat
источник
Отличная идея. Я добавил команды ls, cat, head, tail и т. Д. В файл sudoers и теперь могу выполнять их с правами root и читать все файлы. Может быть не лучшим решением для всех, так как пользователь может читать все файлы в системе, но это не проблема в моей настройке.
Эвианон
Ну, если бы вы использовали Solaris, я бы предложил RBAC и pfexec. Но так как ты на BSD, sudoпридется делать.
Багамат
4

Вы можете написать suidверсию, catкоторая может выполняться только вашим резервным пользователем (сделать группу эксклюзивной для резервного пользователя и сделать исполняемый файл доступным для чтения только этой группе). Это catпозволит вам только читать файлы в интересующем вас каталоге. (Возможно, вы захотите запретить символические ссылки и не упускать такие хитрости /dir/../otherdir/).

Затем ваш сценарий может использовать этот исполняемый файл для чтения файлов, не имея привилегий root.

CJM
источник
4

ВНИМАНИЕ: Как отметил Стефан в комментариях ниже, владельцы файлов все равно смогут отозвать ACL.

Если у вас есть root-доступ к компьютеру, вы можете сделать это с помощью ACL :

setfacl -R -m u:USERNAME:r /path/to/direcory

Это даст USERNAMEдоступ на чтение всем файлам и каталогам /path/to/directory.

Тердон
источник
Владельцы файлов все равно смогут удалить эти ACL.
Стефан Шазелас
@StephaneChazelas о. Даже если это было сделано root? Я этого не осознавал. Вы знаете, как обойти это?
Тердон
Нет, в Linux я бы посмотрел на сочетание возможностей Linux и LSM. На FreeBSD я понятия не имею.
Стефан Шазелас
1

Bindfs - это файловая система FUSE, которая предоставляет представления дерева каталогов с различными разрешениями и владельцем. Для FreeBSD нет порта, но вы можете скомпилировать его из исходного кода.

Чтобы дать пользователю backupper(и только этому пользователю) представление о том, /some/filesгде все файлы доступны для чтения, смонтируйте читаемое представление /some/filesв личном каталоге backupper.

mkdir -p ~backupper/spyglass/files
chown backupper ~backupper/spyglass
chmod 700 ~backupper/spyglass
bindfs -p a+rX-w /some/files ~backupper/spyglass/files
Жиль "ТАК - перестань быть злым"
источник
0

У ZFS есть некоторые механизмы для этого.

Один из механизмов все еще находится в разработке и еще не реализован, но позволяет монтировать набор данных с переопределением «владельца». В этом случае вы можете клонировать снимок, смонтировать его с владельцем, переопределенным для резервного пользователя, создать резервную копию и затем уничтожить клон. Недостатком является то, что вы не делаете резервную копию реального владения файлами.

Наилучшим решением, вероятно, являются списки ACL в стиле ZFS nfsv4.

Аллан Джуд
источник
0

У меня есть две идеи, как решить эту проблему, используя технологии, специфичные для FreeBSD, хотя я и не пробовал:

  • Используйте стручковый перец. Это мой предпочтительный метод. Кроме того, поскольку он был недавно перенесен на Linux, он также должен работать там. Было бы так:

    1. Создайте команду drop-cap-write, которая удаляет CAP_WRITE, а затем выполняет команду, указанную в командной строке
    2. Используйте sudo, чтобы разрешить пользователю резервного копирования выполнять эту команду без пароля
    3. При необходимости используйте директиву ForceCommand sshd_config для автоматического выполнения этой команды при каждом входе в систему резервного пользователя. Таким образом, удаленному пользователю не нужно будет указывать drop-cap-write в своем сценарии резервного копирования.
  • Используйте обязательный контроль доступа. Это не работает на Linux AFAIK, и это более неудобно для установки. Было бы так:

    1. Создайте резервную копию, чей rootdir /. Жесткий код тюрьмы.
    2. запустите sshd в резервной тюрьме. Разрешить root войти здесь, даже если вы не разрешаете вход с правами root в обычном sshd
    3. Установите ugidfw_enable = "YES" в /etc/rc.conf
    4. Используйте правило ugidfw, которое выглядит примерно так:

    ugidfw добавить тему uid root jailid BACKUP_JAIL_ID mode rsx

Алан Сомерс
источник