Содержание
Поддерживаемые версии Ubuntu |
---|
Все с ядром 2.4.21 (?) и выше, а также другие ОС |
Вступление
Итак, пришло время задуматься о безопасности вашей сети. В частности о назначении прав на каталоги и файлы для пользователей и групп. Стандартные права в операционных системах Unix не так гибки, как хотелось бы. К сожалению они годятся для использования в простых схемах сети. Например, ситуацию когда к одному и тому же каталогу нужно, чтобы несколько групп пользователей имели разные права доступа, не реализовать с использованием стандартных прав.
Для реализации сложных структур прав доступа используются расширенные права - ACL (Access control list - cписки контроля доступа). Списки контроля доступом (ACL) дают большую гибкость, чем стандартный набор полномочий «пользователь/группа/остальные». ACL доступны в коммерческих Unix-системах, таких как IRIX или Solaris (и в Windows NT) в течение нескольких лет. В настоящее время, благодаря проекту TrustedBSD, ACL доступны в FreeBSD 5.0 и выше, а также в Linux. Возможность использования ACL позволяет администратору получить преимущество от использования более интеллектуальной модели безопасности.
Устоявшиеся истины:
- Каждый пользователь входит в минимум одну группу. Группа, присваиваемая пользователю при его создании, называется основной. Все остальные группы в которые будет включен пользователь, будут являться дополнительными.1)
- Группа пользователей может содержать некоторое количество пользователей, но не может содержать или включаться в другие группы.
- Группа может быть пустой, т.е. не содержать в себе ни одного пользователя.
Чтобы добавить пользователя в ту, или иную группу, достаточно отредактировать файл /etc/group:
Примечание прислал Лихоманенко Артем 2013/04/23 15:55
syslog:x:103: klog:x:104: scanner:x:105:hplip,allexserv nvram:x:106: fuse:x:107:allexserv
Видно, что в листинге выше в группу scanner входят пользователи hplip и allexserv. Чтобы добавить в эту группу еще пользователей, просто перечислите их символьные имена через запятую.
Синтаксис файла прост:
имя_группы:пароль:GID:список_пользователей
Итак, основная мысль статьи - это использование расширенных прав ACL.2)
Включение ACL в системе
С какой-то там версии Ubuntu, поддержка ACL уже включена и поддерживается ядром.3) Но как бы то ни было, по умолчанию, в системе, ACL не активированы. Для того, чтобы операционная система начала учитывать списки контроля, необходимо ей об этом сказать. Для этого потребуется отредактировать файл /etc/fstab и указать в нем, на каких разделах HDD следует учитывать ACL права. Проверить, поддерживает ли тот или иной раздел винчестера ACL, можно попытавшись установить эти самые ACL, командой setfacl:
/root > setfacl -m u:allexserv:rw-,g:root:rw- qqq setfacl: qqq: Operation not supported
Operation not supported - операция не поддерживается - бодро рапортует вам система! Это признак того, что ACL на этом разделе винчестера, где лежит файл qqq не активированы. Что ж, давайте отредактируем /etc/fstab и приведем его в должный вид:
# /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 # /dev/sda1 UUID=1b09f304-1772-4a87-bc1c-ee8c6170ef1e / ext3 relatime,errors=remount-ro 0 1 # /dev/sda5 UUID=95b26917-535e-46ac-8d72-443d46184bb5 /media/Profil ext3 grpquota,acl,suid,dev,usrquota,relatime,exec 0 2 # /dev/sda6 UUID=759a8adb-ed01-4d4f-b173-9005ad165368 /media/Work ext3 grpquota,acl,suid,dev,usrquota,relatime,exec 0 2 # /dev/sda7 UUID=f90b3fb0-e515-4b4e-8a1b-dfe7ed269a10 none swap sw 0 0 /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0 /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0 /media/Work/test /export/test bind bind 0
В тех разделах винчестера, в которых указан дополнительный параметр acl команды mount - grpquota,acl,suid - списки контроля будут поддерживаться в полном объеме. В моем случае поддержка ACL активирована на разделах /dev/sda5 и /dev/sda6.
После редактирования файла, лучше не мучаться и перезагрузить сервер, хотя, как утверждается в некоторых статьях, достаточно размонтировать раздел и смонтировать его вновь (такой номер у меня почему-то не прошел).
После вышеописанной операции, ACL на соответствующих разделах готовы к работе.
Утилиты ACL
Честно говоря, работа с ACL, на первый взгляд, может показаться сложноватой. Но если вникнуть в логику управления, то все становится на свои места. Учтите, что манипуляции с правами, особенно в сложных схемах, требуют хорошего логического мышления.
Существуют два типа ACL:
- ACL для доступа;
- ACL по умолчанию.
ACL для доступа — это список управления доступом для заданного файла или каталога. Проще говоря - это сами права на объект, которые будут контролировать доступ к этому объекту.
ACL по умолчанию - может быть связан только с каталогом, и, если файл в этом каталоге не имеет ACL для доступа, он использует правила, определённые в ACL по умолчанию, связанном с каталогом. ACL по умолчанию являются необязательными. ACL по умолчанию также можно сравнить с наследованием прав в, простите, Windows NT.
Управления ACL списками осуществляется всего лишь двумя командами:4)
- setfacl - используется для назначения, модификации и удаления ACL прав.
- getfacl - используется для просмотра установленных ACL.
К сожалению, большинство Unix-утилит все еще не поддерживает ACL. Например, tar не архивирует и не восстанавливает ACL, в FreeBSD NFS также игнорирует их. Ни формат файлов в утилите tar, ни протокол NFS нет ни намека на возможность использования ACL. Тем не менее, архивы полного раздела UFS1, сделанные с помощью tar или dump, восстанавливают каталог .attribute, и утилита dump в FreeBSD модифицирована для «понимания» UFS2 (включающую ACL). Каталог-скелет archivers/star поддерживает ACL. Вы даже можете работать с архивами, созданными в Linux и FreeBSD С помощью star и предохраняющей расширенные атрибуты (включающие и ACL).
Но не все так грустно! Перевод статьи был написан в 2006 году (к сожалению до оригинала я так и не добрался). В другой же статье, более поздней, сказано:
Ядро Red Hat Enterprise Linux 4 обеспечивает поддержку ACL для файловой системы ext3 и экспортируемых файловых систем NFS. Списки ACL также работают в файловых системах ext3, доступных через Samba. … Команды cp и mv копируют и перемещают все списки ACL, связанные с файлами и каталогами.
Хоть большинство стандартных команд, призванных производить операции над файлами, уже поддерживают ACL то, например, команды архивирования tar и dump ACL не архивируют. Для архивации данных с установленными ACL используется программа star. В кратце ее рассмотрим позже. Замечу, что для NFS ACL поддерживаются уже по умолчанию. Вообще, успешное использование ACL зависит от поддержки ACL файловой системой и поддержки ACL операционной системой на клиентской машине.
Итак, рассмотрим синтаксис и параметры getfacl и setfacl.
Утилита getfacl
О getfacl сильно и говорить нечего. Она выводит листинг ACL прав для указанных объектов.
Примеры использования:
- getfacl * - отобразит права ACL для всех объектов в текущем каталоге;
- getfacl sobaka.txt - отобразить ACL для файла sobaka.txt;
- getfacl kartosh* - отобразит ACL для всех файлов в текущем каталоге, которые начинаются на kartosh;
- getfacl -R * - отобразит ACL для всех объектов (включая подкаталоги и их содержимое) текущего каталога.
Чтобы посмотреть, установлены ли ACL на объектах, достаточно воспользоваться командой ls -l:
# Символ "+" в конце списка стандартных прав сообщает о наличии установленных прав ACL: root@sytserver:/media/Work/test# ls -l итого 28 drwxrwxrwt 2 root root 4096 2009-07-24 21:20 allex -rwxr-x---+ 1 root root 19 2009-07-25 14:45 qwert
Теперь рассмотрим, что же отобразит команда getfacl:
root@sytserver:/media/Work/test# getfacl qwert # file: qwert # owner: root # group: root user::rwx user:child:rw- group::r-- mask::rw- other::---
Из примера видно, что без использования ACL, пользователь child не получил бы права к файлу qwert, т.к. не входит в группу root и не является владельцем файла. Права ACL, в данном случае, предоставили ему права на чтение и запись этого файла. Давайте подробнее разберем листинг getfacl:
# file: qwert - Имя файла # owner: root - Владелец файла (основные права Unix) # group: root - Группа файла (основные права Unix) user::rwx - Права для владельца файла (основные права Unix) user:child:rw- - Права ACL для пользователя child group::r-- - Права для группы файла (основные права Unix) mask::rw- - Эффективная маска other::--- - Права для пользователя "все остальные"
Что касается ключей getfacl, то есть пара из них которые стоит рассмотреть, но рассматривать их будем тогда, когда будем изучать setfacl.
Утилита setfacl
Теперь об утилите setfacl. Как уже говорилось выше, утилита setfacl предназначена для установки, модификации или удаления ACL.
Списки ACL можно задать:
- На уровне пользователей - назначаются ACL конкретным пользователям;
- На уровне групп - назначаются ACL конкретным группам;
- С помощью маски эффективных прав - ограничение максимальных прав для пользователей и/или групп;
- Для пользователей, не включённых в группу данного файла - это т.н. пользователь «Все остальные»;
Рассмотрим простой синтаксис setfacl:
setfacl <опции> <ключ> <список правил> <объект>
- <опции> - задает дополнительные опции;
- <ключ> - задает режим работы утилиты;
- <список правил> - собственно, сами правила доступа к объекту;
- <объект> - объект к которому применяется ACL, в большинстве случаев это файл или каталог.
Часто используемые ключи:
Ключ | Описание |
---|---|
--set или --set file* | - Устанавливает новые указанные права ACL, удаляя все существующие. Необходимо, чтобы наравне с задаваемыми правилами ACL были также указаны стандартные права Unix, в противном случае будет давать ошибку; |
-m или -M file* | - Модифицирует указанные ACL на объекте. Другие существующие ACL сохраняются. |
-x или -X file* | - Удаляет указанные ACL права с объекта. Стандартные права Unix не изменяются. |
* - При использовании -M, - -set, -X - разрешения будут браться из указанного файла file, который должен быть заранее подготовлен в формате вывода ACL разрешений командой getfacl. Подготовить файл можно либо вручную, в формате вывода getfacl, либо использовать команду getfacl -R file > file_out. Где file это файл(ы) или каталог(и) с которых нужно снять ACL, а file_out - текстовый файл куда запишутся снятые ACL права.
Часто используемые опции:
Опция | Описание |
---|---|
-b | - Удаляет все ACL права с объекта, сохраняя основные права; |
-k | - Удаляет с объекта ACL по умолчанию. Если таковых на объекте нет, предупреждение об этом выдаваться не будет; |
-d | - Устанавливает ACL по умолчанию на объект. |
–restore=file | - Восстанавливает ACL права на объекты из ранее созданного файла с правами.5) |
-R | - Рекурсивное назначение (удаление) прав, тобишь пройтись по всем подкаталогам. |
Формирование списка правил:
Синтаксис | Описание | Пример использования |
---|---|---|
u:<uid>:<perms>* | - Назначает ACL для доступа заданному пользователю. Здесь можно указать имя или UID пользователя. Это может быть любой пользователь, допустимый в данной системе. | Пример: setfacl -m u:allexserv:rw myfile.odt - назначает пользователю allexserv права на чтение и запись. |
g:<gid>:<perms>* | - Назначает ACL для доступа заданной группе. Здесь можно указать имя или GID группы. Это может быть любая группа, допустимая в данной системе. | Пример: setfacl -m g:children:r myfile.odt - назначает группе children права на чтение. |
m:<perms>* | - Назначает маску эффективных прав.6) | Пример: setfacl -m m:rx myfile.odt - устанавливает фактические максимальные права на чтение и выполнение. |
o:<perms>* | - Назначает ACL для доступа пользователям, не включённым в группу файла. Это пользователь «все остальные», как в стандартных правах Unix. | Пример: setfacl -m o: myfile.odt - убирает все права (отсутствие прав). |
* <perms> - Сами правила для пользователя или группы. Могут принимать значения ( r ), ( x ), ( w ), или сочетания друг с другом.
Примеры использования
Рассмотрим различные примеры использования назначения, модификации и удаления ACL. Выше мы уже выводили листинг, при помощи команды getfacl для файла qwert, на котором уже установлены ACL для пользователя child:
root@sytserver:/media/Work/test# getfacl qwert # file: qwert # owner: root # group: root user::rwx user:child:rw- group::r-- mask::rw- other::---
Теперь давайте добавим к этому файлу еще пользователя allexserv:
root@sytserver:/media/Work/test# setfacl -m u:allexserv:rwx qwert root@sytserver:/media/Work/test# getfacl qwert # file: qwert # owner: root # group: root user::rwx user:allexserv:rwx user:child:rw- group::r-- mask::rwx other::---
Обратите внимание как изменилась эффективная маска. Все ACL права сложились: у пользователя child rw- и у пользователя allexserv rwx. Но маска вовсе не разрешает пользователю child иметь право на выполнение (x) файла qwert. Посмотрите, что произойдет если принудительно изменить эффективную маску:
root@sytserver:/media/Work/test# setfacl -m m:r qwert root@sytserver:/media/Work/test# getfacl qwert # file: qwert # owner: root # group: root user::rwx user:allexserv:rwx #effective:r-- user:child:rw- #effective:r-- group::r-- mask::r-- other::---
Теоретически, в данном случае пользователь child не может удалить файл (про allexserv ничего не говорю, т.к. он входит в группу root у меня). Но проведя тест, пользователь child все-таки удалил файл, правда перед удалением система спросила:
child@sytserver:/media/Work/test$ rm qwert rm: удалить защищенный от записи обычный файл `qwert'?
В то же время попробовал отредактировать файл qwert под пользователем child и попытался записать изменения. Система в записи отказала. Здесь стоит отметить, что удаление файла регламентируется правами на каталог в коем расположен этот файл. Причина такого поведения именно в этом.
Теперь давайте удалим с файла qwert права ACL для пользователя allexserv:
root@sytserver:/media/Work/test# setfacl -x u:allexserv qwert root@sytserver:/media/Work/test# getfacl qwert # file: qwert # owner: root # group: root user::rwx user:child:rw- #effective:r-- group::r-- mask::r-- other::---
Чтобы удалить все ACL права с файла можно воспользоваться командой: setfacl -b qwert
Очевидно, что таким макаром можно назначать и удалять ACL права для пользователей и групп на файлы и каталоги.
Давайте еще рассмотрим т.н. наследованность прав. Если не задано иное, то все объекты создаваемые в каталоге у которого есть ACL, не наследуют права ACL c каталога в котором они создаются. Но иногда возникают ситуации, когда необходимо, чтобы все объекты создаваемые внутри каталога наследовали его ACL права. Это называются ACL по умолчанию.
Задача: создадим каталог Proverka и назначим ему владельца child и группу children (разумеется, пользователь и группа должны существовать в системе). Установим ACL права для пользователя allexserv и пользователя mysql. Установим ACL по умолчанию на каталог Proverka так, чтобы создаваемым объектам внутри него также назначались ACL.
Создаем каталог, устанавливаем права и владельца:
root@sytserver:/media/Work/test# mkdir Proverka root@sytserver:/media/Work/test# chmod 700 Proverka root@sytserver:/media/Work/test# chown child:children Proverka root@sytserver:/media/Work/test# ls -l итого 24 drwxrwxrwt 2 root root 4096 2009-07-24 21:20 allex drwx------ 2 child children 4096 2009-07-25 23:36 Proverka
Назначаем ACL права сразу для двух пользователей, перечислив их через запятую:
root@sytserver:/media/Work/test# setfacl -m u:allexserv:rwx,u:mysql:rwx Proverka root@sytserver:/media/Work/test# getfacl Proverka # file: Proverka # owner: child # group: children user::rwx user:mysql:rwx user:allexserv:rwx group::--- mask::rwx other::---
Теперь назначим ACL по умолчанию. При назначении ACL по умолчанию, также требуется в обязательном порядке указывать и основные права в виде u::rwx,g::-,o::- где u - user - владелец, g - group - группа, o - other - все остальные:
root@sytserver:/media/Work/test# setfacl -d -m u::rwx,g::-,o::-,u:allexserv:rwx,u:mysql:rwx Proverka root@sytserver:/media/Work/test# getfacl Proverka # file: Proverka # owner: child # group: children user::rwx user:mysql:rwx user:allexserv:rwx group::--- mask::rwx other::--- default:user::rwx default:user:mysql:rwx default:user:allexserv:rwx default:group::--- default:mask::rwx default:other::---
Видно, что появились строки начинающиеся с default. Это и есть права по умолчанию, которые будут принимать все создаваемые внутри объекты. Проверим, создав пустой файл myfile.txt и подкаталог MyKatalog в каталоге Proverka:
root@sytserver:/media/Work/test/Proverka# touch myfile.txt root@sytserver:/media/Work/test/Proverka# mkdir MyKatalog root@sytserver:/media/Work/test/Proverka# getfacl * # file: myfile.txt # owner: root # group: root user::rw- user:mysql:rwx #effective:rw- user:allexserv:rwx #effective:rw- group::--- mask::rw- other::--- # file: MyKatalog # owner: root # group: root user::rwx user:mysql:rwx user:allexserv:rwx group::--- mask::rwx other::--- default:user::rwx default:user:mysql:rwx default:user:allexserv:rwx default:group::--- default:mask::rwx default:other::---
Обратите внимание, что каталог MyKatalog не только приобрел ACL, но и также приобрел и ACL по умолчанию. Т.е. те объекты, которые будут создаваться в подкаталоге MyKatalog тоже будут наследовать ACL по умолчанию.
Удалить права по умолчанию можно: setfacl -k Proverka.
Если нужно также удалить права по умолчанию и в подкаталогах, то добавьте ключ -R (рекурсия): setfacl -R -k /media/Work/test/Proverka .
Здесь мы оперировали двумя пользователями. Но ничто не мешает вам оперировать также целыми группами пользователей.
Автоматические операции
Любой администратор стремится к оптимизации. Понятно, что назначить вручную 100 объектам одни и те же права - нудное занятие и нецелесообразное. Есть некоторые фишечки, которые могут облегчить подобные задачи.
Копирование ACL прав с одного объекта на другой.
Принцип прост:
- Снять ACL c одного объекта
- Записать их на другой
В документации приведен следующий пример:
getfacl file1 | setfacl --set-file=- file2
Где, file1 - объект с которого снимаем ACL командой getfacl, а далее устанавливаем ACL командой setfacl на объект file2. Обратите внимание на запись - -set-file=- в конце указан символ «-», который берет информацию от команды getfacl (со стандартного вывода).
Справедлива будет также такая запись:
getfacl file1 | setfacl -M- file2
В этом случае права на file2 не заменяются как при использовании - -set, а добавляются к уже существующим правам ACL.
Копирование прав ACL каталога в права по умолчанию этого же каталога
getfacl --access dir | setfacl -d -M- dir
В этом примере getfacl получает все права которые вы установили на каталог dir и устанавливает их на этот же каталог dir делая их правами по умолчанию. Очень удобно. Обратите внимание на ключ - -access у команды getfacl. При вызове getfacl без параметров, она отображает все права ACL, включая права по умолчанию. Здесь же, ключ - -access заставляет getfacl показать только права ACL на каталог, а права по умолчанию (если таковые имеются у каталога) - скрыть. Обратный ключ - это ключ -d:
getfacl -d Proverka
- заставит getfacl показать только права по умолчанию, а права ACL на сам каталог - скрыть. Кстати, в нашем примере, с каталогом Proverka, на который мы назначали права по умолчанию, чтобы не писать строку:
setfacl -d -m u::rwx,g::-,o::-,u:allexserv:rwx,u:mysql:rwx Proverka
можно было бы воспользоваться именно этой фишечкой, как то так:
getfacl --access Proverka | setfacl -d -M- Proverka
Результат был бы тот же.
Вот и все, а вообще, не поленитесь почитать man getfacl, очень занимательно!
Операции над объектами c ACL
В заключении хочу еще раз обратить внимание на операции с обектами у которых установлены ACL, такие как копирование, перемещение, архивирование. Выше мы уже упоминали о них. Некоторые замечания:
- При перемещении (mv) никаких дополнительных параметров ненужно;
- При копировании (cp), необходимо использовать ключ -p, в противном случае ACL права будут потеряны;
По умолчанию графический интерфейс при копировании не учитывает ACL права!
- При архивировании или распаковке вместо tar используйте утилиту star.
Утилиту star нужно будет установить из репозиториев: apt-get install star
Вот некоторые часто используемые опции star:
Опция | Описание |
---|---|
-c | Создаёт файл архива |
-n | Отключает извлечение файлов, используется в сочетании с -x для просмотра списка извлекаемых файлов. |
-r | Заменяет файлы в архиве. Файлы записываются в конец архива, заменяя любые файлы с тем же путём и именем. |
-t | Выводит содержимое файла архива. |
-u | Обновляет файл архива. Файлы записываются в конец архива, если их ещё не было в архиве или если они новее, чем файлы с тем же именем в архиве.7) |
-x | Извлекает файлы из архива. Если используется с ключом -U и файл в архиве старее, чем соответствующий файл в файловой системе, такой файл не извлекается. |
-help | Выводит наиболее важные параметры. |
-xhelp | Выводит менее важные параметры. |
-/ | Оставляет ведущую косую черту в имени файла при извлечении файлов из архива. По умолчанию она убирается. |
-acl | При создании архива или извлечении файлов, архивирует или восстанавливает все ACL, связанные с файлами или каталогами. |
Пример для архивирования утилитой star с сжатием:
star -czv -Hexustar -acl -f /tmp/homedir.tgz /media/Profil/home
Пример для разархивирования в текущий каталог:
star -xv -Hexustar -acl -f homedir.tgz
Вот собственно и все, что я хотел рассказать про ACL. Применяйте логику и смекалку и все будет хорошо.
— Соловьев Алексей aka allexnew upd 23.04.2013 16:05