Назад | Перейти на главную страницу

Проблема с каталогом группы

У вас есть сложный вопрос. Есть линукс-бокс. Необходимо создать каталог, в котором пользователи могли бы создавать файлы, но удалять / изменять только созданные ими файлы. Достаточно просто установить липкую биту и все. Но тогда мы хотим, чтобы конкретный пользователь-администратор мог удалять файлы из этого каталога, а не был пользователем root. Как это сделать? Там возможны NFS4_ACL. Но я уверен, что они не помогут. Идеи? Пользователи: user1: uploaders user2: uploaders admin1: admins <--- должны иметь возможность управлять файлами в каталоге группы

sgid on dir позволяет защитить файлы от редактирования другими пользователями, но ничто не мешает пользователю удалить файлы других пользователей. Это проблема

ОБНОВЛЕНИЕ 1:

Вопрос касался разрешений FS и nfs4_acls только потому, что пользователи будут работать с файлами через sftp. Так что sudo и другие сценарии невозможны. Возможно использовать LD_PRELOAD для sftp-сервера и переопределить системный вызов unlink или что-то в этом роде. Так что он попадает в openssh и sftp-server.

ОБНОВЛЕНИЕ 2:

Пользователи подключаются к соответствующему каталогу с помощью openssh, и каталог должен принадлежать root: root, чтобы он работал. Все файлы помещаются в этот каталог без какой-либо структуры (зависит от приложения). На самом деле администратор - не единственный пользователь, который управляет загруженными файлами, а скорее группа пользователей-администраторов.

Я был бы склонен решить с sudo а не с ACL. (В вопросе нет явного упоминания NFS, поэтому я предполагаю, что root_squash не проблема.)

Начните с вашего каталога с разрешениями 1777 (липкие плюс все чтение / запись), как вы предложили.

Создайте этот сценарий с именем файла, например /usr/local/bin/rmd. Изменить определение TARGET так что это абсолютный путь к целевому каталогу

#!/bin/bash
#
# Remove files from $TARGET. Some care is taken to avoid escaping from
# the path root
#
########################################################################
#
TARGET='/tmp'

ERROR=
for ITEM in "$@"
do
    LINK=$(readlink -f "$ITEM")
    if test -n "$LINK" && echo "$LINK" | grep -vq "^$TARGET/"
    then
        echo "Suspicious path: $ITEM" >&2
        ERROR=yes
    fi
done
test yes = "$ERROR" && exit 1

exec rm "$@"

Добавьте следующую запись в sudoers файл (используйте visudo для редактирования этого файла). Изменить admin быть пользователем с правами администратора для удаления файлов в целевом каталоге.

admin ALL = NOPASSWD: /usr/local/bin/rmd

Поскольку мы знаем, что rmd в /usr/local/bin можно было бы повторноexec сценарий, если он не имеет достаточных привилегий, и поэтому администратор не должен помнить об использовании sudo, но я пока это опустил. Дайте мне знать, если вы хотите эту корректировку скрипта.

Пример использования

$ ls -l /tmp
lrwxrwxrwx 1 roaima roaima 4 Mar 31 00:17 etc -> /etc
-rw-r--r-- 1 roaima roaima 0 Mar 31 00:29 one
lrwxrwxrwx 1 roaima roaima 2 Mar 31 00:20 root -> ..
-rw-r--r-- 1 roaima roaima 0 Mar 31 00:29 two

$ sudo rmd /tmp/etc/hosts /tmp/root/etc/motd /tmp/one
Suspicious path: /tmp/etc/hosts
Suspicious path: /tmp/root/etc/motd

$ ls /tmp
etc  one  root  two

$ sudo rmd /tmp/one /tmp/root
$ ls /tmp
etc  two

Bindfs это одно из возможных решений. Я назвал своего опытного администратора nradmin и вот пример:

mkdir /uploads
chmod 1777 /uploads

mkdir /home/nradmin/manage-uploads
bindfs -u nradmin -p ud+rwx /uploads /home/nradmin/manage-uploads

Каждый файл и каталог в смонтированной цели принадлежит nradmin. В -p ud+rwx делает каждый каталог с разрешениями "rwx" для владельца каталога. поскольку nradmin является владельцем всех каталогов и имеет в них полные права владельца, он может успешно удалить любой файл в них, даже рекурсивно.


Альтернативный подход заключается в том, что вы кодируете ограниченный chroot() реализация /bin/rm и выполните его как root. А chroot() может быть экранирован процессом, запущенным root но только если вы дадите этому процессу свободу выполнять все, что он хочет. Простой двоичный код C, который сначала делает chdir() & chroot() к /uploads каталог, а потом только звонки unlink() или rmdir() должен быть безопасным. Но для этого требуется много кода, например, рекурсивное удаление каталогов, параметр командной строки, например -f игнорировать несуществующие файлы и т. д.

Вот одно простое решение. Считайте, что административный пользователь admin, и что наш специальный каталог должен быть /tmp/special.

mkdir /tmp/special
chmod 1777 /tmp/special
chown admin:admin /tmp/special
ls -ld /tmp/special
drwxrwxrwt 2 admin admin 4096 Apr  3 21:34 /tmp/special

Любой пользователь может создавать / редактировать / удалять свои файлы в /tmp/special. Пользователь admin может удалить любой файл (хотя и с предупреждениями от rm).

NB Если пользователь создает каталог в /tmp/special, административный пользователь не может его удалить. Это может быть показателем для этого решения, но, поскольку ваш вопрос только упоминается файлы и нет каталоги Я чувствовал, что это стоит предложить.

Полный объем этой проблемы неясен, поскольку мы не знаем, в чем состоит ее использование. Однако с помощью меток SELinux можно добиться того, о чем вы просите. SELinux дает вам детальный контроль над тем, кто что и где делает. Если количество пользователей «ограничено» и «известно» - наличие определенных контекстов / меток, связанных с каждым из них, не является большой проблемой, тогда нужно написать небольшую политику для кода в ваших требованиях.

Хм ... как насчет chroot на /special_folders_root/special_folder/./ чтобы избежать проблем с корневыми каталогами, принадлежащими root? См. Документацию vsftpd (например) для объяснения посторонних точек в пути.

Не уверен, что следующее будет полезно, но: У нас есть доля самбы с поддиректорами. Сетевые MFU, помещающие отсканированные документы в определенные подкаталоги (MFU01 -> / share / 001 /, MFU15 -> / share / 015 / etc). Пользователи (из Windows) могут изменять или удалять файлы в любом из этих подкаталогов, но не могут удалять подкаталоги. Я сделал это, используя ACL в стиле Windows, но я ничего не знаю о ACL NFS.

NB! Не за щедрость, а за помощь.

Как насчет этого подхода:

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

В $share, все является ссылкой на исходные файлы, и списки управления доступом владельца / администратора имеются.

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