Как составить список и управлять атрибутами файлов на Linux (ACL)

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:

В при­ве­ден­ном выше при­ме­ре вид­но, что я вызвал коман­ду в ката­ло­ге HOME.

Из выво­да коман­ды вид­но, что види­мым ката­ло­гам при­сво­ен толь­ко атри­бут thee: это озна­ча­ет, что они исполь­зу­ют “экс­тен­ты” для отоб­ра­же­ния бло­ков на дис­ке (это свя­за­но с тем, как рабо­та­ет фай­ло­вая систе­ма ext4).

Как види­те, скры­тые фай­лы по умол­ча­нию не вклю­ча­ют­ся в вывод; что­бы вклю­чить их, мы можем пере­дать коман­де пара­метр -a.

Мы так­же можем пере­чис­лить атри­бу­ты ката­ло­га рекур­сив­но, исполь­зуя опцию -R, или пере­чис­лить атри­бу­ты ката­ло­га вме­сто его содер­жи­мо­го, исполь­зуя -d.

Дру­гой полез­ной опци­ей явля­ет­ся -l, кото­рая исполь­зу­ет­ся для отоб­ра­же­ния пол­но­го име­ни атри­бу­тов, свя­зан­ных с фай­ла­ми, вме­сто одной бук­вы, иден­ти­фи­ци­ру­ю­щей их:

Зна­че­ние раз­лич­ных атри­бу­тов мож­но най­ти в руко­вод­стве к ути­ли­те chattr, кото­рая, как мы уви­дим в бли­жай­шее вре­мя, исполь­зу­ет­ся для уста­нов­ки или уда­ле­ния атрибутов.

Здесь мы при­ве­дем лишь неко­то­рые из них (неко­то­рые атри­бу­ты могут быть уста­нов­ле­ны толь­ко на опре­де­лен­ных фай­ло­вых систе­мах – “j”, напри­мер, не может быть уста­нов­лен на фай­ло­вой систе­ме ext2, кото­рая не име­ет логирования):

Атри­бут Исполь­зо­ва­ние
a Если файл име­ет атри­бут a, содер­жи­мое может быть толь­ко добав­ле­но к нему.
c Файл с атри­бу­том c про­зрач­но сжи­ма­ет­ся ядром при запи­си и рас­па­ко­вы­ва­ет­ся при чтении.
i Файл с атри­бу­том i не может быть изме­нен, уда­лен или пере­име­но­ван (неиз­ме­ня­е­мый).
s Файл с атри­бу­том s авто­ма­ти­че­ски обну­ля­ет­ся при удалении.
j Файл с уста­нов­лен­ным атри­бу­том j запи­сы­ва­ет дан­ные в жур­нал фай­ло­вой систе­мы до фак­ти­че­ской записи.

Установка и удаление атрибутов

Ути­ли­та, кото­рую мы исполь­зу­ем для назна­че­ния атри­бу­тов, – это chattr; ее син­так­сис доволь­но прост: что­бы назна­чить атри­бут фай­лу, мы исполь­зу­ем знак +, за кото­рым сле­ду­ет бук­ва атри­бу­та, и пере­да­ем путь к фай­лу (фай­лам), кото­ро­му дол­жен быть назна­чен атри­бут, в каче­стве аргу­мен­та команды.

Рас­смот­рим пример.

Пред­по­ло­жим, у нас есть файл (допу­стим, он назы­ва­ет­ся example.txt), и мы хотим при­сво­ить ему атри­бут a, что­бы избе­жать пере­за­пи­си его содер­жи­мо­го. Вот коман­да, кото­рую мы долж­ны выполнить:

sudo chattr +a example.txt

Вы може­те заме­тить, что мы при­пи­са­ли к коман­де sudo, посколь­ку боль­шин­ство атри­бу­тов могут быть назна­че­ны или уда­ле­ны толь­ко поль­зо­ва­те­лем root.

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

 

lsattr -l example.txt
example.it                   Append_Only, Extents
Теперь, если мы попы­та­ем­ся запи­сать, что­бы пере­за­пи­сать файл, исполь­зуя опе­ра­тор пере­на­прав­ле­ния >  на shell, мы полу­чим ошибку:

Если вме­сто это­го мы исполь­зу­ем опе­ра­тор пере­на­прав­ле­ния >>, кото­рый дела­ет так, что содер­жи­мое добав­ля­ет­ся в файл, оши­бок не возникает:

echo "line" >> example.txt

Вот еще один пример.

Атри­бут i может быть исполь­зо­ван для того, что­бы сде­лать файл неиз­ме­ня­е­мым и невоз­мож­ным для уда­ле­ния или пере­ме­ще­ния даже поль­зо­ва­те­лем root (кото­рый, одна­ко, может уда­лить атри­бут вообще):

sudo chattr +i example.txt
sudo rm example.txt
rm: cannot remove 'example.txt': Operation not permitted

Удаление атрибутов

Что­бы уда­лить один или несколь­ко атри­бу­тов из фай­лов, доста­точ­но изме­нить “опе­ра­тор”, кото­рый мы исполь­зу­ем в chattr.

Вме­сто + мы используем -.

Что­бы уда­лить из фай­ла “example.txt” атри­бу­ты i и a, кото­рые мы зада­ли в преды­ду­щем при­ме­ре, выпол­ни­те сле­ду­ю­щие действия:

sudo chattr -ai example.txt
В неко­то­рых слу­ча­ях мы хотим при­ме­нить “обрат­ную” логи­ку и, по сути, ска­зать: “уда­лить все атри­бу­ты, кро­ме ука­зан­ных”: для при­ме­не­ния этой стра­те­гии мы можем исполь­зо­вать оператор =.