Как использовать команду chattr в Linux
Наряду с обычными разрешениями на чтение, запись и выполнение файлы Linux имеют еще один набор атрибутов, управляющих другими характеристиками файла. Вот как их увидеть и изменить.
Разрешения и атрибуты
В Linux доступ к файлу и действия с ним определяются пользовательским набором разрешений. Независимо от того, можете ли вы читать содержимое файла, записывать новые данные в файл или выполнять файл, если это сценарий или программа, все регулируется этим набором разрешений. Разрешения применяются к файлу, но определяют ограничения и возможности для разных категорий пользователей.
Существуют разрешения для владельца файла, для группы файла и для других, то есть пользователей, не входящих в первые две категории. Вы можете использовать команду ls с параметром -l (длинный список), чтобы увидеть права доступа к файлу или каталогу.
Чтобы изменить разрешения, используйте команду chmod . По крайней мере, вы можете, если у вас есть права на запись в файл или если вы являетесь пользователем root.
Мы видим, что права доступа к файлам ориентированы на пользователя, потому что они предоставляют или удаляют разрешения на уровне пользователя. Напротив, атрибуты файла ориентированы на файловую систему. Как и разрешения, они устанавливаются для файла или каталога. Но как только они установлены, они одинаковы для всех пользователей.
Атрибуты — это отдельная коллекция настроек от разрешений. Атрибуты управляют такими характеристиками, как неизменяемость и другие действия на уровне файловой системы. Чтобы увидеть атрибуты файла или каталога, мы используем команду lsattr . Для установки атрибутов мы используем команду chattr .
Разрешения и атрибуты хранятся внутри inodes. Индексный дескриптор – это структура файловой системы, в которой хранится информация об объектах файловой системы, таких как файлы и каталоги. Расположение файла на жестком диске, дата его создания, разрешения и атрибуты хранятся в его индексном узле.
Поскольку разные файловые системы имеют разные базовые структуры и возможности, некоторые файловые системы могут вести себя по-разному или полностью игнорировать атрибуты. В этой статье мы используем ext4 – файловую систему по умолчанию для многих дистрибутивов Linux.
Просмотр атрибутов файла
Команды chattr и lsattr уже присутствуют на вашем компьютере, поэтому ничего устанавливать не нужно.
Чтобы проверить атрибуты файлов в текущем каталоге, используйте lsattr :
Пунктирные линии — это заполнители для атрибутов, которые не установлены. Единственным установленным атрибутом является атрибут e (extents). Это показывает, что индексные дескрипторы файловой системы используют или будут использовать, если потребуется, экстенты для указания на все части файла на жестком диске.
Если файл хранится в одной непрерывной последовательности блоков жесткого диска, его индексный дескриптор должен записывать только первый и последний блоки, используемые для хранения файла. Если файл фрагментирован, индексный дескриптор должен записать номер первого и последнего блока каждой части файла. Эти пары номеров блоков жесткого диска называются экстентами.
Это список наиболее часто используемых атрибутов.
- a: только добавление. К файлу с этим атрибутом можно только добавить. В него все еще можно записать, но только в конец файла. Невозможно перезаписать существующие данные в файле.
- c: сжато. Файл автоматически сжимается на жестком диске и распаковывается при чтении. Данные, записываемые в файлы, перед записью на жесткий диск сжимаются.
- A: обновлений atime нет. atime – это значение в индексном узле, которое записывает время последнего доступа к файлу.
- C: без копирования при записи. Если два процесса запрашивают доступ к файлу, им могут быть даны указатели на один и тот же файл. Им предоставляется собственная уникальная копия файла, только если они пытаются записать в файл, что делает его уникальным для этого процесса.
- d: нет дампа. Команда Linux dump используется для записи копий целых файловых систем на резервный носитель. Этот атрибут заставляет dump игнорировать файл. Он исключен из резервной копии.
- D: синхронные обновления каталога. Когда этот атрибут включен для каталога, все изменения в этом каталоге записываются синхронно, т. е. немедленно, на жесткий диск. Операции с данными можно буферизовать.
- e: формат экстента. Атрибут e указывает, что файловая система использует экстенты для сопоставления местоположения файла на жестком диске. Вы не можете изменить это с помощью chattr . Это функция работы файловой системы.
- i: неизменяемый. Неизменяемый файл нельзя изменить, в том числе переименовать и удалить. Только пользователь root может устанавливать или сбрасывать этот атрибут.
- s: безопасное удаление. Когда файл с этим набором атрибутов удаляется, блоки жесткого диска, содержащие данные файла, перезаписываются байтами, содержащими нули. Обратите внимание, что это не поддерживается файловой системой ext4 .
- S: синхронные обновления. Изменения в файле с установленным атрибутом S записываются в файл синхронно.
- u: удаление файла с установленным атрибутом u приводит к созданию копии файла. Это может быть полезно для восстановления файла, если файл был удален по ошибке.
Изменение атрибутов файла
Команда chattr позволяет нам изменить атрибуты файла или каталога. Мы можем использовать операторы + (установить) и — (не установить) для применения или удаления атрибута, подобно команде chmod и разрешениям.
Команда chattr также содержит оператор = (только установка). Это устанавливает атрибуты файла или каталога только для атрибутов, указанных в команде. То есть все атрибуты, не указанные в командной строке, не заданы.
Установка атрибута «Только добавление»
Давайте установим атрибут только для добавления в текстовый файл и посмотрим, как это повлияет на то, что мы можем делать с файлом.
sudo chattr +a text-file.txt
Мы можем проверить, установлен ли бит только для добавления, используя lsattr :
Буква « a » означает, что атрибут установлен. Попробуем перезаписать файл. При перенаправлении вывода в файл с помощью одной угловой скобки « > » все содержимое файла заменяется перенаправленным выводом.
Мы предварительно загрузили текстовый файл с текстом-заполнителем lorem ipsum.
Мы перенаправим вывод из ls в файл:
Операция не разрешена, даже если мы используем команду sudo .
Если мы используем две угловые скобки « >> » для перенаправления вывода, они добавляются к существующим данным в файле. Это должно быть приемлемо для нашего текстового файла только для добавления.
Мы вернулись в командную строку без каких-либо сообщений об ошибках. Давайте заглянем внутрь файла, чтобы увидеть, что произошло.
Перенаправленный вывод из ls добавлен в конец файла.
Хотя мы можем добавлять данные в файл, это единственное изменение, которое мы можем в него внести. Мы не можем удалить его и не можем получить root права.
Установка неизменяемого атрибута
Если вы хотите защитить файл, в который никогда не будут добавляться новые данные, вы можете установить неизменяемый атрибут. Это предотвращает все изменения в файле, включая добавление данных.
sudo chattr +i second-file.txt
Мы видим « i », указывающий на то, что неизменяемый атрибут установлен. Сделав наш файл неизменяемым, даже пользователь root не сможет его переименовать ( mv ), удалить ( rm ) или добавить в него данные.
sudo mv second-file.txt new-name.txt
Не полагайтесь на безопасное удаление на ext4
Как мы уже отмечали, некоторые операционные системы не поддерживают все атрибуты. Атрибут безопасного удаления не поддерживается семейством файловых систем ext , включая ext4 . Не полагайтесь на это для безопасного удаления файлов.
Легко заметить, что это не работает в ext4 . Мы установим атрибут s (безопасное удаление) в текстовом файле.
sudo chattr +s third-file.txt
Что мы собираемся сделать, так это узнать индексный дескриптор, содержащий метаданные об этом файле. Индекс содержит первый блок жесткого диска, занятый файлом. Файл содержит текст-заполнитель lorem ipsum.
Мы прочитаем этот блок непосредственно с жесткого диска, чтобы убедиться, что мы читаем правильное расположение на жестком диске. Мы удалим файл, а затем еще раз прочитаем тот же жесткий блок погружения. Если атрибут безопасного удаления соблюдается, мы должны читать обнуленные байты.
Мы можем найти индекс файла с помощью команды hdparm с опцией —fibmap (карта файловых блоков).
sudo hdparm --fibmap third-file.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. Мы читаем правильный блок на жестком диске.
Если мы прочитаем тот же блок жесткого диска, мы все равно сможем увидеть данные.
sudo dd if=/dev/sda bs=512 skip=18100656 count=1
Опять же, не полагайтесь на это для безопасного удаления в ext4 . Существуют более эффективные методы удаления файлов, чтобы их нельзя было восстановить.
Полезно, но с осторожностью
Установка атрибутов файлов может сделать их невосприимчивыми к случайным катастрофам. Если вы не можете удалить или перезаписать файл, это довольно безопасно.
Вы можете подумать, что хотели бы применить их к системным файлам и сделать вашу установку Linux более безопасной. Но системные файлы необходимо периодически заменять по мере выпуска обновлений или применения обновлений. По этой причине безопаснее всего использовать эти атрибуты только для файлов, созданных вами.
Команда chattr: управляем атрибутами файлов
Chattr (Change Attribute) – команда в Linux, которая изменяет атрибуты файлов. Изначально применялась только в ext2, ext3, ext4, но сегодня может использоваться и в других файловых системах, например, XFS, ReiserFS, Btrfs и других.
Синтаксис команды
chattr [ -RV ] [ -v версия ] [ атрибуты ] файл/директория-R – рекурсивное изменение атрибутов каталогов и их содержимого, игнорирование символических ссылок во время рекурсии;
-v version – вывод версии и номера сборки файловой системы;
-V – вывод версии программы;
-d – показ данных по всем атрибутам для всех каталогах;
-а – вывод атрибутов для всех файлов.
а – разрешается добавлять информацию в файл или каталог, но изменять или удалять ее нельзя;
с – автоматическое сжатие файла при записи на диск;
D – синхронное обновление каталогов;
d – если запущена утилита dump, не выполняется бэкап для файла;
i – файлу присваивается статус неизменяемого;
j – все данные файла перед записью сохраняются в системный журнал;
s – обнуление блоков файла;
u – содержимое файла сохраняется даже при его удалении.
Присвоение файлу/каталогу статус неизменяемого
Например, мы хотим присвоить файлу /etc/passwd статус неизменяемого
Теперь внести правки, перезаписать или удалить этот файл не может даже суперпользователь. Любые манипуляции с правами файла можно делать только после отключения атрибута.
Чтобы посмотреть, установился ли наш атрибут, используем команду lsattr
Чтобы удалить этот атрибут, пишем команду
Проверяем, действительно ли мы отменили атрибут, снова прописывая команду
Должно получиться примерно вот так
Добавление данных в файл без изменения содержимого
Если мы хотим разрешить каждому добавлять информацию в файл без изменения уже введенных данных, используем ключ a. Пишем
Теперь попробуем внести изменения в содержимое файла file2.txt
Добавим содержимое файла file1.txt в файл file2.txt
# echo "replace contain on file1.txt" > file2.txtПолучаем сообщение о том, что это действие запрещено.
-bash: file2.txt: Operation not permittedОбеспечение безопасности каталогов
Чтобы присвоить каталогу статус неизменяемого, мы используем опцию –R с атрибутом +i и указываем имя каталога.
Теперь попробуем удалить каталог вместе с содержимым
rm: cannot remove ‘mydir1’: Operation not permittedОтменяем запрет при помощи атрибута -i
Мы рассмотрели основные примеры использования этой команды. На самом деле, ее возможности далеко превосходят описанные нами в статье. Хотите знать и уметь больше? Записывайтесь на наши авторские курсы Linux!
06 Жовтня Автор: Text Writer