Как передать файл от одного пользователя к другому (без создания каких-либо копий его)?

Предположим, что пользователь "qqq" имеет файл/home/qqq/bigfile.dat и хочет передать его пользователю "aaa" без справки корня (он должен принадлежать "aaa"). Что должно, пользователи "qqq" и "aaa" делают?

Наивный путь:

  1. uid=qqq$ mv bigfile.dat /home/aaa/
  2. uid=aaa$ chown aaa /home/aaa/bigfile.dat # Operation not permitted

Конечно, это может быть сделано при помощи ACLs (uid=qqq$ setfacl u:aaa:rw- /home/aaa/bigfile.dat) или путем создания временной копии (uid=aaa$ mv bigfile.dat bigfile.dat_ && cat bigfile.dat_ > bigfile.dat && rm bigfile.dat_), но оба пути, кажется, имеют недостатки.

Оба пользователя соглашаются (может дать некоторую команду) "передать" файл. Это должно быть быстро, сохранив inode и другие атрибуты и т.д.

Как сделать это чисто?

2
задан 06.09.2010, 16:26

4 ответа

Старые системы Unix позволили любому пользователю показанному свои собственные файлы к любой цели. Больше всего больше не делайте, потому что это создало некоторые проблемы безопасности:

  • Если там существуют квоты использования диска, пользователь A мог бы хранить файлы на расходе пользователя B путем помещения их в частный каталог. Пользователь B никогда не знал бы кроме путем сравнения их видимого использования диска с их квотами и не будет иметь никакого способа найти вора квоты.

  • Некоторые привилегированные программы (устанавливает [ug] идентификационные исполняемые файлы или демонов) предполагают что, если файл принадлежит пользователю, что пользователь утвердил содержание. Если пользователь A мог показанный файл пользователю B, A мог бы обмануть привилегированную программу в принятие любых данных. (Это - небезопасный дизайн так или иначе, потому что, даже если A на самом деле записал файл, A, возможно, не утвердил его для этой конкретной цели; но такие программы действительно существуют, и запрещающий chowns действительно снижает риск.)

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

Насколько я знаю, невозможно изменить владение файла в большинстве современных систем Unix без сотрудничества корня. Корень мог выполнить показанный или дать A или B разрешение сделать это через sudo, но это требует более целенаправленного корневого вмешательства, чем обычно желательно.

Если ACLs включены, как Вы заметили, это дает большинство практических эффектов chowning.

Если рабочий процесс действительно требует быть владельцем в какой-то момент и B, чтобы быть владельцем в некоторой другой точке, существуют другие опции, которые Вы могли исследовать.

  • B мог бы использовать fakeroot, чтобы запустить программу и заставить его полагать, что он работает как корень, который позволяет моделируемый, показанный, это существует только в памяти fakeroot (fakeroot sh -c 'chown B file; su B -c program').

  • Вы могли выделывать фокусы с FUSE. Например, bindfs позволяет Вам создать представление дерева каталогов, где файлы имеют другого владельца (mkdir view_for_B; bindfs -u B actual_directory view_for_B).

1
ответ дан 12.12.2019, 07:09

Можно ли переместить файл в некоторое совместно используемое пространство, что у обоих пользователей есть доступ для записи к (или разве такая вещь не существует на Linux?), и затем имеют владельца chmod это к получателю?

Мое мышление базировано в Mac OS X, так, чтобы мог или мог не работать на Вас.

0
ответ дан 12.12.2019, 07:09

Это зависит от того, под чем Вы подразумеваете "без справки от корня". Если можно заставить корень добавлять aaa, и qqq некоторой новой группе (любое имя сделает), и удостоверьтесь, что файл имеет, по крайней мере, r - перманент для новой группы... (это может сохранить rwx для пользователя aaa - таким образом, Вы добираетесь => aaa:newgroup rw-r-----), затем без ДАЛЬНЕЙШЕЙ справки от корня aaa, может изменить, и qqq может считать тот же файл.

Если бы Вы хотите сделать это "против пожеланий корня", затем я считал бы это ошибкой, если бы Вы нашли какой-либо путь, который работает. Большая мысль вошла в предотвращение этого, потому что это - проблема безопасности, если aaa может поместить троянца в каталог, к которому qqq имеет доступ и мог бы "случайно" затем выполнить.

0
ответ дан 12.12.2019, 07:09

Один способ сделать это должно было бы создать ssh-ключ, который позволяет пользователю qqq соединяться как aaa. Поскольку qqq делают

ssh-keygen -t rsa

и решите, хотите ли Вы пойти для ключа без пароля или нет.

Затем добавьте недавно созданный ключ к aaa путем выполнения этого как qqq:

ssh-copy-id -i ~/.ssh/id_rsa.pub aaa@localhost

После этого Вы могли переместить файлы как это:

scp bigfile.dat aaa@localhost:

(или с Вашим любимым sftp клиентом)

Тот путь sshd заботился бы об изменении владения.

Используя scp/sftp для локальной передачи мог бы звучать странным, но по крайней мере который работает!:)

-1
ответ дан 12.12.2019, 07:09

Теги

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