Сделать каталог немодифицированным или невосстанавливаемым, кроме как root

Я хочу, чтобы исключить удаление каталога, предположим, что каталог имеет этот путь

~/foo 

есть ли способ сделать его удаляемым только пользователем root, не используя sudo и не являясь пользователем root ?

например, это должно работать:

 sudo chown -R root:root ~/foo 

но если я не использую sudo, указанная выше команда не удастся

chown -R root:root ~/foo # fail

chown: изменение права собственности на «/ home / olegzandr / foo / bar»: операция не разрешена

возможно ли сделать файлы неуязвимыми, кроме пользователя root без использования sudo?

(Я также читал о команде chattr , но тег был недоступен, поэтому я не мог добавить chattr tag к вопросу.)

Если я попробую:

введите описание изображения здесь

Это не похоже на работу, потому что не возникает ошибка разрешения.

Для вашего первого вопроса используйте липкий бит:

 chmod o+t ~/foo 

это сделает его неприменимым для любого пользователя, но владелец и корень

Для команды chown вы не можете изменить владельца без разрешения суперпользователя

Владельцу каталога обычно разрешено удалять и переименовывать файлы и подкаталоги в этом каталоге. Модули безопасности Linux и атрибуты файлов (если они включены и доступны) могут добавить дополнительные ограничения.


Отредактировано с учетом изменений в вопросе:

Обычный пользователь может тривиально создать каталог, который исключает всех пользователей, кроме самих себя и root. Например:

 mkdir -m 0700 ~/foo 

создает каталог, доступный только пользователю владельца ( drwx------ ) и root; в то время как

 mkdir -m 0770 ~/foo 

создает каталог, доступный только пользователю-владельцу и членам группы ( drwxrwx--- ) и root.

С исключениями, установленными любыми модулями безопасности Linux, которые могут использоваться (скажем, SELinux), root может обращаться ко всем файлам в системе. Вот почему они суперпользователь, в конце концов.

Если вы запустите команду id -un , вы можете увидеть свое текущее настоящее имя пользователя. Команда id -gn сообщает вашу реальную группу, а id -Gn – имена дополнительных групп, в которых вы id -Gn . Если вы являетесь владельцем пользователя каталога, вы можете изменить группу любого файла или подкаталога на любую группу, членом которой вы являетесь команда chgrp .

Итак, допустим, вы являетесь пользователем grand и вы принадлежите к группам marina и torino . Если вы хотите создавать каталоги games-marina и games-torino только вы и все те, к кому пользователи, принадлежащие к этим двум группам, могут получить доступ (но другие могут читать, а не изменять или удалять что-либо), тогда

 mkdir games-marina chgrp marina games-marina chmod u=rwx,g=rx,o= games-marina mkdir games-torino chgrp torino games-torino chmod u=rwx,g=rx,o= games-torino 

Во многих системах пользователи также создают группу, соответствующую их имени пользователя. Это во многом полезно; например, обычно это группа по умолчанию для любых ваших файлов, поэтому явно, что вы контролируете их содержимое.

Пользователь обычно не может оставлять файлы или каталоги для контроля других. Такое изменение собственности действительно требует привилегий суперпользователя. (Например, чтобы изменить владельца файла или каталога с помощью chown , вам нужно либо быть root, либо иметь возможности CAP_CHOWN в Linux.)

Существует целый ряд причин, по которым отказ в таком отказе будет плохой идеей; технически, это можно было бы реализовать, но я лично еще не видел ничего хорошего. Я вполне уверен, что ОП пытается что-то сделать … скажем, здесь не полезно.

(У меня есть письменные сценарии, которые позволяют владение файлами в определенных деревьях каталогов между членами, принадлежащими к определенной группе, – да, веб-администраторы, – но это довольно просто, чтобы безопасно настроить с помощью sudo и несколько вспомогательных скриптов bash / dash. )


Если мы хотим создать каталог /home/olegzandr/foo который не может быть удален владельцем каталога /home/olegzandr , нам нужно сделать foo точкой монтирования и привязать привязку (корневой каталог) на наверху. Например, мы могли бы создать каталог /root/foo (принадлежащий пользователю root), а также привязать его поверх /home/olegzandr/foo используя, например,

 sudo mount --bind /root/foo /home/olegzandr/foo 

С монтированием /home/olegzandr/foo каталог /home/olegzandr/foo все еще существует (поскольку он используется в качестве точки монтирования), и владелец /home/olegzandr может управлять этим каталогом, но они не могут удалить его, пока монтируется привязка существует. Поскольку /home/olegzandr/foo – это новая точка монтирования, принадлежащая root, владелец /home/olegzandr не может ее манипулировать.

Чтобы защитить точку монтирования от удаления владельцем /home/olegzandr то время как монтирование привязки не действует, нужно установить точку монтирования /home/olegzandr/foo неизменяемую. Чтобы создать начальную точку монтирования (без установки монтирования привязки), я бы использовал

 sudo mkdir /home/olegzandr/foo sudo chmod 0700 /home/olegzandr/foo sudo chattr +i /home/olegzandr/foo 

Обратите внимание, что это также означает, что никто не может случайно скопировать данные или создать подкаталоги в /home/olegzandr/foo , если только не установлено привязку привязки. (Когда монтируется привязка, владелец, группа и разрешения /root/foo относятся к /home/olegzandr/foo тоже.)


В ext4 и большинстве других файловых систем мы обычно можем использовать промежуточный неизменяемый каталог для создания каталога /home/olegzandr/foo/bar , причем /home/olegzandr/foo является неизменным. Таким образом, владелец /home/olegzandr не может изменять или удалять /home/olegzandr/foo , а также не удалять /home/olegzandr/foo/bar . Последнее, кроме того, является подкаталогом в корневом каталоге и, следовательно, больше не находится под /home/olegzandr владельца /home/olegzandr . Чтобы поэкспериментировать с этим:

 sudo mkdir /home/olegzandr/foo sudo mkdir /home/olegzandr/foo/bar sudo chmod 0555 /home/olegzandr/foo sudo chattr +i /home/olegzandr/foo 

Затем вы можете установить владельца, группу и режим /home/olegzandr/foo/bar как вы пожелаете. Он не может быть удален (даже root) до тех пор, пока /home/olegzandr/foo неизменен.

Чтобы изменить неизменяемый атрибут файла, нужно быть либо корневым, либо иметь возможность CAP_LINUX_IMMUTABLE (который обычно имеет только корень).