Ну, что думаете, что система управления доступом в Linux'е заканчивается
chown'ом и
chmod'ом? Ошибаетесь - есть ещё ACL!
Итак, файловые системы ext
N, а так-же 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