В нашей среде несколько тысяч пользователей работают с приложениями на 40 кластерах размером от 20 вычислительных узлов до 98 000 вычислительных узлов. Пользователи в этих системах генерируют массивные файлы (иногда> 1PB), управляемые традиционными разрешениями Unix (списки ACL обычно недоступны или практически не используются из-за специфики файловой системы).
В настоящее время у нас есть программа под названием «give», которая является программой suid-root, которая позволяет пользователю «отдавать» файл другому пользователю, когда групповые разрешения недостаточны. Таким образом, пользователь должен напечатать что-то вроде следующего, чтобы передать файл другому пользователю:
> give username-to-give-to filename-to-give ...
Получающий пользователь может затем использовать команду под названием «take» (часть программы give) для получения файла:
> take filename-to-receive
Права доступа к файлу затем эффективно передаются принимающему пользователю.
Эта программа существует уже много лет, и мы хотели бы вернуться к ней с точки зрения безопасности и функциональности.
Наш текущий план действий состоит в том, чтобы устранить гниль в нашей текущей реализации «give» и упаковать ее в приложение с открытым исходным кодом, прежде чем мы повторно развернем его в производство.
У кого-нибудь есть другой метод, который они используют для передачи очень больших файлов между пользователями, когда доступны только традиционные разрешения Unix?
источник
chown
сделайте это. Похоже, вы также хотите скопировать файл, как только обе стороны согласны.Ответы:
Если эмитент действительно хочет отдать файл, вы можете использовать двоичный файл SUID, который перемещает файл в каталог, который доступен для записи всем и имеет липкий бит (например
/tmp
), а затем меняет владельца на нового владельца.chown(3)
уже заботится об удаленииset-user-ID
иset-group-ID
биты для вас. Таким образом, новый владелец может делать с файлом все, что ему нужно, включая его перемещение.Этот каталог, доступный для записи всем, может принадлежать домашнему каталогу пользователя, если вы хотите использовать несколько файловых систем для домашних каталогов и хотите убедиться, что вы не пересекаете границы файловой системы, поскольку производительность сразу же будет ужасной. В этом случае вы, вероятно, захотите убедиться, что получатель знает, когда предлагается новый файл.
Электронная почта сделает свое дело. Более Unixy-решение -
/etc/profile
это список недавно доставленных файлов. Дополнительный бонус, если вы предлагаете эту функцию сpam_echo
( например, сfile=/tmp/deliveries/%u
, см.pam_echo(8)
). Как и во всем, что связано с PAM, вам следует сначала убедиться, что все ваши реализации предлагают такой модуль.источник
Вы можете использовать систему с общим каталогом (возможно, без perms.), Где вещи для данного пользователя архивируются с определенной структурой имени файла (
to-$username_from-$username.tar
например,). Give делает файл иchowns
его целевому пользователю; взять извлекает файл и удаляет его.Если вы хотите сделать это как собственно перемещение (например, изменить местоположение файла и права доступа; копирование не нужно из-за огромного размера файла), вы можете избежать перехода в общий каталог с -x perms (так что никто не сможет список файлов есть) и тем же
chown
методом.mv
,chown
/mv
.источник
Как говорит xryl669, вы можете использовать каталог для общего доступа к файлам. Это должно выглядеть так:
Команда Give становится
Команда take выглядит примерно так:
источник
Я бы предложил переписать приложение так, чтобы оно имитировало «отдавать» и «брать», а не «выдвигать» и «вытягивать» его из защищенного каталога. Ваш каталог может быть доступен только для приложения push / pull, которое обрабатывает перемещения файлов. Кроме того, ваше приложение / сценарий может создать случайный, временный каталог с разрешениями, которые устанавливаются только для отправителя и получателя.
Хотите иметь больше безопасности? Вы можете PGP зашифровать / подписать файл (используя открытый ключ получателя).
С точки зрения переделки с «точки зрения безопасности и функциональности» я настоятельно рекомендую не создавать SUID-программы. Если вы не удаляете права должным образом, вы можете получить доступ к любому файлу в системе. Если ваша программа содержит ошибки (переполнение буфера и т. Д.) - можно воспользоваться этим, чтобы получить root-доступ в вашей системе.
источник
Это, вероятно, бесполезно для вас, но для справки cp --reflink source target делает копии файлов с использованием копирования при записи.
Это означает, что вы можете скопировать файл напрямую, и будут скопированы только измененные блоки. В отличие от жесткой ссылки, новый файл имеет свой собственный inode и метаданные, что означает, что вы можете затем предоставить копию файла новому пользователю, используя стандартный материал chown.
Насколько мне известно, эта функция доступна только в OCFS2 и btrfs. Я предполагаю, что это решает вашу проблему, но, учитывая, что ее наличие не очень распространено, она, вероятно, не будет полезна.
источник