Ну, что думаете, что система управления доступом в Linux'е заканчивается chown'ом и chmod'ом? Ошибаетесь - есть ещё ACL!
Итак, файловые системы extN, а так-же reiserfs (относительно других - просто не проверял) поддерживают ACL, но только в том случае когда они смонтированы с опцией acl:
Конечно более кошерно это сделать через /etc/fstab:
Если acl активированы, управлять ими можно при помощи утилит setfacl и getfacl, которые устанавливаются с пакетом acl:
Попробуем разобраться что тут да к чему.
Создадит файл foo с правами 0x600:
Глянем теперь в getfacl, что у нас получилось:
Видим, что автоматически добавились три раздела, соответствующие обычным правам доступа. В дальнейшем эти разделы автоматически синхронизирутся с обычными правами доступа - chmod, chown - и в то же время обычные права доступа можно обновить через setfacl.
Создадим теперь несколько ACL'ов, добавим право на чтение и запись для пользователя mysql и только для чтения пользователю dovecot:
Станет немного сложнее если захотет задать маску ACL. Маски используется при ограничении доступа явно поименованных пользователей и групп и не затрагивает права файла. Установим маску только для чтения и снова посмотрим на ACL:
Обращаем внимание, что права для пользователя mysql были ограничены установленной маской; теперь это только чтение, а не чтение и запись.
Ну и напоследок, ACL можно удалить таким образом:
Кстати, все операции можно проводить не только с пользователями, но и с группами:
Заметим, что команда ls -l пусть и не пытается отобразить расширенные ACL, но даёт понять, что они есть (знак + после стандартных прав доступа):
Кстати, getfacl и setfacl могут работать в контейнерной обработке. Например, чтобы скопировать права доступа с foo на foo1 достаточно сделать так:
Ну и самое интересно. Можно указать унаследуемые от прав каталога ACL:
Насколько часто пользоваться 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