Контрол върху правата на файловете и директориите с помощта на acl

От известно време насам всички разпространени файлови системи в Линукс поддържат разширените свойства за контрол над правата, известни като ACLs (Access Control Lists) или "Списъци за контрол на достъпа". Въпросните разширения са базирани на стандарта POSIX 1003.1e. Накратко ще обясним какъв е техният смисъл. Както всеки от вас знае, т. нар. Unix permissions или просто стандартните права в една Unix/Linux-система са организирани съвсем просто: те се дефинират по собственик, група и останали потребители. В голяма част от случаите тази организация е достатъчна. Когато имаме усложнени нужди обаче, тя се оказва неудобна. Представете си, че имате директория, която може да се чете само от собственика и на която сме дали chmod 700. Искате да разрешите на друг да влиза в нея. Тогава правите нова група, в която включвате двамата потребители и променяте правата на директорията така, че освен от собственика да може да се чете и от групата, което става с командата chmod 750. Чудесно. А ако искате да направите същото и с други директории и други потребители? Трябва да създавате нови групи и така докато стигнете до момент, в който вече просто изпускате нишката. Ето тук на помощ идват "Списъците за контрол на достъпа". С тях можем лесно да делегираме разнообразни права на всеки върху всичко, без да пипаме нито потребителите, нито групите, нито да променяме стандартните Unix permissions на директорията/файла, т.е. без да си играем с команди като chmod или chown. Важно е да отбележим, че използването на ACLs не пречи с нищо на прилагането на стандартните команди за управление на Unix-правата. Двата метода съжителстват съвсем мирно.

Като за начало трябва изпълним командата:

apt-get install acl

Този пакет съдържа двата основни инструмента за управление на ACLs, които ще се превърнат в нашата дясна ръка.

Следва да редактираме файла /etc/fstab, за да кажем на ядрото да включи поддръжката на ACLs за съответните дискови дялове. Това става лесно, с добавяне на опция acl и премонтиране на съответния дял. Тук е мястото да отбележим, че Линукс поддържа acl за Ext2/Ext3 едва в последните версии на ядрата от серията 2.4 и в 2.6. Ако ползвате файловата система XFS, не е необходимо да пипате нищо в fstab, защото тази файлова система идва по подразбиране с вградена поддръжка на ACLs. Ако искате поддръжка на ACLs в Линукс, препоръчително е да се спрете на XFS или Ext2/Ext3 със съответната версия на ядрото, която поддържа опцията acl (тя е нужна само за Ext2/Ext3).

Пример за fstab за Ext2/Ext3.

/dev/hda2     /home     ext3     rw,usrquota,nosuid,nodev,noatime,acl     0     0

С командата getfacl извличаме информация за acl-статуса на дадения файл или директория.

# getfacl shots/
# file: shots
# owner: nikola
# group: nikola
user::rwx
group::r-x
other::r-x

Така изглеждат правата на всяка директория по подразбиране. В момента тази директория е собственост на nikola, но всеки може да влиза и да чете в нея.

chmod 700 shots/
ls -l shots
drwx------    5 nikola   nikola        111 2004-06-13 09:57 shots/

Сега вече никой друг не може да влиза в тази директория освен нейния собственик. Това е чудесно, но да речем, че искаме да публикуваме директорията в уеб. Тогава трябва да разрешим на уебсървъра да я чете. Това ще стане с командата setfacl. В Debian потребителят на уебсървъра е www-data.

setfacl -m u:www-data:r-x shots/
getfacl shots/
# file: shots
# owner: nikola
# group: nikola
user::rwx
user:www-data:r-x
group::---
group::---
mask::r-x
other::---

В този случай ние разрешихме на потребителя (флагът за потребител е u, а за група - g) www-data да чете и да изпълнява (флаговете r и x са познати от командата chmod) в тази директория.

Тук решихме една проста и банална задача, с което искахме да обясним простичко и накратко какъв е смисълът от използването на ACLs. Всички опции и възможности на командата setfacl са описани подробно в съответната man-страница.


Nikola Antonov 2004-10-31