Как использовать команду chattr в Linux

Опубликовано: 2022-06-28
Терминал Linux на красном фоне ноутбука.
Фатмавати Ачмад Заэнури/Shutterstock

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

Разрешения и атрибуты

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

Существуют разрешения для владельца файла, для группы файла и для других — то есть пользователей, не входящих в первые две категории. Вы можете использовать команду ls с параметром -l (длинный список), чтобы увидеть права доступа к файлу или каталогу.

Как использовать команду chmod в Linux
СВЯЗАННЫЕ Как использовать команду chmod в Linux

Чтобы изменить разрешения, вы используете команду chmod . По крайней мере, вы можете, если у вас есть права на запись в файл или если вы являетесь пользователем root.

Мы видим, что права доступа к файлам ориентированы на пользователя, потому что они предоставляют или удаляют разрешения на уровне пользователя. Напротив, атрибуты файла ориентированы на файловую систему. Как и разрешения, они устанавливаются для файла или каталога. Но как только они установлены, они одинаковы для всех пользователей.

Атрибуты — это отдельная коллекция настроек от разрешений. Атрибуты управляют такими характеристиками, как неизменяемость и другие действия на уровне файловой системы. Чтобы увидеть атрибуты файла или каталога, мы используем команду lsattr . Для установки атрибутов мы используем команду chattr .

Все, что вы хотели знать об инодах в Linux
СВЯЗАННЫЕ Все, что вы хотели знать об инодах в Linux

Разрешения и атрибуты хранятся внутри инодов . Инод — это структура файловой системы, которая содержит информацию об объектах файловой системы, таких как файлы и каталоги. Местоположение файла на жестком диске, дата его создания, разрешения и атрибуты хранятся в его индексном узле.

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

Просмотр атрибутов файла

Команды chattr и lsattr уже присутствуют на вашем компьютере, поэтому ничего устанавливать не нужно.

Чтобы проверить атрибуты файлов в текущем каталоге, используйте lsattr :

 лсатр 

Список атрибутов файла для всех файлов в каталоге

Пунктирные линии — это заполнители для атрибутов, которые не установлены. Единственным установленным атрибутом является атрибут e (extents). Это показывает, что индексные дескрипторы файловой системы используют или будут использовать, если потребуется, экстенты для указания на все части файла на жестком диске.

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

Это список наиболее часто используемых атрибутов.

  • a : только добавление. К файлу с этим атрибутом можно только добавить. В него все еще можно записать, но только в конец файла. Невозможно перезаписать какие-либо существующие данные в файле.
  • c : Сжатый. Файл автоматически сжимается на жестком диске и распаковывается при чтении. Данные, записываемые в файлы, перед записью на жесткий диск сжимаются.
  • О : Нет обновлений atime . atime — это значение в индексном узле, которое записывает время последнего доступа к файлу.
  • C : Без копирования при записи. Если два процесса запрашивают доступ к файлу, им могут быть даны указатели на один и тот же файл. Им предоставляется собственная уникальная копия файла только в том случае, если они пытаются записать в файл, что делает его уникальным для этого процесса.
  • д : Нет дампа. Команда Linux dump используется для записи копий целых файловых систем на резервный носитель. Этот атрибут заставляет dump игнорировать файл. Он исключен из резервной копии.
  • D : Синхронные обновления каталога. Когда этот атрибут включен для каталога, все изменения в этом каталоге записываются синхронно, т. е. немедленно, на жесткий диск. Операции с данными могут быть буферизованы.
  • e : Формат экстента. Атрибут e указывает, что файловая система использует экстенты для сопоставления местоположения файла на жестком диске. Вы не можете изменить это с помощью chattr . Это функция работы файловой системы.
  • я : неизменяемый. Неизменяемый файл нельзя модифицировать, в том числе переименовывать и удалять. Пользователь root — единственный человек, который может устанавливать или сбрасывать этот атрибут.
  • s : Безопасное удаление. Когда файл с этим набором атрибутов удаляется, блоки жесткого диска, содержащие данные файла, перезаписываются байтами, содержащими нули. Обратите внимание, что это не поддерживается файловой системой ext4 .
  • S : Синхронные обновления. Изменения в файле с установленным атрибутом S записываются в файл синхронно.
  • u : удаление файла с установленным атрибутом u приводит к созданию копии файла. Это может быть полезно для восстановления файла, если файл был удален по ошибке.

Изменение атрибутов файла

Команда chattr позволяет нам изменить атрибуты файла или каталога. Мы можем использовать операторы + (установить) и - (сбросить) для применения или удаления атрибута, аналогично команде chmod и разрешениям.

Команда chattr также имеет оператор = (только установка). Это устанавливает атрибуты файла или каталога только для атрибутов, указанных в команде. То есть все атрибуты, не указанные в командной строке, сбрасываются .

Установка атрибута «Только добавление»

Давайте установим атрибут только для добавления в текстовый файл и посмотрим, как это повлияет на то, что мы можем делать с файлом.

 sudo chattr +текстовый файл.txt 

Установка атрибута только добавления в текстовом файле

Мы можем проверить, установлен ли бит только для добавления, используя lsattr :

 lsattr текстовый файл.txt 

Список атрибутов для текстового файла

Буква « a » означает, что атрибут установлен. Попробуем перезаписать файл. Перенаправление вывода в файл с помощью одной угловой скобки « > » заменяет все содержимое в файле перенаправленным выводом.

Мы предварительно загрузили текстовый файл с текстом-заполнителем lorem ipsum .

 текстовый файл кота.txt 

Текст-заполнитель в текстовом файле

Мы перенаправим вывод ls в файл:

 ls -l > текстовый файл.txt
 sudo ls -l > текстовый файл.txt 

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

Операция не разрешена, даже если мы используем команду sudo .

Если мы используем две угловые скобки « >> » для перенаправления вывода, он добавляется к существующим данным в файле. Это должно быть приемлемо для нашего текстового файла только для добавления.

 sudo ls -l >> текстовый файл.txt 

Перенаправление вывода в конец текстового файла

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

 текстовый файл кота.txt 

Изучение содержимого текстового файла

Перенаправленный вывод ls добавлен в конец файла.

Новые данные добавляются в текстовый файл только для добавления

Хотя мы можем добавлять данные в файл, это единственное изменение, которое мы можем в него внести. Мы не можем удалить его и не можем получить root права.

 текстовый файл rm.txt
 sudo rm text-file.txt 

Не удалось удалить текстовый файл только для добавления

Установка неизменяемого атрибута

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

 sudo chattr +i второй файл.txt
 lsattr второй файл.txt 

Установка неизменяемого атрибута в текстовом файле

Мы видим « i », указывающий на то, что неизменяемый атрибут установлен. Сделав наш файл неизменяемым, даже пользователь root не сможет его переименовать ( mv ), удалить ( rm ) или добавить в него данные.

 sudo mv второй файл.txt новое имя.txt
 sudo rm второй файл.txt
 sudo ls -l >> второй файл.txt 

Неизменяемый файл, сопротивляющийся изменению

Не полагайтесь на безопасное удаление на ext4

Как мы уже отмечали, некоторые операционные системы не поддерживают все атрибуты. Атрибут безопасного удаления не поддерживается файловыми системами семейства ext , включая ext4 . Не полагайтесь на это для безопасного удаления файлов.

Легко видеть, что это не работает в ext4 . Мы установим атрибут s (безопасное удаление) для текстового файла.

 sudo chattr +s третий файл.txt 

Установка атрибута безопасного удаления для текстового файла

Что мы собираемся сделать, так это узнать индексный дескриптор, содержащий метаданные об этом файле. Индекс содержит первый блок жесткого диска, занятый файлом. Файл содержит текст-заполнитель lorem ipsum .

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

Мы можем найти индекс файла с помощью команды hdparm с параметром --fibmap (карта файловых блоков).

 sudo hdparm --fibmap третий файл.txt 

Поиск индекса файла

Первый блок жесткого диска — 18100656. Мы воспользуемся командой dd , чтобы прочитать его.

Варианты:

  • if=/dev/sda : чтение с первого жесткого диска на этом компьютере.
  • bs=512 : Используйте размер блока жесткого диска 512 байт.
  • skip=18100656 : пропустить все блоки до блока 18100656. Другими словами, начать чтение с блока 18100656.
  • count=1 : прочитать один блок данных.
 sudo dd if=/dev/sda bs=512 skip=18100656 count=1 

Чтение первого блока жесткого диска файла

Как и ожидалось, мы видим текст-заполнитель lorem ipsum . Мы читаем правильный блок на жестком диске.

Теперь мы удалим файл.

 rm третий файл.txt 

Если мы прочитаем тот же блок жесткого диска, мы все равно сможем увидеть данные.

 sudo dd if=/dev/sda bs=512 skip=18100656 count=1 

Чтение данных с блока жесткого диска, используемого удаленным файлом

Опять же, не полагайтесь на это для безопасного удаления на ext4 . Существуют лучшие методы удаления файлов, чтобы их нельзя было восстановить.

СВЯЗАННЫЕ С: Как безопасно удалить файлы в Linux

Полезно, но с осторожностью

Установка атрибутов файлов может сделать их невосприимчивыми к случайным катастрофам. Если вы не можете удалить или перезаписать файл, это довольно безопасно.

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

СВЯЗАННЫЕ С: Как защитить свой Linux-сервер с помощью fail2ban