ЧАСТЬ 5: Настраиваем права (или ACL, группы и иже с ними)Итак, пришло время проговорить о безопастности вашей сети. В частности о назначении прав на каталоги и файлы для пользователей и групп. Вы уже должны быть знакомы со стандартными правами систем Unix. Они не так гибки, как хотелось бы. Очень рекомендую ознакомиться с
ПРИЛОЖЕНИЕ 1 к статье -
Стандартные права Unix, SUID, SGID, Sticky биты.
Ну чтож, вы освежили в памяти стандартные права Unix :). К сожалению они годятся для использования в простых схемах сети. Например, ситуацию когда к одному и тому же каталогу нужно чтобы несколько групп пользователей имели разные права доступа, не реализовать с использованием стандартных прав.
Для реализации сложных структур прав доступа используются расширенные права -
ACL (access control list - cписки контроля доступа).
ACL праваНапомню:
- Каждый пользователь входит в минимум одну группу. Группа присваемая пользователю при его создании называется основной. Все остальные группы в которые будет включен пользователь, будут являться дополнительными.*
- Группа пользователей может содержать некоторое количество пользователей, но не может содержать или включаться в другие группы.
- Группа может быть пустой, т.е. не содержать в себе ни одного пользователя.
* - Наличие основной и дополнительных групп может также облегчить написание правил монтирования ресурсов при входе в систему (см. расширенные параметры модуля pam_mount в 4-ой части).Чтобы добавить пользователя в ту, или иную группу, достаточно отредактировать файл
/etc/group:
syslog:x:103:
klog:x:104:
scanner:x:105:hplip,allexserv
nvram:x:106:
fuse:x:107:allexserv
Видно, что в листинге выше в группу
scanner входят пользователи
hplip и
allexserv. Чтобы добавить в эту группу еще пользователей, просто перечислите их символьные имена через запятую. Синтаксис файла прост:
имя_группы:пароль:GID:список_пользователейИтак, основная мысль статьи это использование расширенных прав
ACL. Хоть словестной воды получилось много, считаю что информация выше необходима (это я про
приложение 1) для понимания последующей информации. Придется потерпеть, т.к. сейчас еще будет теория, но уже об
ACL.
Часть информации взята с
этого перевода. Также очень хорошо описан синтаксис ACL
здесь. Надеюсь, авторы непротив, если часть текста я позаимствую из этих статей.
Списки контроля доступом (ACL) дают большую гибкость, чем стандартный набор полномочий "пользователь/группа/остальные". ACL доступны в коммерческих Unix-системах, таких как IRIX или Solaris (и в Windows NT) в течение нескольких лет. В настоящее время, благодаря проекту TrustedBSD, ACL доступны в FreeBSD 5.0 и выше, а также в Linux.
Включение ACL в системе
С какой-то там версии Ubuntu, поддержка ACL уже включена и поддерживается ядром. Но как бы то ни было, по умолчанию, в системе, 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.
Управления списками осуществляется всего лишь двумя командами:
setfacl - используется для назначения, модификации и удаления ACL прав.
getfacl - используется для просмотра установленных ACL.
Помимо консольных команд, есть также графическая оболочка для установки ACL прав. Приблуда называется
eiciel, ее описание можно найти, например,
здесь. По-моему, по умолчанию приблуда не ставитсG в системе, так что ставить ее придется из репозиториев. Но так как здесь собрались ребята серьезные (я надеюсь), графическую приблудку рассматривать в этой статье не будем.
Несколько слов обязательно нужно сказать о взаимодействии других команд (такие как копирование, перемещение, архивирование и т.п.) с правами 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 операционной системой на клиентской машине.
Возвращаемся к нашим баранам (у нас их два) - это утилитки
setfacl и
getfacl. Придется рассмотреть их синтаксис и параметры.
О
getfacl сильно и говорить нечего. Она выводит листинг ACL прав для указанного файла или файлов. Примеры использования:
getfacl * - отобразит права ACL для всех объектов в текущем каталоге;
getfacl sobaka.txt - отобразить ACL для файла
sobaka.txt;
getfacl kartosh* - отобразит ACL для всех файлов в текущем каталоге, которые начинаются на
kartosh;
getfacl -R * - отобразит ACL для всех объектов (включая подкаталоги и их содержимое) текущего каталога.
Что касается ключей, то есть пара из них которые стоит рассмотреть, но рассматривать их будем тогда, когда будем изучать
setfacl.
Теперь об утилите
setfacl. Списки ACL можно настроить:
- На уровне пользователей
- На уровне групп
- С помощью маски эффективных прав
- Для пользователй, не включённых в группу данного файла
Рассмотрим простой синтаксис
setfacl:
setfacl <опции> <ключ> <список правил> <файл или каталог><опции> - задает дополнительные опции;
<ключ> - задает режим работы утилиты;
<список правил> - собственно правила доступа к объекту (кому че можно, а кому нельзя);
<файл или каталог> - объект к которому применяется ACL.
Частоиспользуемые ключи:
--set или
--set file* - Устанавливает новые указанные права ACL, удаляя все существующие. Необходимо, чтобы наравне с задаваемыми правилами ACL были также указаны стандартные права Unix, в противном случае будет давать ошибку;
-m или
-M file* - Модифицирует указанные ACL на объекте. Другие существующие ACL сохраняются.
-x или
-X file* - Удаляет указанные ACL права с объекта. Стандартные права Unix не изменяются.
Частоиспользуемые опции:
-b - Удаляет все ACL права с объекта, сохраняя основные права;
-k - Удаляет с объекта ACL по умолчанию. Если таковых на объекте нет, предупреждение об этом выдаваться не будет;
-d - Устанавливает ACL по умолчанию на объект.
--restore=file - Восстанавливает ACL права на объекты из ранее созданного файла с правами. Полезно для отката разрешений. Разумеется, необходимо сначала сделать резервную копию разрешений в текстовый файл
file. Сделать можно либо вручную, в формате вывода
getfacl, либо использовать команду
getfacl -R file > file_out. Где
file это файл(ы) или каталоги с которых нужно снять ACL, а
file_out - текстовый файл куда запишутся снятые ACL права.
-R - Рекурсивное назначение (удаление) прав, тобишь пройтись по всем подкаталогам.
* При использовании -M, --set, -X разрешения будуть браться из указанного файла file, который должен быть заранее подготовлен в формате вывода ACL разрешений командой getfacl. Подготовить файл можно либо вручную, в формате вывода getfacl, либо использовать команду getfacl -R file > file_out. Где file это файл(ы) или каталоги с которых нужно снять ACL, а file_out - текстовый файл куда запишутся снятые ACL права. Формирование списка правил:
u:<uid>:<perms>* - Назначает ACL для доступа заданному пользователю. Здесь можно указать имя или код пользователя. Это может быть любой пользователь, допустимый в данной системе. Пример:
setfacl -m u:allexserv:rw myfile.odtg:<gid>:<perms>* - Назначает ACL для доступа заданной группе. Здесь можно указать имя или код группы. Это может быть любая группа, допустимая в данной системе. Пример:
setfacl -m g:children:r myfile.odtm:<perms>* - Назначает маску эффективных прав. Маска — это объединение всех разрешений группы-владельца и всех записей пользователй и групп. Маска задает максимальные права доступа для всех пользователей, за исключением хозяина и групп. Установка маски представляет собой самый быстрый путь изменить фактические (эффективные) права доступа всех пользователей и групп. Например, маска r-- показывает, что пользователи и группы не могут иметь больших прав, чем просто чтение, даже если им назначены права доступа на чтение и запись. Например, если на файл
koshka назначили ACL пользователю
allexserv c правами
rwx, а эффективную маску выставили в
rx, то пользователь лишается права
w, не смотря на то, что по ACL он имеет это право. Пример:
setfacl -m m:rx myfile.odt o:<perms>* - Назначает ACL для доступа пользователям, не включённым в группу файла. Это пользователь "все остальные", как в стандартных правах Unix. Пример:
setfacl -m o: myfile.odt - убирает все права (отсутствие прав).
* <perms> - правила для пользователя или группы. Могут принимать значения r, x, w.C теорией покончено, давайте уже будем пробовать как да что. Итак, попробуем слегонца назначить пользователю
child права ACL на файл
qwert:
root@sytserver:/media/Work/test# ls -l
итого 24
drwxrwxrwt 2 root root 4096 2009-07-24 21:20 allex
-rwxr----- 1 root root 19 2009-07-25 14:45 qwert
# Устанавливаю права ACL:
root@sytserver:/media/Work/test# setfacl -m u:child:rw qwert
# Символ "+" в конце списка стандартных прав сообщает о наличии установленных прав 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
# Посмотрим как отображаются права ACL c помощью 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::--- - Права для пользователя "все остальные"
Теперь давайте добавим к этому файлу еще пользователя
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). Посмотрите, что произойдет если принудительно изменить эффективную маску:
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 по умолчанию так, чтобы создаваемым объектам также назначались ACL c каталога
Proverka.
# Создаем каталог, устанавливаем права и владельца:
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::---
Вот блин, эффективная маска создаваемых файлов почему-то rw :(. Интересно почему... Хотя сценарии выполняются... Вобщем мозг взрывает будь здоров! Ладно, оставим на потом.
Удалить права по умолчанию можно:
setfacl -k Proverka. Если нужно также удалить права по умолчанию и в подкаталогах, то добавьте ключ
-R:
setfacl -R -k Proverka.
Вобщем затея с правами ACL очень интересная! Здесь мы оперировали двумя пользователями. Но ничто не мешает вам оперировать также группами пользователей.
Множественные автоматические операции.Любой администратор стремится к оптимизации. Понятно, что назначить вручную 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.
Операции над объектами у которых имеются ACL права.В заключении хочу еще раз обратить внимание на операции с обектами у которых установлены ACL, такие как копирование, перемещение, архивирование. Выше мы уже упоминали о них. Некоторые замечания:
- При перемещении (
mv) никаких дополнительных параметров ненужно;
- При копировании (
cp), необходимо использовать ключ
-p, в противном случае ACL права будут потеряны;
- При архивировании или распаковке вместо
tar используем утилиту
star.
Утилиту
star нужно будет установить из репозиториев:
apt-get install starВот некоторые частоиспользуемые опции
star:
-c Создаёт файл архива
-n Отключает извлечение файлов, используется в сочетании с -x для просмотра списка извлекаемых файлов.
-r Заменяет файлы в архиве. Файлы записываются в конец архива, заменяя любые файлы с тем же путём и именем.
-t Выводит содержимое файла архива.
-u Обновляет файл архива. Файлы записываются в конец архива, если их ещё не было в архиве или если они новее, чем файлы с тем же именем в архиве. Этот параметр работает только если архив представляет собой файл или незаблокированную ленту, которую можно стирать.
-x Извлекает файлы из архива. Если используется с ключом -U и файл в архиве старее, чем соответствующий файл в файловой системе, такой файл не извлекается.
-help Выводит наиболее важные параметры.
-xhelp Выводит менее важные параметры.
-/ Оставляет ведущую косую черту в имени файла при извлечении файлов из архива. По умолчанию она убирается.
-acl При создании архива или извлечении файлов, архивирирует или восстанавливает все ACL, связанные с файлами или каталогами.
Вот собственно и все, что я хотел рассказать про ACL. Применяйте логику и смекалку и все будет хорошо.
PS Чуть позже попробуем решить более сложную задачу с использованием ACL:
Есть педагог. У педагога есть 5 групп детей. В каждой группе по 12 рыл. Требуется:
- Подключать педагогу при входе сетевой каталог который бы содержал в себе папки всех 5-ти групп (допустим для проверки заданий);
- Педагог должен иметь доступ к детским папкам на запись;
- Каждой группе детей при входе подключается их сетевой диск, который содержит папки с фамилиями ребят. Лети не могут удалять папки с фамилиями из корневого каталога сетевого диска, но могут писать в своих папках. Также дети не могут создавать в корневом каталоге сетевого диска ни файлов, ни папок.
- Среди папок с фамилиями у каждой из групп есть папка Задания. Для детей доступ к этой папке только для чтения, для педагога на чтение-запись.
- Каждая группа детей не может получить доступ к папкам других групп.
Во как! Задачу сделаю в виде приложения, а то форум опять будет ругаться, что я превысил 30000 знаков в сообщении.