Thank you for reading this post, don't forget to subscribe!
При использовании Linux у нас есть много способов управления доступом к ресурсам: самый основной – это установка соответствующих прав UGO/RWX на файлы и каталоги.
В некоторых случаях мы также можем использовать setuid, setgid и sticky bit.
Кроме того, мы можем использовать ACL (список контроля доступа) для достижения более высокого уровня детализации или реализовать обязательный контроль доступа, например, на основе SELinux или AppArmor.
Вывод списка атрибутов файлов
Для составления списка атрибутов файлов в Linux можно воспользоваться утилитой lsattr, которая входит в пакет e2fsprogs наиболее распространенных дистрибутивов Linux (несмотря на название, ее можно использовать и в файловых системах, отличных от ext2/3/4, например, xfs).
Утилита принимает в качестве аргументов один или несколько файлов и поддерживает ряд опций для изменения своего поведения.
Рассмотрим пример ее использования.
Когда lsattr вызывается без каких-либо аргументов или опций, она возвращает список атрибутов, связанных с файлами и каталогами, содержащимися в рабочем каталоге, точно так же, как это делает команда ls:
1 2 3 4 5 6 7 8 9 10 |
lsattr --------------e------- ./Templates --------------e------- ./Downloads --------------e------- ./Projects --------------e------- ./Documents --------------e------- ./Desktop --------------e------- ./Music --------------e------- ./Public --------------e------- ./Videos --------------e------- ./Pictures |
В приведенном выше примере видно, что я вызвал команду в каталоге HOME.
Из вывода команды видно, что видимым каталогам присвоен только атрибут thee: это означает, что они используют “экстенты” для отображения блоков на диске (это связано с тем, как работает файловая система ext4).
Как видите, скрытые файлы по умолчанию не включаются в вывод; чтобы включить их, мы можем передать команде параметр -a.
Мы также можем перечислить атрибуты каталога рекурсивно, используя опцию -R, или перечислить атрибуты каталога вместо его содержимого, используя -d.
Другой полезной опцией является -l, которая используется для отображения полного имени атрибутов, связанных с файлами, вместо одной буквы, идентифицирующей их:
1 2 3 4 5 6 7 8 9 10 |
lsattr -l ./Templates Extents ./Downloads Extents ./Projects Extents ./Documents Extents ./Desktop Extents ./Music Extents ./Public Extents ./Videos Extents ./Pictures Extents |
Значение различных атрибутов можно найти в руководстве к утилите chattr, которая, как мы увидим в ближайшее время, используется для установки или удаления атрибутов.
Здесь мы приведем лишь некоторые из них (некоторые атрибуты могут быть установлены только на определенных файловых системах – “j”, например, не может быть установлен на файловой системе ext2, которая не имеет логирования):
Атрибут | Использование |
a | Если файл имеет атрибут a, содержимое может быть только добавлено к нему. |
c | Файл с атрибутом c прозрачно сжимается ядром при записи и распаковывается при чтении. |
i | Файл с атрибутом i не может быть изменен, удален или переименован (неизменяемый). |
s | Файл с атрибутом s автоматически обнуляется при удалении. |
j | Файл с установленным атрибутом j записывает данные в журнал файловой системы до фактической записи. |
Установка и удаление атрибутов
Утилита, которую мы используем для назначения атрибутов, – это chattr; ее синтаксис довольно прост: чтобы назначить атрибут файлу, мы используем знак +, за которым следует буква атрибута, и передаем путь к файлу (файлам), которому должен быть назначен атрибут, в качестве аргумента команды.
Рассмотрим пример.
Предположим, у нас есть файл (допустим, он называется example.txt), и мы хотим присвоить ему атрибут a, чтобы избежать перезаписи его содержимого. Вот команда, которую мы должны выполнить:
Вы можете заметить, что мы приписали к команде sudo, поскольку большинство атрибутов могут быть назначены или удалены только пользователем root.
Мы можем проверить, что атрибут был присвоен файлу, используя команду lsattr:
1 2 |
echo "line" > example.txt bash: example.txt: Operation not permitted |
Если вместо этого мы используем оператор перенаправления >>, который делает так, что содержимое добавляется в файл, ошибок не возникает:
Вот еще один пример.
Атрибут i может быть использован для того, чтобы сделать файл неизменяемым и невозможным для удаления или перемещения даже пользователем root (который, однако, может удалить атрибут вообще):
Удаление атрибутов
Чтобы удалить один или несколько атрибутов из файлов, достаточно изменить “оператор”, который мы используем в chattr.
Вместо + мы используем -.
Чтобы удалить из файла “example.txt” атрибуты i и a, которые мы задали в предыдущем примере, выполните следующие действия: