
Как предоставить конкретному пользователю право изменять права пользователя и группы на файлы и каталоги внутри определенного каталога?
Я сделал поиск в Google и увидел, что существует такая вещь, какsetfacl
, что позволяет предоставлять пользователям определенные права на изменение разрешений для файлов и каталогов. Однако, насколько я понял, эта команда не позволяет предоставлять разрешения chown.
Итак, предположим, что файл имеет
user1 user1 theFile1
user1 user1 theDirectory1
Выполнение следующей команды завершится ошибкой.
[user1@THEcomputer]$ chown user2 theFile
У меня есть root-доступ на компьютере. Есть ли способ предоставить пользователю возможность выполнять chown
команды внутри каталога?
ОБНОВЛЕНИЕ: Как добавить пользователя в группу.
Здесьстатьякоторые я использовал для добавления datamover
в hts
группу.
[root@Venus ~]# usermod -a -G datamover hts
[root@Venus ~]# exit
logout
[hts@Venus Receive]$ groups
hts wireshark datamover
[hts@Venus Receive]$
ОБНОВЛЕНИЕ (комментарий к адресу RuiFRibeiro):
Изменение владельца каталога на сам каталог не работает, см. скриншот.
[datamover@Venus root]$ ls -la
total 311514624
drwxrwxrwx. 6 datamover datamover 4096 Oct 14 14:05 .
drwxr-xr-x 4 root root 4096 Aug 20 16:52 ..
-rwxrwxrwx. 1 datamover datamover 674 Aug 31 16:47 create_files.zip
drwxrwxrwx 2 datamover datamover 4096 Oct 17 17:07 dudi
-rwxrwxrwx. 1 datamover datamover 318724299315 Oct 13 15:47 Jmr400.mov
-rwxrwxrwx. 1 datamover datamover 182693854 Aug 31 16:47 Jmr_Commercial_WithSubtitles.mov
-rwxrwxrwx. 1 datamover datamover 80607864 Aug 31 16:47 Jmr_DataMover_Final.mov
drwxrwxrwx. 2 datamover datamover 122880 Aug 23 11:54 ManyFiles
drwxrwxrwx. 3 datamover datamover 4096 Oct 25 07:18 Receive
drwxrwxrwx 2 datamover datamover 4096 Oct 14 13:40 sarah
-rwxrwxrwx 1 datamover datamover 3184449 Oct 14 14:05 SourceGrid_4_40_bin.zip
[datamover@Venus root]$ cd ./Receive/
[datamover@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover 4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover 4096 Oct 14 14:05 ..
-rwxrwxrwx 1 hts hts 182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx 2 datamover datamover 122880 Oct 23 13:33 ManyFiles
[datamover@Venus Receive]$ chown datamover:datamover ./Jmr_Commercial_WithSubtitles.mov
chown: changing ownership of './Jmr_Commercial_WithSubtitles.mov': Operation not permitted
Вот попытка владельца файла:
[hts@Venus Receive]$ chown datamover:datamover Jmr_Commercial_WithSubtitles.mov
chown: changing ownership of 'Jmr_Commercial_WithSubtitles.mov': Operation not permitted
Итак, как видите, ни один из вариантов не работает.
ОБНОВЛЕНИЕ (ответ на адрес контррежима)
Групповое владение может быть изменено владельцем файла (и root). Однако это ограничено группами, к которым принадлежит владелец.
Да, сначала нужно выйти из системы. Вот результат моей попытки:
[hts@Venus ~]$ groups hts
hts : hts wireshark datamover
[hts@Venus ~]$ cd /mnt/DataMover/root/Receive/
[hts@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover 4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover 4096 Oct 14 14:05 ..
-rwxrwxrwx 1 hts hts 182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx 2 datamover datamover 122880 Oct 23 13:33 ManyFiles
[hts@Venus Receive]$ chown hts:datamover ./Jmr_Commercial_WithSubtitles.mov
[hts@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover 4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover 4096 Oct 14 14:05 ..
-rwxrwxrwx 1 hts datamover 182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx 2 datamover datamover 122880 Oct 23 13:33 ManyFiles
[hts@Venus Receive]$ chown datamover:datamover ./Jmr_Commercial_WithSubtitles.mov
chown: changing ownership of ‘./Jmr_Commercial_WithSubtitles.mov’: Operation not permitted
[hts@Venus Receive]$
Добавление hts в группу datamover действительно позволяет мне изменить владельца части группы, так что теперь частичный ответ и проверка утверждения.
решение1
Только root имеет право изменять владельца файлов. Достаточно современные версии Linux предоставляют такую CAP_CHOWN
возможность; пользователь, имеющий такую возможность, может также изменять владельца произвольных файлов. CAP_CHOWN
является глобальным, после предоставления применяется к любому файлу в локальной файловой системе.
Группа владения может быть изменена владельцем файла (и root). Однако это ограничено группами, к которым принадлежит владелец. Так что если пользователь U принадлежит к группам A, B и C, но не к D, то U может изменить группу любого файла, которым владеет U, на A, B или C, но не на D. Если вы ищете произвольные изменения, то это CAP_CHOWN
выход.
ОСТОРОЖНОСТЬ CAP_CHOWN
имеет серьезные последствия для безопасности, пользователь с оболочкой, которая имеет возможность, CAP_CHOWN
может получить привилегии root. (Например, chown
libc для себя, пропатчите своих троянских коней, chown
верните его и ждите, пока процесс root его подхватит.)
Поскольку вы хотите ограничить возможность смены владельца определенными каталогами, ни один из доступных инструментов вам не поможет. Вместо этого вы можете написать свой собственный вариант, который chown
заботится о предполагаемых ограничениях. Эта программа должна иметь возможность, CAP_CHOWN
например
setcap cap_chown+ep /usr/local/bin/my_chown
ОСТОРОЖНОСТЬ
Ваша программа, вероятно, будет имитировать настоящую chown
, напримерmy_chown
user:group filename(s)
. Выполняйте проверку ввода очень тщательно. Проверьте, что каждый файл удовлетворяет предполагаемым ограничениям, в частности, следите за мягкими ссылками, которые указывают за пределы границ.
Если вы хотите ограничить доступ к своей программе для определенных пользователей, вы можете либо создать специальную группу, установить групповое владение для my_chown
этой группы, установить разрешения на 0750 и добавить всех пользователей, которым разрешено входить в эту группу. В качестве альтернативы вы можете использовать sudo
с подходящими правилами (в этом случае вам также не нужна магия возможностей). Если вам нужна еще большая гибкость, то вам нужно закодировать правила, которые вы имеете в виду, в my_chown
.
решение2
Я столкнулся с этой же проблемой и уже использую ACL. Это может не относиться к вашей ситуации, но в моем случае, у определенного пользователя есть доступ на запись в дереве каталогов, а у всех остальных — на чтение, поэтому моя тактика заключается в написании небольшой программы setuid для проверки доступа на запись вызывающего пользователя и разрешения изменять доступ на чтение для других.
Вопрос по обсуждению этого вопроса можно найти здесь: