Поиск по этому блогу

понедельник, 6 сентября 2010 г.

Списки управления доступом

Ну, что думаете, что система управления доступом в Linux'е заканчивается chown'ом и chmod'ом? Ошибаетесь - есть ещё ACL!

Итак, файловые системы extN, а так-же reiserfs (относительно других - просто не проверял) поддерживают ACL, но только в том случае когда они смонтированы с опцией acl:
sudo mount -o remount,acl /tmp

Конечно более кошерно это сделать через /etc/fstab:
/dev/cciss/c0d0p6 /tmp reiserfs rw,acl 0 0

Если acl активированы, управлять ими можно при помощи утилит setfacl и getfacl, которые устанавливаются с пакетом acl:
aptitude install acl

Попробуем разобраться что тут да к чему.

Создадит файл foo с правами 0x600:
~$ cd tmp
~/tmp$ touch foo
~/tmp$ chmod 600 foo
~/tmp$ ls -l foo
-rw------- 1 bar bar 0 Сен  6 13:57 foo

Глянем теперь в getfacl, что у нас получилось:
~/tmp$ getfacl foo
# file: foo
# owner: bar
# group: bar
user::rw-
group::---
other::---

Видим, что автоматически добавились три раздела, соответствующие обычным правам доступа. В дальнейшем эти разделы автоматически синхронизирутся с обычными правами доступа - chmod, chown - и в то же время обычные права доступа можно обновить через setfacl.
Создадим теперь несколько ACL'ов, добавим право на чтение и запись для пользователя mysql и только для чтения пользователю dovecot:
~/tmp$ setfacl -m u:mysql:rw foo
~/tmp$ setfacl -m u:dovecot:r foo
~/tmp$ getfacl foo
# file: foo
# owner: bar
# group: bar
user::rw-
user:mysql:rw-
user:dovecot:r--
group::---
mask::rw-
other::---

Станет немного сложнее если захотет задать маску ACL. Маски используется при ограничении доступа явно поименованных пользователей и групп и не затрагивает права файла. Установим маску только для чтения и снова посмотрим на ACL:
~/tmp$ setfacl -m m::r foo
~/tmp$ getfacl foo
# file: foo
# owner: bar
# group: bar
user::rw-
user:mysql:rw-            #effective:r--
user:dovecot:r--
group::---
mask::r--
other::---

Обращаем внимание, что права для пользователя mysql были ограничены установленной маской; теперь это только чтение, а не чтение и запись.

Ну и напоследок, ACL можно удалить таким образом:
~/tmp$ setfacl -x u:dovecot: foo 
~/tmp$ getfacl foo 
# file: foo
# owner: bar
# group: bar
user::rw-
user:mysql:rw-
group::---
mask::rw-
other::---


Кстати, все операции можно проводить не только с пользователями, но и с группами:
~/tmp$ setfacl -x u:dovecot: foo 
~/tmp$ getfacl foo 
# file: foo
# owner: bar
# group: bar
user::rw-
user:mysql:rw-
group::---
mask::rw-
other::---

~/tmp$ setfacl -m g:dovecot:r foo 
~/tmp$ getfacl foo
# file: foo
# owner: bar
# group: bar
user::rw-
user:mysql:rw-
group::---
group:dovecot:r--
mask::rw-
other::---

~/tmp$ setfacl -x g:dovecot: foo 
~/tmp$ getfacl foo
# file: foo
# owner: bar
# group: bar
user::rw-
user:mysql:rw-
group::---
mask::rw-
other::---

Заметим, что команда ls -l пусть и не пытается отобразить расширенные ACL, но даёт понять, что они есть (знак + после стандартных прав доступа):
~/tmp$ ls -l foo
-rw-rw----+ 1 bar bar 0 Сен  6 13:57 foo

Кстати, getfacl и setfacl могут работать в контейнерной обработке. Например, чтобы скопировать права доступа с foo на foo1 достаточно сделать так:
~/tmp$ touch foo1
~/tmp$ getfacl foo | setfacl --set-file=- foo1
~/tmp$ getfacl foo
# file: foo
# owner: bar
# group: bar
user::rw-
user:mysql:rw-
group::---
mask::rw-
other::---

~/tmp$ getfacl foo1
# file: foo1
# owner: bar
# group: bar
user::rw-
user:mysql:rw-
group::---
mask::rw-
other::---

Ну и самое интересно. Можно указать унаследуемые от прав каталога ACL:
~/tmp$ mkdir acltest
~/tmp$ setfacl -d -m u:mysql:rw acltest
~/tmp$ getfacl acltest
# file: acltest
# owner: bar
# group: bar
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:mysql:rw-
default:group::r-x
default:mask::rwx
default:other::r-x

~/tmp$ cd acltest
~/tmp/acltest$ touch foo
~/tmp/acltest$ getfacl foo
# file: foo
# owner: bar
# group: bar
user::rw-
user:mysql:rw-
group::r-x   #effective:r--
mask::rw-
other::r--

Насколько часто пользоваться acl - дело каждого, тут не может быть универсальных советов.

setfacl -m u:foo:rw файл(ы)
| |  |  |
| |  |  +-- права rwx
| |  |
| |  +----- пользователь (или группа) заданные по имени или uid/gid
| |
| +-------- u = пользователь
|           g = группа
|           o = другие
|           m = маска
+--------- -m = изменить ACL
-x = удалить ACL