- «Защита от дурака» или как запретить изменение/удаление важных папок и файлов
- Атрибуты и флаги
- Операторы
- 1. Как защитить файл от удаления
- 2. Как снять атрибут с файла
- 3. Как защитить файлы /etc/passwd и /etc/shadow
- 4. Добавление данных в файл без изменения уже существующих
- 5. Как защищать директории
- sticky бит
- sticky бит, запрет удаления файла в Linux системах
- Пример добавления sticky бита
- «Защита от дурака» или как запретить изменение/удаление важных папок
- Как запретить удалять нужные файлы, но разрешить создавать/изменять/удалять прочие файлы?
«Защита от дурака» или как запретить изменение/удаление важных папок и файлов
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
Таким образом вы можете защитить важные файлы от удаления.
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
sticky бит
sticky-бит позволяет защитить нужные файлы от удаления другими пользователями, в случаях когда пользователи до установки специального бита имеют право на удаление.
Это дополнительная опция настройки прав доступа к файлам в Linux, sticky даёт возможности и расширяет возможности, которые при настройке уровня доступа представляют утилиты chmod и chown.
sticky бит, запрет удаления файла в Linux системах
Установить бит на файл или каталог можно при помощь chmod
Во втором случае сохранятся существующие атрибуты, в первом — они перезапишутся стандартными 644.
sticky запрещает удаление файла всем кроме его владельца и суперпользователя. Другие пользователи системы, даже если они входят в группу владельца, удалить файл не смогут.
Если бит установить на каталог — аналогичные правила будут распространяться на все его содержимое.
sticky устанавливается владельцем файла, им же снимается. Бит остается до снятия или до удаления файла, для которого он добавлен.
Установленный бит защитит файл в том числе от действий суперпользователя. root не сможет удалить файл, но сможет снять запрещающий это действие бит.
Пример добавления sticky бита
Создаёт тестовый файл, для которого будем выставлять и проверять права доступа.
При создании файл получает стандартные для Linux систем права доступа:
Владелец файла и группа владельца — admin, для владельца и группы есть доступ на чтение файла и на запись в него. Для всех остальных пользователей есть право на чтение файла.
Существующие права характеризуются значением 664 для утилиты chmod:
rw: read (4) + write (2) r: read (4)
Добавляем специальный бит
Права позволяют всем из группы пользователя писать в файл или удалять его.
-rw-rw-r-T 1 admin admin 0 Mar 23 16:55 /tmp/test
Переключимся на пользователя root
Затем добавим пользователя backup в группу admin
Теперь став пользователем backup попробуем удалить файл
rm: cannot remove ‘test’: Operation not permitted
От имени суперпользователя удаляем sticky бит
Теперь файл можно будет удалить.
Читайте про suid/suid и наследование процессом прав доступа, а также про добавление пользователей в группу sudo и настройку возможности выполнения команд с правами суперпользователя без запроса пароля.
«Защита от дурака» или как запретить изменение/удаление важных папок
Исторически так сложилось, что для своих мелких проектов держу виртуалку. Однако, так как я не использую ее ресурсы на 100%, решил не жадничать и пустил похоститься несколько друзей. Сайтов не много, деньги за хостинг не беру, поэтому ставить что-то вроде cpanel счел перебором. К тому же я их тех, кто предпочитает настраивать все вручную. Структуру выбрал следующую:
/home/hostuser/vhosts/sitename.ru/
И тут возник вопрос: как запретить пользователю удалять/переименовывать папки в sitename.ru? Если будет отсутствовать папка web, то и apache и nginx выдадут предупреждение, но все-равно загрузятся. Но если удалить/переместит папку logs, то и apache и nginx не запустятся из-за ошибки (по мне довольно странное поведение). Папка hostuser полностью принадлежит данному пользователю и его личной группе (hostuser:hostuser), а это означает, что при желании он сможет удалить любую внутреннюю папку/файл, даже если она будет принадлежать суперпользователю. Так как же запретить удаление/перемещение, чтобы пользователь (случайно или специально) не сломать весь хостинг?
После недолгого гугления решение было найдено. По мимо стандартных разрешений и 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"
Но это вообще ничего не изменило.
Подскажите, как решить эту задачу, или что я недосмотрел, или, хотя бы, куда мне копать?
Основная моя ошибка была в том, что я считал атрибуты 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, обратной командой.