Translate

четвер, 3 жовтня 2013 р.

Список контроля доступу Linux (ACL, setfacl)

Класичні права в операційній системі Linux/Unix не такі гнучкі як хотілось би: у випадку коли права на файл/директорію хочеться розподілити якомога точно між багатьма групами користувачів  - вони безсилі. Для реалізації таких складних прав було розроблено ACL (Access Control List - список контроля доступу). Вперше можливіть вести списи ACL було додано в ядрі 2.4.21.

Щоб скористатись розширеними правилами необхідно, щоб файлова система була змонтована із опцією acl. Для цього необхідно або прописати опцію в fstab і перемонтувати розділ:

# vim /etc/fstab
...
# /media/free was on /dev/sda5 during installation
UUID=b0218d9d-3d5b-4598-a8ac-5bf90a0d2090 /media/free     ext4    defaults,acl        0       2
...

Перемонтувати розділ можна таким чином (або просто перевантажити після додавання опцій в fstab):

# sudo mount -o remount /home

У випадку, якщо пакет acl відсутній - варто його встановити:

# apt-get install acl

Але, ймовірно, що він вже проінстальований у вашому дистрибутиві. Перевірити чи файлова система правильно змонтувалась можна так:

# mount | grep sda5
/dev/sda5 on /media/free type ext4 (rw,acl)

Перейдемо ближче до суті. Розглянемо роботу ACL із практичної сторони. Для цього створимо директорію lol і тестового користувача test:

$ cd /media/free
$ mkdir lol

$ ls -la | grep lol
drwxrwxr-x 2 ipeacocks ipeacocks  4096 жов  3 03:33 lol

$ useradd test
$ id test
uid=1001(test) gid=1001(test) groups=1001(test)

Звісно, що користувач test не зможе видалити директорію lol, користувача ipeacocks:

$ su test
$ rm -rf lol
rm: cannot remove ‘lol’: Permission denied

І це, насправді, дуже логічно, адже з виводу ls користувач не має права цього зробити. Проте все змінюється після надання таких прав за допомогою setfacl:

# setfacl -m u:test:rwx lol

Ls надалі показуватиме володарем файлу попереднього користувача (проте "+" вказує на розширені права):

$ ls -la | grep lol
drwxrwxr-x+ 2 ipeacocks ipeacocks    4096 жов  3 03:33 lol

Усю правду видасть getfacl:

$ getfacl lol
# file: lol
# owner: ipeacocks
# group: ipeacocks
user::rwx
user:test:rwx
group::rwx
mask::rwx
other::r-x

Отже тепер користувач test може зробити з директорією все, що йому заманеться - і навіть видалити його (звісно, якщо батьківський каталог має відповідні права):

$ rm -rf lol
$ ls
lost+found

ACL права також можна встановити одразу для групи користувача:

# setfacl -m g:test:rwx,u:ipeacocks:rwx lol

І навіть перерахувати необхідні групи:

# setfacl -m g:test:rwx lol

# getfacl lol
# file: lol
# owner: root
# group: root
user::rwx
group::r-x
group:test:rwx
mask::rwx
other::r-x

Звичайно, що з такою ж легкістю можна права і забрати:

# setfacl -x g:test lol

# getfacl lol
# file: lol
# owner: root
# group: root
user::rwx
user:ipeacocks:rwx
group::r-x
mask::rwx
other::r-x

Варто також згадати про копіювання списків контроля доступу з одного файлу на інший:

# getfacl dir1 | setfacl -R -b -n -M - dir2

"-n" - вказує не перераховувати маску файла.
"-M -" - модифікує списки доступа, отримуючи дані з stdin 
"-R" - рекурсивно.

Отже, підсумуємо:

"--set" - установка нових прав із затиранням попередніх
"-m" - (modify) додавання до існуючих прав нових
"-x" - видаляє указані права.
"-b"- затирає всі попередні ACL-права

Слід також зауважити, що ACL списки навіть зараз підтримують не всі програми. Наприклад, після архівування. використовуючи tar вони втратяться. Тому варто в такому випадку використовувати star або зберігти всі права і відресторити їх після розархівування:

# getfacl -R file  > acl.backup
# setfacl --restore=acl.backup

https://help.ubuntu.com/community/FilePermissionsACLs

Немає коментарів:

Дописати коментар