Как запретить удалять нужные файлы, но разрешить создавать/изменять/удалять прочие файлы?

Как запретить удалять нужные файлы, но разрешить создавать/изменять/удалять прочие файлы?

29.07.2016 08:24:51 Просмотров 19 Источник

Допустим, есть такая файловая система ext4 с точкой монтирования /ILYA, в которой находится файловое хранилище, и как пример, абсолютный путь к одному из файлов.

/ILYA/Music/W.A.S.P/1984 - W.A.S.P/01 - I wanna be somebody.flac

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

  1. Попробовал просто заменить владельца этих файлов root-ом.

    p='/ILYA' && sudo chown -R root:root "$p" && sudo chmod -R =r,u+w,+X "$p" && chown user "$p"
    

    Но, оказывается, пользователь user без проблем удаляет любой файл, принадлежащий пользователю root, если он владелец родительской директории /ILYA, а в директории /ILYA/Music он уже не может удалять, но и не может создавать. Вариант не сработал.

  2. Добавил stickybit.

    p='/ILYA' && sudo chown -R root:root "$p" && sudo chmod -R =r,u+w,+X,+t "$p" && chown user "$p"
    

Но это вообще ничего не изменило.

Подскажите, как решить эту задачу, или что я недосмотрел, или, хотя бы, куда мне копать?

Ответ.

Основная моя ошибка была в том, что я считал атрибуты chmod =r,u+w,+X,+t и a=trX,u+w эквивалентными на основании того, что =r было эквивалентно a=r. Запись с a= и короче, и красивее, и понятнее, а главное выполняет то, что от неё требуется. (Сбросить все привилегии и заново установить для всех пользователей стикибит, чтение, и если это директория, то и выполнение, а для владельца, по мимо этого, ещё установить запись)

И так моя задаче решается такой командой, к сожалению, без find не обойтись.

p='/ILYA' && sudo chown -R root:users "$p" && sudo chmod -R go-w "$p" && sudo find "$p" -type d -exec chmod a+t,g+w "{}" \;

Вернуть назад.

p='/ILYA' && sudo chown -R user:users "$p" && sudo chmod -R a-t,g-w "$p"

А также, в случае, если нужно запретить удалять даже root-у, тогда нужно использовать chattr + find только на файлы, пропуская директории.

p='/ILYA' && sudo find "$p" -type f -exec chattr +i "{}" \;

В этом случае эти файлы, причём уже совершенно не важно кто ими владеет, не сможет удалить даже root, пока root не снимет атрибут i, j, обратной командой.

p='/ILYA' && sudo find "$p" -type f -exec chattr -i "{}" \;
У вопроса есть решение - Посмотреть?

Ответы - Как запретить удалять нужные файлы, но разрешить создавать/изменять/удалять прочие файлы? / Как запретить удалять нужные файлы, но разрешить создавать/изменять/удалять прочие файлы?

Gennadiy_G

29.07.2016 08:35:58

попробуй изменить права для файлов chmod 700 *

https://ru.stackoverflow.com/questions/550015/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bf%d1%80%d0%be%d1%87/550016#comment704946_550016
Если оставить владельца ilya, то это не даст ничего, если root, то файлы перестанут быть доступны на чтение всем кроме root-а, а мне нужно что бы они были доступны на чтение всем.
Является ответом!
aleksandr barakin

29.07.2016 08:46:58

выдержка из man chattr:

A file with the `i' attribute cannot be modified: it cannot be deleted or renamed, no link can be created to this file and no data can be written to the file. Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE capability can set or clear this attribute.

вольный перевод:

файл с атрибутом i не может быть модифицирован: он не может быть удалён или переименован, на него невозможно создать «жёсткую» ссылку (hardlink) и в него невозможно записать информацию. только суперпользователь или процесс, обладающий «возможностью» (capability) CAP_LINUX_IMMUTABLE может установить или удалить этот атрибут.

пример. создадим от имени рядового пользователя файл:

$ touch file

он принадлежит «рядовому» пользователю:

$ ls -l file
-rw-r--r-- 1 user user 0 Jul 29 20:42 file

и не имеет (пока) никаких спецатрибутов:

$ lsattr file
---------------- file

установим атрибут i:

$ sudo chattr +i file
$ lsattr file
----i----------- file

попробуем удалить:

$ rm file
rm: remove write-protected regular empty file `file'? y
rm: cannot remove `file': Operation not permitted

даже суперпользователь этого не сможет сделать:

$ sudo rm file
rm: cannot remove `file': Operation not permitted

пока не снимем атрибут i:

$ sudo chattr -i file

теперь и «рядовой» владелец сможет его удалить:

$ rm file

можно установить этот атрибут и на каталог. тогда всё содержимое каталога (но не подкаталогов, у которых атрибут не установлен) станет (частично) неизменяемым: нельзя будет создавать/удалять/переименовывать файлы/каталоги, но можно будет изменять содержимое файлов.

https://ru.stackoverflow.com/questions/550015/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bf%d1%80%d0%be%d1%87/550017#comment704953_550017
Спасибо за наводку. :-) Никогда не сталкивался с chattr и acl, но видимо придётся. :-) Проблема теперь в том, что при рекурсивном вызове он накладывается и на директории, что в свою очередь препятствует созданию в них файлов. Можно ли стандартными средствами chattr как-то применить рекурсивно только для файлов, не затрагивая директории, например, как флаг X в chmod?
https://ru.stackoverflow.com/questions/550015/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bf%d1%80%d0%be%d1%87/550017#comment704954_550017
1. это не acl. 2. $ sudo find каталог -type f -exec chattr +i {} \;
https://ru.stackoverflow.com/questions/550015/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bf%d1%80%d0%be%d1%87/550017#comment704997_550017
Почитал маны на chattr это что-то такое... даже не знаю сказать что. Кроме атрибутов "i" и "u", там ничего полезного и нет. На счёт атрибута "u" заранее никогда не знаешь, какой файл случайно удалишь, так что польза от "u", скажем так, специфическая. Но и главная фишка chattr, атрибут "i", как я понял, предназначен именно для того, что бы запретить удалять даже root-у. Не спорю, в некоторых случаях это очень даже нужно и полезно, но не в моём случае.
https://ru.stackoverflow.com/questions/550015/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bf%d1%80%d0%be%d1%87/550017#comment705000_550017
Поэкспериментировал с find + chmod и обнаружил, что указания прав БЕЗ буквы (=r) Ведёт себя не так, как я ожидал. Отсутствие буквы отнюдь не равно a, хотя "=r" эквивалентно "a=r", но "=rwx" даёт вот такой, неожиданный для меня, результат. "-rwxr-xr-x". Теперь буду везде использовать букву "a", например sudo chown -R a=rX,u+w. А свою задачу, я решил используя stickybit вот так. p='/ILYA' && sudo chown -R root:users "$p" && sudo chmod -R a=rX,u+w "$p" && sudo find "$p" -type d -exec chown root {} \; && p='/ILYA' && sudo find "$p" -type d -exec chmod a=trx,ug+w {} \;
https://ru.stackoverflow.com/questions/550015/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bf%d1%80%d0%be%d1%87/550017#comment705001_550017
Подскажите, пожалуйста, как объединить sudo find "$p" -type d -exec chown root {} \; && sudo find "$p" -type d -exec chmod a=trx,ug+w {} \; в одну команду?
https://ru.stackoverflow.com/questions/550015/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bf%d1%80%d0%be%d1%87/550017#comment705028_550017
если у вас появился новый вопрос, задайте его, пожалуйста, с помощью кнопки «задать вопрос» в правом верхнем углу страницы.
https://ru.stackoverflow.com/questions/550015/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d0%bf%d1%80%d0%b5%d1%82%d0%b8%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bd%d1%83%d0%b6%d0%bd%d1%8b%d0%b5-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b-%d0%bd%d0%be-%d1%80%d0%b0%d0%b7%d1%80%d0%b5%d1%88%d0%b8%d1%82%d1%8c-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%b2%d0%b0%d1%82%d1%8c-%d0%b8%d0%b7%d0%bc%d0%b5%d0%bd%d1%8f%d1%82%d1%8c-%d1%83%d0%b4%d0%b0%d0%bb%d1%8f%d1%82%d1%8c-%d0%bf%d1%80%d0%be%d1%87/550017#comment705036_550017
Ну я считаю, это будет довольно мелкий вопрос в рамках отдельного вопроса. Это скорее дополняющий к этому, если это, конечно возможно вообще сделать. Там, скорее всего или так ... -exec chown root {} && chmod a=trx,ug+w {} \; или так ... -exec chown root {} \ && chmod a=trx,ug+w {} \; Хотя вы в любом случае, ответили на мой основной вопрос, точнее навели меня на него, что мне и требовалось. :-) Спасибо вам. :-)
Закрыть X