Linux запретить удалять файл

«Защита от дурака» или как запретить изменение/удаление важных папок и файлов

chattr (Change Attribute) — это утилита командной строки в linux, которая используется для установки/снятия специальных атрибутов файлов для предотвращения случайной модификации и удаления файлов или директорий, даже если вы авторизованы как root.

Нативные файловые системы в Linux, такие как ext2, ext3, ext4, btrfs, поддерживают все флаги для файлов. Никто не сможет удалить или модифицировать файл/директорию, защищенный атрибутами, установленными с помощью команды chattr, даже имея полный доступ ко всем операциям с файлом. Очень полезно защитить атрибутами такие файлы , как passwd и shadow, содержащие информацию о пользователе.

# chattr [operator] [flags] [filename]

Атрибуты и флаги

Ниже приведен список часто используемых атрибутов и соответствующих флагов, которые согут быть установлены с помощью команды chattr.
1. Если обращаются к файлу с установленным атрибутом «А», его запись atime не обновляется.
2. Если модифицируется файл с установленным атрибутом «S», изменения синхронизируются с диском.
3. Если установлен атрибут «a», файл может быть открыт для записи только в режиме добавления текста.
4. Если установлен атрибут «i», файл нельзя модифицировать (immutable). Это значит нельзя переименовывать, создавать символьные ссылки, исполнять и записывать, снять этот втрибут может только суперпользователь.
5. Если установлен атрибут «j», то при модификации файла сначала будет обновлена информация о файле в журнале ext3, а затем уже сам файл.
6. Если установлен атрибут «t», файл нельзя объединять с другими файлами.
7. Файл с атрибутом «d» не будет являться кандидатом для резервного копирования при запуске процесса dump.
8. При удалении файла с атрибутом «u» его данные сохраняются, и пользователь сможет восстановить его.

Операторы

+ : добавляет атрибут к существующим у файла атрибутам.
— : удаляет атрибут файла.
= : оставляет существующие у файла атрибуты.

Теперь мы продемонстрируем вам несколько примеров применения команды chattr.

1. Как защитить файл от удаления

Для демонстрационных целей мы будем использовать директорию demo и файл important_file.conf. Сначала посмотрим, какие атрибуты у них установлены, с помощью команды ls -l. Как можно видеть ниже пока никаких атрибутов нет.

[[email protected] tecmint]# ls -l total 0 drwxr-xr-x. 2 root root 6 Aug 31 18:02 demo -rwxrwxrwx. 1 root root 0 Aug 31 17:42 important_file.conf

Для установки атрибута мы используем оператор +, для снятия — оператор -. Давайте защитим файл от удаления кем бы то ни было, даже суперпользователем.

[[email protected] tecmint]# chattr +i demo/ [[email protected] tecmint]# chattr +i important_file.conf

Замечание: Бит +i может быть установлен только суперпользователем, либо пользователем с привилегиями sudo.
Давайте проверим установленные атрибуты с помощью команды ‘lsattr’.

[[email protected] tecmint]# lsattr ----i----------- ./demo ----i----------- ./important_file.conf

Теперь, попытавшись удалить, переименовать или изменить права доступа к файлу, вы увидите сообщение: «Operation not permitted».

[[email protected] tecmint]# rm -rf demo/ rm: cannot remove demo/: Operation not permitted [[email protected] tecmint]# mv demo/ demo_alter mv: cannot move demo/ to demo_alter: Operation not permitted [[email protected] tecmint]# chmod 755 important_file.conf chmod: changing permissions of important_file.conf: Operation not permitted

2. Как снять атрибут с файла

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

[[email protected] tecmint]# chattr -i demo/ important_file.conf

Теперь снова проверим наличие атрибутов с помощью команды ‘lsattr’.

[[email protected] tecmint]# lsattr ---------------- ./demo ---------------- ./important_file.conf

Флаг ‘-i’ удален, поэтому мы спокойно можем удалить файлы и директории.

[[email protected] tecmint]# rm -rf * [[email protected] tecmint]# ls -l total 0

3. Как защитить файлы /etc/passwd и /etc/shadow

Предотвратив модификацию файлов /etc/passwd или /etc/shadow, мы защитим их от случайного удаления или подмены, а также отключим создание пользовательских аккаунтов.

[[email protected] tecmint]# chattr +i /etc/passwd [[email protected] tecmint]# chattr +i /etc/shadow

Теперь попробуем создать создать нового пользователя, и получаем сообщение об ошибке ‘cannot open /etc/passwd’.

[[email protected] tecmint]# useradd tecmint useradd: cannot open /etc/passwd

Таким образом вы можете защитить важные файлы от удаления.

Читайте также:  Установка даты линукс date

4. Добавление данных в файл без изменения уже существующих

Если вы хотите разрешить только добавление данных файл, без редактирования уже существующих данных, это можно сделать с помощью установки атрибута ‘a’:

[[email protected] tecmint]# chattr +a example.txt [[email protected] tecmint]# lsattr example.txt -----a---------- example.txt

Теперь файл можно открыть на запись только в режиме добавления данных. Попробовав заменить существующее содержимое файла example.txt, вы увидите сообщение об ошибке ‘Operation not permitted’:

[[email protected] tecmint]# echo "replace contain on file." > example.txt -bash: example.txt: Operation not permitted

Попытаемся добавить в файл новый контент и проверить результат:

[[email protected] tecmint]# echo "replace contain on file." >> example.txt [[email protected] tecmint]# cat example.txt Here is the example to test 'a' attribute mean append only. replace contain on file.

5. Как защищать директории

Для защиты всей директории вместе с содержащимися в ней файлами используется флаг ‘-R’ (рекурсия) вместе с ‘+i’.

[[email protected] tecmint]# chattr -R +i myfolder

После рекурсивной установки атрибута попробуем удалить директорию вместе со всеми файлами:

[[email protected] tecmint]# rm -rf myfolder/ rm: cannot remove 'myfolder/': Operation not permitted

12211 2 0 cookie-check «Защита от дурака» или как запретить изменение/удаление важных папок и файлов no

Источник

«Защита от дурака» или как запретить изменение/удаление важных папок

Исторически так сложилось, что для своих мелких проектов держу виртуалку. Однако, так как я не использую ее ресурсы на 100%, решил не жадничать и пустил похоститься несколько друзей. Сайтов не много, деньги за хостинг не беру, поэтому ставить что-то вроде cpanel счел перебором. К тому же я их тех, кто предпочитает настраивать все вручную. Структуру выбрал следующую:

/home/hostuser/vhosts/sitename.ru/

И тут возник вопрос: как запретить пользователю удалять/переименовывать папки в sitename.ru? Если будет отсутствовать папка web, то и apache и nginx выдадут предупреждение, но все-равно загрузятся. Но если удалить/переместит папку logs, то и apache и nginx не запустятся из-за ошибки (по мне довольно странное поведение). Папка hostuser полностью принадлежит данному пользователю и его личной группе (hostuser:hostuser), а это означает, что при желании он сможет удалить любую внутреннюю папку/файл, даже если она будет принадлежать суперпользователю. Так как же запретить удаление/перемещение, чтобы пользователь (случайно или специально) не сломать весь хостинг?

Читайте также:  Delete folder and file in linux

После недолгого гугления решение было найдено. По мимо стандартных разрешений и acl, в файловых системах типа ext2, ext3, ext4 для файла можно выставлять дополнительные атрибуты. Подробней о всех атрибутах прочитать на Wiki, либо man chattr. Нас же интересует атрибут immutable. Данный атрибут для файла или папки может выставить только суперпользователь. Если назначит атрибут immutable на файл, то данный файл нельзя будет изменить или удалить (причем даже суперпользователь это не сможет сделать, пока не уберет данный атрибут). Если назначит атрибут immutable на папку, то данную папку нельзя будет удалить, а так же нельзя будет изменить структуру внутри нее. Тем самым получается, что если нам нужно защитить папку sitename.ru и структуру внутри нее, нам необходимо выполнить простую команду:

chattr +i /home/hostuser/vhosts/sitename.ru 

Для снятия атрибута необходимо использовать флаг -i.

Если же нужно защитить только одну папку (например, logs), можно поступить следующим образом:

touch /home/hostuser/vhosts/sitename.ru/logs/.keep chattr +i /home/hostuser/vhosts/sitename.ru/logs/.keep 

Собственно так можно поставить «защиту от дурака» (даже с правами суперпользователя).

Важно понимать, данная статья не об информационной безопасности. Замок на почтовом ящике — это информационная безопасность. Стекло на кнопке пожарной сигнализации — это защита от дурака.
Если создать файл .keep и дать ему атрибут -i, саму папку можно перенести и файл можно перенести. Нельзя удалить сам файл и структуру папок до этого файла.
Если вам требуется более надежный уровень безопасности, используйте атрибут immutable совместно с mount —bind. С помощью этой связки можно настроить защиту от намеренного изменения структуры.

Источник

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

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

/ILYA/Music/W.A.S.P/1984 - W.A.S.P/01 - I wanna be somebody.flac 
p='/ILYA' && sudo chown -R root:root "$p" && sudo chmod -R =r,u+w,+X "$p" && chown user "$p" 
p='/ILYA' && sudo chown -R root:root "$p" && sudo chmod -R =r,u+w,+X,+t "$p" && chown user "$p" 

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

Читайте также:  Syslog сервер linux настройка

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

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

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

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

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

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

Источник

запрет удаления файла

Есть каталог, в нем файлы. Хочется ТОЛЬКО для одного из них запретить удаление любому юзеру. Остальные файлы могут и даже должны создаваться/удаляться. Можно ли такое сделать? (без ACL, только обычный chmod)

Re: запрет удаления файла

Re: запрет удаления файла

Для каталога — разрешаешь всё!
Для файла — назначаешь группу, членами которой являются люди, которые могут читать файл, ставишь им право на чтение (chmod 740 file).
Всё, они смогут этот ФАЙЛ только читать, а с остальными делать всё, что хотят!

Re: Re: запрет удаления файла

по-моему chmod на файл не катит, ибо удаление — это действие с каталогом.

Re: Re: запрет удаления файла

chattr это хорошо, но не переносимо 🙁 Я забыл упомянуть, что у мя FreeBSD и соответственно ufs, а chattr — это для Linux ext* вроде. Посему и спросил как это стандартными средствами сделать.

Re: Re: Re: запрет удаления файла

chmod o+t file ; chown root file — может помочь.

Ошибся.

Re: Ошибся.

может быть chmod o+t `dirname/file` ??

Re: Re: Ошибся.

Тебе уже несколько раз сказали — группу файла измени! Мы всем отделом эксперементировали, только что!

Re: но это не помогает!

The ‘sticky’ bit (S_ISVTX) on a directory means that a file in that directory can be renamed or deleted only by the owner of the file, by the owner of the directory, and by root.

POSIX and X/OPEN do not document the sticky bit.

Re: Re: Re: Ошибся.

UVV, при чем здесь группа файла, удаление — это операция с объектом файловой системы «каталог» и разрешения на файл могут быть никакими.

Попробуйте — вот файл ваще рутовский и никому ничо не разрешено

bash-2.05$ ls -l total 0 ———- 1 root wheel 0 Dec 10 18:33 RootFile bash-2.05$ rm -f RootFile bash-2.05$ ls bash-2.05$

Re: Re: но это не помогает!

в принципе sticky как раз и сработал, забыл я о нем.

Источник

Оцените статью
Adblock
detector