2

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

Наивный способ:

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

Конечно, это можно сделать с помощью ACL (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 и других атрибутов и т.д.

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

5 ответов5

1

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

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

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

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

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

Если вы включили ACL, как вы заметили, это дает большую часть практического эффекта сокращения.

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

  • B может использовать fakeroot для запуска программы и заставить ее поверить, что она работает от имени пользователя root, что позволяет имитировать chown, который существует только в памяти 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).

0

Это зависит от того, что вы подразумеваете под "без помощи root". Если вы можете получить root, чтобы добавить aaa и qqq в какую-то новую группу (подойдет любое имя) и убедитесь, что в файле есть как минимум r-- perms для новой группы ... (он может сохранить rwx для пользователя aaa - так что вы get => aaa:newgroup rw-r -----) тогда без дополнительной помощи от root aaa может измениться и qqq может прочитать тот же файл.

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

0

Хорошо, это действительно дерзко, но вы могли бы сделать:

aaa$ nc -l -p 12000 > bigfile.dat
qqq$ nc 127.0.0.1 12000 < bigfile.dat

Или же

aaa$ mkfifo /tmp/gimme
aaa$ chmod a+w /tmp/gimme
aaa$ cat /tmp/gimme > bigfile.dat
qqq$ cat bigfile.dat > /tmp/gimme

Если вы хотите сделать это, не занимая достаточно места для 2 копий bigfile.dat, вы можете использовать split и написать цикл для отправки по 1 чаку за раз, а затем сразу же отправить его.

Конечно, главная проблема заключается в том, что кто-то другой может сделать nc или echo и испортить ваш файл.

0

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

Мое мышление основано на Mac OS X, так что это может или не может работать для вас.

-1

Один из способов сделать это - создать 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 для локальной передачи может показаться странным, но по крайней мере это работает! :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .