ActiveDirectory/Отображение прав доступа при использовании cifsacl
Введение
Linux предоставляет несколько различных способов отображения прав доступа на общих ресурсах. Один из них - cifsacl, транслирующий права доступа Windows в стандартные права доступа, используемые в *-nix совместимых системах.
Главное отличие - права в Windows задаются в виде списка управления доступом (DACL) для множества различных субъектов, в отличие от ограниченного набора из трех субъектов (владелец, группа, другие) в Linux. Эта статья объясняет, как транслируются права при использовании cifsacl на общих ресурсах.
Примечание: в статье не рассматриваются права доступа при помощи Unmapped UNIX Users/Groups (SID начинающиеся на S-1-5-88- и S-1-22-)
См. https://technet.microsoft.com/en-us/library/hh509017(v=ws.10).aspx
Различия в перечислении пользователей и групп
В Windows учетные записи представлены как уникальный идентификатор SID с закрепленным за ним именем. Пользователи и группы разделяют общие множества имен и идентификаторов, поэтому каждое имя учетной записи (пользователь или группа) и его идентификатор уникальны и не повторяются.
В Linux пользователи и группы представлены как целочисленный идентификатор с закрепленным за ним именем. Эти множества идентификаторов и имен раздельные, поэтому одно и тоже имя или целочисленный идентификатор могут использоваться как для пользователя, так и для группы. Отличие пользователя от группы определяется лишь контекстом, где они используются.
Так как идентификаторы учетных записей различаются между двумя системами, то для этого используется сопоставление SID идентификаторов пользователям/группам в Linux, которое производится клиентской службой winbind или sssd. Чаще всего, идентификаторы выделяются из заранее определенного диапазона по мере появления новых учетных записей, либо по алгоритму, который стремится к выделению одинаковых идентификаторов на разных компьютерах (см. Winbind/IDMapping).
Учетные записи пользователей и групп используются для определения и обозначения принадлежности файлов. Файлы на Windows имеют владельца и основную группу, как и на Linux. Но так как в Windows учетные записи пользователей и групп разделяют общие множества идентификаторов и имен, то владельцем файла может быть группа, а группой - пользователь. Это приводит к определенному поведению при трансляции прав доступа, описанному далее.
Чтобы разобраться, как работает трансляция прав доступа, необходимо понимать, как работают системы прав доступа в каждой из ОС по отдельности.
Права доступа в Windows
Каждый файл и директория в файловой системе NTFS, используемой в Windows, содержит информацию о его владельце (его SID), группе (ее SID), список контроля доступа (DACL), список событий аудита (SACL) и набор атрибутов (например, «только для чтения» и «системный файл»).
Владельцу файла всегда разрешено изменять любые атрибуты файла, включая список управления доступа (DACL). Группа файла не используется в Windows, но требуется работы с *-nix совместимыми системами.
DACL содержит в себе записи контроля доступа (ACE). Их может быть несколько или ни одной. Каждая запись включает в себя действие (разрешить/запретить), SID субъекта, маску доступа и флаги наследования. Флаги наследования контролируют, как записи ACE распространяются от директории к файлам и подкаталогам внутри нее.
В контексте прав доступа к файлам и директориям, важны лишь два типа ACE: разрешающие и запрещающие доступ (остальные типы используются для аудита и объектов службы каталогов AD). Разрешающие ACE предоставляют права доступа, указанные в маске доступа, а запрещающие отзывают права доступа. Запрещающие ACE имеют приоритет над разрешающими (всегда находятся выше разрешающего ACE для того же субъекта в списке).
Каждый ACE содержит один SID, который обозначает или пользователя, или группу. Маска доступа является набором битов (см .табл. 2 в прим.) , которые представляют определенные права доступа, которые требуется разрешить или запретить для указанного SID. Несмотря на то, что NTFS предоставляет большой набор прав доступа, обычно они не отображаются в явном виде. Заместо них отображаются комбинации этих прав под именами, например, «Чтение и выполнение», «Изменение» или «Полный доступ» (см. табл. 3 в прим.).
Сложение всех отдельных ACE вместе и является эффективными (действительными) правами доступа, предоставляемыми ACL.
При доступе к файлу или директории, происходит запрос необходимых прав доступа для работы с ним (достаточных для выполнения операции) и проверяется DACL:
- Если файл не содержит DACL, то никакой защиты нет и любой доступ/права разрешены всем пользователям.
- Если файл содержит DACL, но в нем нет ни одной ACE, то доступ запрещен всем пользователям.
- Иначе, каждый ACE проверяется на наличие запрошенных прав и разрешение на них:
- Если SID текущего ACE совпадает с SID пользователя (или одной из его групп), то проверяется маска доступа ACE:
- Если это разрешающий ACE, все указанные в маске доступа права предоставляются.
- Если запрошенные права предоставлены, то запрос успешен и проверка DACL завершается (т.к. первое вхождение необходимого права является конечным, которое будет использовано)
- Если это запрещающий ACE и хотя бы одно из прав доступа в маске совпадают с запрошенными правами, то запрос отвергается.
- Если SID текущего ACE совпадает с SID пользователя (или одной из его групп), то проверяется маска доступа ACE:
- Если список DACL подошел к концу и некоторые права не были предоставлены, то запрос отвергается.
Права доступа в Linux
Полную информацию о том, как работают права доступа в Linux, можно посмотреть в странице man для утилиты chmod.
Отсутствие накопления/сложения прав доступа
Важно помнить, что права доступа для “других” относятся к пользователям, исключая владельца и пользователей, состоящих в группе файла/директории (иначе говоря, остальные пользователи, которым явно не указаны права доступа). Таким же образом, права доступа назначенные группе файла/директории относятся к любому пользователю состоящему в этой группе исключая владельца (даже если он сам состоит в этой группе).
Например, пользователь foo может читать, записывать и исполнять файл a.out и любой пользователь состоящий в группе bar, исключая foo, может читать и исполнять файл, но не записывать в него. Любой другой пользователь, не являющийся foo и не входящий в группу bar может только прочитать файл a.out.
-rwxr-xr-- 1 foo bar 342 Aug 27 00:20 a.out
Второй пример:
-r--r-xrwx 1 foo bar 0 Sep 13 19:45 a.out1
Эти права означают, что foo может только прочитать файл a.out1, тогда как любой пользователь входящий в группу bar может прочитать и выполнить его. Остальные пользователи, не являющиеся foo и не входящие в группу bar, могут прочитать, записать и выполнить файл. Даже если бы foo входил в группу bar, он бы все равно не смог выполнить файл.
Преобразование прав Linux на права Windows
При преобразовании прав Linux в DACL, каждая маска прав (владелец, группа или другие) преобразовывается хотя бы в одну ACE, с итоговым количеством минимум в три ACE. Одна из ACE отображает права владельца файла, другая отображает права группы и последняя права "других" пользователей (используется SID «Все»). В дополнение к трем основным ACE могут быть запрещающие ACE для владельца или группы. Существование этих ACE зависит от прав доступа между тремя субъектами (об этом будет подробнее далее).
По умолчанию, все разрешающие ACE содержат следующие права доступа:
- Чтение разрешений
- Чтение дополнительных атрибутов
- Чтение атрибутов
- Synchronize
Эти права всегда присутствуют в таких ACE для поддержки семантики/правил прав доступа Linux/UNIX. Например, UNIX позволяет всем пользователям просматривать права доступа на файле/директории. Поэтому, чтобы ls/stat мог работать и возвращать результат, необходимо иметь права на просмотр DACL, атрибутов (например, его размер, сами атрибуты, временные метки (даты) и расширенные атрибуты).
Существуют и дополнительные права доступа, которые всегда назначаются на разрешающем ACE для владельца. Они также необходимы для поддержки прав доступа Linux/UNIX. Следующие права являются необходимыми:
| Удаление | разрешает владельцу удалять файл |
| Смена разрешений | разершает изменение ACE в DACL (например, chmod(2)) |
| Смена владельца | необходим для работы chown(2) |
| Запись расширенных атрибутов | разрешает запись расширенных атрибутов (например, setfattr(1)) |
| Запись атрибутов | необходим для изменения временных меток (например, utimes(2)) |
Дополнительно, если установлен бит права на чтение в Linux, добавляется право «Содержание папки / чтение данных» в ACE. Если бит установлен на директории, это разрешает просмотр ее содержимого. Когда бит установлен на файле, это разрешает его чтение. Если установлен бит исполнения, то добавляется право «Траверс папок / выполнение файлов» в ACE. Для директорий это право разрешает доступ к подкаталогам/файлам по их имени (полному пути). Для файлов разрешается их исполнение.
Если установлен бит записи, то добавляются следующие права:
| Создание файлов / запись данных | для файлов – разрешает запись в файл для директорий – разрешает создавать новые файлы. |
| Запись атриубтов | разрешает изменять атрибуты файлов (например, временные метки) |
| Создание папок / дозапись данных | для файлов - разрешает запись в конец файла (флаг O_APPEND) для директорий – разрешает создавать новые подкаталоги |
| Удаление подпапок и файлов | для директорий – разрешает удаление дочерних файлов и директорий вне зависимости от прав DACL на данных объектах (наличия права «Удаление» на них) |
Обратите внимание, что Windows использует четыре раздельных права доступа вместо одного разрешения на запись в Linux. В Linux, разрешение на запись для директории разрешает как создание, так и удаление новых файлов или подкаталогов в этой директории. В Windows, право «Создание файлов / запись данных» отвечает за создание новых дочерних файлов, а право «Удаление подпапок и файлов» за их удаление. Право «Удаление подпапок и файлов» не всегда присутствует во всех ACE. В случае Linux, где sticky-бит установлен, право «Удаление подпапок и файлов» будет установлено только в ACE владельца файла и ни на каком другом ACE. Это будет разрешать только владельцу директории удалять файлы или подкаталоги из этой директории вне зависимости от владельца этих дочерних файлов/каталогов. Другие пользователи смогут удалять файлы и подкаталоги только если им предоставлено право «Удаление» в ACE самого файла или подкаталога.
Пример: создадим файл foobar на общей папке Samba (для наглядности - с отключенным наследованием) владельцем которого будет User1, а группа Group1. Затем, мы изменим права доступа при помощи утилиты chmod таким образом, что у файла нет никаких прав доступа. Затем, мы отобразим права доступа для Windows при помощи getcifsacl которая отобразит все ACE из DACL и права в них.
$ chmod 000 foobar
$ getcifsacl foobar
WARNING: Insufficient priviledges to fetch SACL for foobar
Fetching owner info and DACL only
# filename: foobar
REVISION:0x1
CONTROL:0x9804
OWNER:user1
GROUP:group1
DACL:
ACL:user1:ALLOWED/0x0/0x40
ACL:group1:ALLOWED/0x0/0x40
ACL:Everyone@WORLD AUTHORITY:ALLOWED/0x0/0x40
No SACL
Существуют ситуации в которых один или два запрещающих ACE должны быть добавлены в DACL. Алгоритм доступа к файлам в Linux различает владельца, группу и остальных таким образом, что каждый из них уникален и идентификатор используемый при запросе доступа может быть сопоставлен только с одним из них. Но алгоритм доступа к файлам в Windows не имеет такого различия при анализе DACL. Если субъекту запроса прав предоставлено разрешение в одном из ACE, то запрос успешен. Это является проблемой, когда права для владельца более ограничивающие чем для группы или для остальных (например, при выполнении chmod 577 foobar).
Поэтому, для поддержки семантики/правил прав Linux, сначала просматриваются права доступа для остальных и если они менее ограничивающие чем для группы, то создается дополнительный запрещающий ACE для группы. По такому же принципу, если права доступа для группы или других менее ограничивающие чем для владельца, то создается запрещающий ACE для владельца.
Пример: (на том же файле foobar, с владельцем User1 и группой Group1) изменим права доступа файла на r-xrwxr-x (т.е. chmod 575 foobar). Так как права группы разрешают запись, но владельцу она запрещена, то создается запрещающий ACE для владельца, который явно указывает запрет записи.
$ chmod 575 foobar
$ getcifsacl foobar
WARNING: Insufficient priviledges to fetch SACL for foobar
Fetching owner info and DACL only
# filename: foobar
REVISION:0x1
CONTROL:0x9804
OWNER:user1
GROUP:group1
DACL:
ACL:user1:DENIED/0x0/WDPO
ACL:user1:ALLOWED/0x0/0x1f01f9
ACL:group1:ALLOWED/0x0/FULL
ACL:Everyone@WORLD AUTHORITY:ALLOWED/0x0/0x1f01f9
No SACL
Аналогично, если права доступа предоставленные остальным менее ограничивающие чем те, что выданы группе, создается запрещающий ACE для группы:
$ chmod 757 foobar
[user1@client1 Folder]$ getcifsacl foobar
WARNING: Insufficient priviledges to fetch SACL for foobar
Fetching owner info and DACL only
# filename: foobar
REVISION:0x1
CONTROL:0x9804
OWNER:user1
GROUP:group1
DACL:
ACL:user1:ALLOWED/0x0/FULL
ACL:group1:DENIED/0x0/WDPO
ACL:group1:ALLOWED/0x0/0x1f01f9
ACL:Everyone@WORLD AUTHORITY:ALLOWED/0x0/FULL
No SACL
Так как в Windows владельцем файла может быть не только пользователь, а и группа, а группа файла - пользователем, то при установке прав доступа в таких случаях будут созданы две записи с одним и тем же SID и одинаковыми правами:
$ smbcacls //fs.samdom1.alt/Share /foobar -C group1
$ chmod 444 foobar
$ getcifsacl foobar
WARNING: Insufficient priviledges to fetch SACL for foobar
Fetching owner info and DACL only
# filename: foobar
REVISION:0x1
CONTROL:0x9804
OWNER:group1
GROUP:group1
DACL:
ACL:group1:ALLOWED/0x0/0x1f01d9
ACL:group1:ALLOWED/0x0/0x1f01d9
ACL:Everyone@WORLD AUTHORITY:ALLOWED/0x0/0x1f01d9
No SACL
Особенности при работе с chmod и chown
При изменении прав доступа при помощи chmod, существующие ACE (в том числе и наследованные) могут быть изменены для установки запрошенных прав доступа. В результате, изначальное поведение прав доступа может измениться.
Это применяется ко всем файлам и директориям. Данную особенность требуется учитывать при работе с одними и теми же файлами в смешанных окружениях, где используется Windows и Linux.
Для изменения и просмотра DACL рекомендуется использовать утилиты smbcacls, getcifsacl и setcifsacl.
При создании новых файлов и директорий на общем ресурсе, наследование и наследуемые права родительской директории будут учтены.
Некоторые программы при копировании файлов и директорий могут попытаться задать права доступа как на изначальных файлах после копирования и это приведет к неверным правам доступа (например, параметр "сохранять атрибуты" в mc).
При назначении владельца и группы при помощи chown могут быть изменены существующие ACE, как и при работе с chmod.
Группа как владелец, пользователь как группа
Так как в Windows владельцем файла не всегда является пользователь, то Linux не будет отображать группу как владельца (будет отображать пользователя, указанного в параметре uid опций монтирования), так и не позволит ее задать как владельца через утилиту chown.
Права доступа, в случае совпадения владельца и группы (т. е. оба группа), не будут указаны для группы, но фактически будут соблюдаться и пользователь, состоящий в группе файла сможет, например, записать в файл.
При задании прав доступа через chmod, в случае совпадения владельца и группы (т. е. оба группа), устанавливаются более запрещающие права из двух субъектов. Например, если пользователь потребовал установить права 644, то из 6 для владельца и 4 для группы, будут выбраны права 4 для обоих и результирующие права будут 444.
Аналогичное поведение присутствует и для случая, когда группой файла является пользователь.
Примечание: в текущей версии ядра Linux 6.17 установка прав доступа при совпадающих владельце и группе файла работает некорректно, стоит избегать таких сценариев до исправления проблемы.
Отображение прав Windows на права Linux
В Windows права доступа хранятся в DACL связанного с каждый файлом. DACL позволяет создавать записи для разграничения прав доступа для множества различных пользователей и/или групп. Но Linux позволяет задать права доступа лишь на три категории пользователей и назначить им три права. Поэтому, при попытке программы в Linux запросить права доступа, должна быть проведена трансляция(отображение) прав из DACL на девять бит прав доступа.
Примечание: при этом, права доступа могут быть все равно предоставлены, даже если они не отображаются ни на один из трех субъектов.
Процесс начинается с итерации по всем ACE в DACL, где отбираются сначала разрешающие и запрещающие ACE, а затем отбираются только те ACE, которые содержат SID владельца файла, SID группы файла или SID «Все» или «Прошедшие проверку».
Из отобранных ACE извлекаются права доступа и помещаются в одну из трех "коллекций": владелец , группа и "другие". Эти коллекции соответствуют трем субъектам в Linux и используются в конце при отображении прав доступа на девять бит доступа. Каждая из этих коллекций содержит набор разрешенных и запрещенных прав, чтобы сохранить различие между двумя типами ACE. Если при итерации по ACE находится запрещающий ACE, права доступа добавляются в набор запрещенных прав только если уже не существует того же права в разрешающем наборе. Для разрешающей ACE права будут добавлены в разрешающий набор только если уже не существует того же права в запрещающем наборе.
Важно: порядок ACE в DACL имеет значение, т.к. первое появление права доступа в списке определяет, будет ли данное право доступа разрешено или запрещено.
Права доступа из ACE с SID «Все» или «Прошедшие проверку» SID попадают во все три коллекции. Это связанно с тем, что права доступа для этих SID применяются ко всем возможным пользователям и поэтому применяются ко всем трех субъектам. Права доступа из ACE для владельца файла сохраняются в коллекцию "владельца" и права доступа из ACE для группы сохраняются в коллецию "группы".
Когда все ACE проверены и распределены по коллекциям, полученные наборы предоставленых прав в каждой коллекции используются для задания девяти бит прав доступа.
Алгоритм работы назначения прав доступа:
- Если DACL не был найден, то права автоматически устанавливаются как 777 (полный доступ всем) и обработка заканчивается.
- Если DACL не содержит ни одного ACE, то права автоматически устанавливаются как 000 (доступ запрещен всем) и обработка заканчивается.
- Для каждой ACE из DACL файла:
- Пропустить ACE, если она не является разрешающей или запрещающей
- Если ACE предназначена для «Все» или «Прошедшие проверку», то добавить разрешающие или запрещающие права доступа в коллекции "владелец", "группа" и "другие".
- Если ACE запрещающая, то добавить каждое право доступа в набор запрещенных прав в каждую коллекцию, но только если право доступа не присутствует в наборе разрешенных прав доступа в этой(текущей) коллекции. Таким же образом, если это разрешающая ACE, то добавить каждое право доступа в набор разрешенных прав в каждой коллекции, но только если право доступа не присутствует в наборе запрещенных прав доступа в этой(текущей) коллекции.
- Если ACE предназначена для группы файла (можно задать через chown, по умолчанию является основной группой пользователя в момент создания), то добавить права доступа в коллекцию "группа" в подходящие наборы разрешенных или запрещенных прав доступа (как описано выше).
- Если ACE предназначена для владельца файла , то добавить права доступа в коллекцию "владелец" в подходящие наборы разрешенных или запрещенных прав доступа (как описано выше).
После этого, коллекции преобразовываются в девять бит доступа. Для каждой коллекции:
- Если присутствует право «Содержание папки / чтение данных», то устанавливается соответствующий бит r
- Если присутствуют права «Создание файлов / запись данных» и «Создание папок / дозапись данных», то устанавливается бит w
- Если присутствует право «Траверс папок / выполнение файлов», то устанавливается бит x.
Краткий список особенностей при работе с cifsacl
- Планирование прав доступа становится сложнее
- Права для владельца должны быть явными - заданными на конкретного пользователя, либо через наследование права на «СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ» от родительских директорий
- Не рекомендуется отключать наследование прав доступа без необходимости
- Доступ к файлу/директории все равно может быть предоставлен, т. к. есть запись в ACL для текущего пользователя/группы, даже если они не отображаются ни на один из трех субъектов.
- При копировании файлов права будут упрощены (из-за особенностей преобразования прав доступа между системами)
- Права, владелец и группа локального файла на Linux, даже если они являются доменными, не будут учитываться
- Текущая основная группа пользователя будет использоваться при создании/копировании файлов на общий ресурс
- При копировании директорий на клиенте Windows права на «остальные» не будут заданы, если нет соответствующего ACL для «Все»/«Прошедшие проверку» на родительской директории
- Изменение прав доступа и владельцев (через chmod и chown) может приводить к упрощению ACL и, соответственно, изменению наследуемых/наследованных прав
- При смене основной группы пользователя, на клиенте может оставаться старая группа, поэтому необходимо очищать кэш
- sssd: sssctl cache-remove
- winbind: перезагрузка клиента
- Для доверенных доменов необходимо добавить права для «Прошедшие проверку» для разрешения чтения (доступа к общему ресурсу) пользователям из доверенных доменов.
- При отсутствии связи с доверенными доменами и наличии ACE с SID из этих доменов, возможна задержка при получении списка файлов и их прав доступа
- (требует исправления в ядре) При установке прав доступа при одинаковых владельце и группе файла, будет выбран наиболее запрещающий вариант из двух для обоих субъектов (644 → 444, 464 → 444)
- При выводе прав доступа через ls/stat права будут отображаться только у владельца
- Сервер может отклонять/разрешать запрос на те или иные действия, если он посчитает это нужным (например, недостаточно прав доступа на файловой системе сервера)
Примеры
Все примеры будут продемонстрированы на общей директории на отдельном файловом сервере Samba. Не рекомендуется создавать общие ресурсы на контроллерах домена.
Настройка общего ресурса
Доступ к общему ресурсу разрешен всем, включено использование ACL Windows. Запись в корень общей директории разрешена администратору и группе «Администраторы домена».
$ mkdir /srv/Share $ chown root:"domain admins" /srv/Share $ chmod 775 /srv/Share
Примечание: установка прав доступа необходима для создания изначального ACL, где владельцем будет администратор домена, что позволит его изменить. В противном случае, установка прав доступа будет возможна через samba-tool ntacl.
Описание общего ресурса в файле /etc/samba/smb.conf:
[Share] path = /srv/Share read only = No vfs objects = acl_xattr acl_xattr:ignore system acls = yes
После добавления общего ресурса и перезапуска службы Samba, назначьте владельца как «Администратор», добавьте следующую строку для завершения включения поддержки Windows ACL и перезапустите службу снова:
[Share] ... acl_xattr:default acl style = windows
Убедитесь, что на директории отсутствуют POSIX ACL, т. к. они будут учитываться после проверки прав доступа через Windows ACL. Проверьте их наличие через getfacl и удалите через setfacl, если требуется:
$ getfacl /srv/Share $ setfacl -b /srv/Share
Таким образом, права на сервере в Linux для общей директории (ее корня) должны быть такими, чтобы пользователь, которому разрешен доступ в Windows ACL мог делать это же самое и как пользователь Linux (невозможно совершить запись - нет разрешения на уровне ОС, а не сервера Samba). Последующие файлы/директории создаются с правами 666/777 (см. man vfs_xattr), что приводит к проверке только на уровне Windows ACL, т. к. "всем" разрешена запись.
Учтите, что наличие прав доступа для default в POSIX ACL заменит это поведение.
Следующие права доступа заданы на саму общую папку:
Вывод getcifsacl:
REVISION:0x1 CONTROL:0x9c14 OWNER:administrator GROUP:domain admins DACL: ACL:CREATOR OWNER@CREATOR AUTHORITY:ALLOWED/OI|CI|IO/0x1301ff ACL:LOCAL SYSTEM@NT AUTHORITY:ALLOWED/0x0/FULL ACL:administrator:ALLOWED/OI|CI/FULL ACL:domain users:ALLOWED/OI|CI/READ ACL:domain admins:ALLOWED/OI|CI/FULL No SACL
Таким образом, мы имеем изначальный доступ на чтение для всех пользователей домена, а администраторы, состоящие в группе «Администраторы домена», имеют доступ для создания новых директорий и файлов, могут менять права для них и их структуру.
Примечание: в этом примере нет прав доступа для других (остальных) пользователей - не входящих ни в одну из указанных групп или пользователей из доверенных доменов (SID «Все» или «Прошедшие проверку»).
Права доступа при создании файлов на разных ОС
При создании файлов из различных ОС и различными способами, могут быть назначены разные права.
Для примера, будет создана директория Test1, где будет разрешена запись и удаление новых файлов/директорий для «Пользователи домена» (помимо остальных прав доступа, унаследованных от общего ресурса).
Linux
После создания файла при помощи команды touch, следующие права назначаются для файла:
Обратите внимание, что ACL c «СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ» был преобразован в ACL для TestUser, который и создавал файл. В некоторых случаях, будут созданы дополнительные ACE, которые соответствуют трем субъектам в Linux, вместе с наследуемыми ACE.
При копировании/перемещении директорий и файлов в Linux, вы можете встретиться с двумя вариантами:
- копирование происходит с попыткой установки прав доступа как на Linux, с преобазованием (например, при копировании в файловом менеджере)
$ ls -lad dir drwxr-xr-x 2 administrator domain users 0 ноя 21 14:00 dir
- копирование происходит как на Windows, с заданием прав по DACL (например, при выполнении операций напрямую через cp, mv, mkdir и т.д.)
$ ls -lad dir drwxrwx--- 2 administrator domain users 0 ноя 21 14:27 dir
Windows
При создании файла права идентичны с правами на Linux:
При копировании/перемещении Windows не назначает права для «остальных», как это может делать Linux, т. к. Windows следует DACL и наследуемым правам, а преобразование прав на Linux создает дополнительный ACL для «остальных».
$ ls -lad dir-win drwxrwx--- 2 administrator domain users 0 ноя 21 13:59 dir-win
Как назначать права при отключенном наследовании
При отключенном наследовании необходимо явно разрешать и явно запрещать те или иные права для каждого из трех субъектов в Linux.
Отсутствие ACL для конкретного пользователя, предполагающегося владельцем, или ACL для «СОЗДАТЕЛЬ-ВЛАДЕЛЕЦ», приведет к тому, что владелец не сможет прочитать или записать файл, т. к. сопоставить для «владельца» из DACL будет нечего. Такие же правила распространяются и на остальных субъектов.
Если группе не выдано право на запись, то недостаточно убрать это право в разрешающем ACL. Необходимо создать запрещающий ACL для этого права.
Если для остальных пользователей «Все» это право есть, то на стороне Windows пользователь, состоящий в этой группе сможет записать в файл, т. к. нет явного запрета.
Просмотр и изменение DACL
Утилиты getcifsacl и setcifsacl работают только с примонтированными общими ресурсами. smbcacls, наоборот, работает напрямую с сетевым ресурсом на сервере Samba.
getcifsacl
Использование: getcifsacl <имя_файла>
$ getcifsacl file.txt # filename: file.txt REVISION:0x1 CONTROL:0x8414 OWNER:testadmin GROUP:domain admins DACL: ACL:domain users:ALLOWED/I/0x1201ff ACL:domain users@msdom.alt:ALLOWED/I/CHANGE ACL:testadmin:ALLOWED/I/0x1301ff ACL:administrator:ALLOWED/I/FULL ACL:domain users:ALLOWED/I/READ ACL:domain admins:ALLOWED/I/FULL No SACL
Дополнительные флаги:
-R рекурсивный вывод ACL из текущей директории и всех подкаталогов
-r отобразить «сырые» (без преобразования) значения полей
setcifsacl
Использование: setcifsacl <параметры> <имя_файла>
Владелец или группа может быть указан как имя или как полный идентификатор SID. Каждая запись ACE начинается с "ACL:". Один и более ACE указываются в двойных кавычках. Несколько ACE разделяются запятой.
Полный формат записи: "ACL:<SID>:<type>/<flags>/<mask>"
Следующие поля и их возможные значения могу быть указаны:
- SID - Имя или полный идентификатор SID.
- type - ALLOWED (0x0), DENIED (0x1), OBJECT_ALLOWED (0x5), OBJECT_DENIED (0x6)
- flags - OBJECT_INHERIT_FLAG (OI или 0x1), CONTAINER_INHERIT_FLAG (CI или 0x2), NO_PROPAGATE_INHERIT_FLAG (NI или 0x4), INHERIT_ONLY_FLAG (IO или 0x8), INHERITED_ACE_FLAG (IA или 0x10) или комбинация/сумма этих значений.
- mask - FULL, CHANGE, READ, или комбинация флагов R W X D P O, или шестнадцатеричное число/значение.
Операции:
-a Добавить один или несколько ACE, указанных через запятую, в ACL
$ setcifsacl -a "ACL:Administrator:ALLOWED/0x0/FULL" <file_name> $ setcifsacl -a "ACL:SAMDOM1\user2:DENIED/0x1/D" <file_name> $ setcifsacl -a "ACL:SAMDOM1\user1:ALLOWED/OI|CI|NI/D" <file_name>
-A Добавить один или несколько ACE и отсортировать, указанных через запятую, в ACL
$ setcifsacl -A "ACL:Administrator:ALLOWED/0x0/FULL" <file_name>
Пример сортировки:
$ setcifsacl -A "ACL:SAMDOM1\user3:ALLOWED/OI/FULL" <file_name> $ setcifsacl -A "ACL:SAMDOM1\user2:DENIED/0x1/D" <file_name> $ setcifsacl -A "ACL:SAMDOM1\user1:ALLOWED/OI|CI|NI/D" <file_name>
После установки указанных ACE, следующий вывод будет получен от getcifsacl (запрещающее правило переместилось наверх):
ACL:SAMDOM1\user2:DENIED/0x1/D ACL:SAMDOM1\user3:ALLOWED/OI/FULL ACL:SAMDOM1\user1:ALLOWED/OI|CI|NI/D
-D Удалить один или несколько ACE, указанных через запятую, из ACL
$ setcifsacl -D "ACL:Administrator:DENIED/0x0/D" <file_name> $ setcifsacl -D "ACL:S-1-1-0:0x1/OI/0x1201ff" <file_name>
-M Изменить один или несколько ACE, указанных через запятую, в ACL
$ setcifsacl -M "ACL:user1:ALLOWED/0x0/0x1e01ff" <file_name> $ setcifsacl -M "ACL:SAMDOM1\user1:ALLOWED/0x1f/CHANGE" <file_name>
-S Заменить/установить существующий ACL на один или несколько ACE, указанных через запятую
$ setcifsacl -S "ACL:Administrator:ALLOWED/0x0/D" <file_name> $ setcifsacl -S "ACL:SAMDOM1\Administrator:0x0/0x0/FULL,ACL:SAMDOM1\user2:0x0/0x0/FULL" <file_name>
-o Установить владельца, используя указанный SID (имя или полный идентификатор; не поддерживается указание группы)
$ setcifsacl -o "Administrator" <file_name> $ setcifsacl -o "S-1-5-21-3338130290-3403600371-1423429424-2102" <file_name>
-g Установить группу, используя указанный SID (имя или полный идентификатор; не поддерживается указание пользователя)
$ setcifsacl -g "Administrators" <file_name> $ setcifsacl -g "Administrators@BUILTIN" <file_name>
smbcacls
smbcacls позволяет просматривать и изменять DACL на общем ресурсе используя UNC-путь к нему.
Использование: smbcacls <операции> //<имя сервера>/<имя общего ресурса> /<путь к файлу>
Примечание: путь к файлу указывается раздельно через пробел от имени ресурса
Формат записи: "ACL:<SID>:<type>/<flags>/<mask>"
Несколько ACE могут быть указаны через запятую.
Следующие поля и их возможные значения могу быть указаны:
- SID - Имя или полный идентификатор SID.
- type - ALLOWED или DENIED
- flags - возможно указание только короткого варианта или шестнадцатеричного значения; OBJECT_INHERIT_FLAG (OI или 0x1), CONTAINER_INHERIT_FLAG (CI или 0x2), NO_PROPAGATE_INHERIT_FLAG (NP или 0x4), INHERIT_ONLY_FLAG (IO или 0x8), INHERITED_ACE_FLAG (I или 0x10) или комбинация/сумма этих значений.
- mask - FULL, CHANGE, READ, или комбинация флагов R W X D P O, или шестнадцатеричное число/значение.
Операции:
-D|--delete=ACL Удаляет указанный(ые) ACE. При отсутствии ACE для удаления будет выведена ошибка.
$ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -D "ACL:Everyone:ALLOWED/0x0/0x001f01d9"
-M|--modify=ACL Изменяет тип, маску, флаги указанного ACE. При отсутствии ACE в ACL будет выведена ошибка. При совпадении субъектов в нескольких ACE, они могут быть объединены в одну запись.
В примере изменяются права для пользователя TestUser на READ.
$ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -M "ACL:SAMDOM1\TestUser:ALLOWED/0x0/READ"
-a|--add=ACL Добавляет указанный ACE в ACL. Существующие записи не будут затронуты.
$ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -a "ACL:Everyone:ALLOWED/0x0/0x001f01d9"
-S|--set=ACLS Перезаписывает ACL указанными ACE. Все существующие ACE будут удалены.
Может включать также поля OWNER и GROUP. Владелец и группа файла могут быть заданы как группа и пользователь соответственно.
$ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -S "ACL:testuser:ALLOWED/OI/FULL"
-C|--chown=USERNAME Изменяет владельца файла или директории. Может быть указано как имя, так и идентификатор SID. Владелец может быть заданы как группа.
$ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -C testadmin $ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -C "S-1-5-21-2094550305-557459636-1160440060-500"
-G|--chgrp=GROUPNAME Изменяет группу файла или директории. Может быть указано как имя, так и идентификатор SID. Группа может быть задана как пользователь.
$ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -G group2 $ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -G "S-1-5-21-2094550305-557459636-1160440060-512"
-I|--inherit=STRING Включает или отключает наследование (аналог настройки Windows «Заменить все записи разрешений дочернего объекта наследуемыми от этого объекта» и «Включение наследования»).
Чтобы включить наследование укажите allow. Чтобы удалить все наследованные ACE и отключить наследование укажите remove. Чтобы отключить наследование и скопировать наследуемые права укажите copy.
$ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -I allow $ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -I copy $ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt -I remove
--save=STRING Сохраняет DACL в формате SDDL указанного файла или директории для использования с командой restore. SACL, владелец, группа, данные о целостности не сохраняются.
$ smbcacls //fs.samdom1.alt/Share /Test1/file1.txt --save=dacl.txt
--restore=STRING Применяет сохраненные DACL из файла к указанным в нем файлам и директориям.
$ smbcacls //fs.samdom1.alt/Share / --restore=dacl.txt
Дополнительные флаги:
--recurse Рекурсивно сохраняет DACL директории, ее файлов и подкаталогов. Используется только с командой --save.
$ smbcacls //fs.samdom1.alt/Share /Test1 --save=dacl.txt --recurse
--propagate-inheritance Добавляет, изменяет, удаляет или устанавливает ACE на всех дочерних объектах исходя из правил наследования. (используется вместе с основными операциями удаления, добавления, изменения и установки ACL).
--numeric Позволяет отобразить всю информацию в изначальном численном виде. По умолчанию, smbcacls преобразовывает SID в имена учетной записи, а тип, флаги и маску ACE человекочитаемый формат.
$ smbcacls //fs.samdom1.alt/Share /Test1 --numeric Password for [TestAdmin@SAMDOM1.ALT]: REVISION:1 CONTROL:0x8c04 OWNER:S-1-5-21-2094550305-557459636-1160440060-500 GROUP:S-1-5-21-2094550305-557459636-1160440060-513 ACL:S-1-5-21-2094550305-557459636-1160440060-513:0/0x3/0x001201ff ACL:S-1-5-21-2094550305-557459636-1160440060-500:0/0x10/0x001301ff ACL:S-1-3-0:0/0x1b/0x001301ff ACL:S-1-5-21-2094550305-557459636-1160440060-500:0/0x13/0x001f01ff ACL:S-1-5-21-2094550305-557459636-1160440060-513:0/0x13/0x001200a9 ACL:S-1-5-21-2094550305-557459636-1160440060-512:0/0x13/0x001f01ff
--sddl Позволяет задавать и выводить ACL в формате SDDL.
Пример вывода DACL:
O:S-1-5-21-2094550305-557459636-1160440060-500G:S-1-5-21-2094550305-557459636-1160440060-513D:AI(A;OICI;0x1201ff;;;S-1-5-21-2094550305-557459636-1160440060-513)(A;ID;0x1301ff;;;S-1-5-21-2094550305-557459636-1160440060-500)(A;OICIIOID;0x1301ff;;;CO)(A;OICIID;FA;;;S-1-5-21-2094550305-557459636-1160440060-500)(A;OICIID;0x1200a9;;;S-1-5-21-2094550305-557459636-1160440060-513)(A;OICIID;FA;;;S-1-5-21-2094550305-557459636-1160440060-512)
-x|--maximum-access При отображении DACL, дополнительно запросить у сервера, какие эффективные(результирующие) права доступны текущему пользователю. Эта функция поддерживается только в протоколе SMB версии 2 и выше.
$ smbcacls //fs.samdom1.alt/Share /Test1 -x Password for [TestAdmin@SAMDOM1.ALT]: REVISION:1 CONTROL:SR|SI|DI|DP OWNER:SAMDOM1\Administrator GROUP:SAMDOM1\domain users ... Maximum access: 0x1f01ff
Примечание
Далее описаны флаги и права доступа, которые используются в ACE. Так как рассматривается контекст работы с файлами и директориями, то термин «контейнер» заменен на «директория», а «объект» - файл.
Следующие наборы флагов соответствуют вариантам параметра Windows «Применяется к:»
- отсутствуют или 0x00 - Только для этой папки
- (OI)(CI) - Для этой папки, ее подпапок и файлов
- (CI) - Для этой папки и ее подпапок
- (OI) - Для этой папки и ее файлов
- (OI)(CI)(IO) - Только для подпапок и файлов
- (CI)(IO) - Только для подпапок
- (OI)(IO) - Только для файлов
- (NP) - установлен параметр «Применять эти разрешения только к объектам и контейнерам внутри этого контейнера»
| Отсутствие флагов или 0x00 | Для файлов - поведение по умолчанию Для директорий - ACE не наследуется, применяется «только для этой папки» |
| (ID) или (I) INHERITED | Не может быть задан, лишь показывает, что ACE был унаследован от родительской директории (или другой вышестоящей в дереве/пути) |
| (OI) OBJECT_INHERIT_ACE | ACE будет унаследована всеми новыми файлами. Файлы наследуют ACE как действующую (применяемую к ним) ACE. Для директорий ACE наследуется как inherit-only ACE, если не установлен флаг NP. |
| (IO) INHERIT_ONLY_ACE | ACE используется только для наследования. Она показывает, что ACE не применяется к объекту, к которому она добавлена, а только к дочерним объектам (файлам или директориям). |
| (CI) CONTAINER_INHERIT_ACE | ACE будет унаследована новыми подкаталогами. Директории наследуют ACE как действующую (применяемую к ним) ACE. ACE будет наследуемой, если не установлен флаг NP. |
| (NP) NO_PROPOGATE_INHERIT_ACE | Установлен параметр «Применять эти разрешения только к объектам и контейнерам внутри этого контейнера», т. е. не распространять (прекратить) наследование дальше одного уровня (только для дочерних объектов) |
| (D) DELETE Удаление |
Разрешение на удаление этого файла |
| (RC) READ_CONTROL Чтение разрешений |
Разрешение на просмотр DACL, временных меток, информации о владельце, и прочих атрибутов файла |
| (P) WRITE_DAC Смена разрешений |
Разрешение на изменение DACL. |
| (O) WRITE_OWNER Смена владельца |
Разрешение на смену владельца |
| (S) SYNCHRONIZE | Разрешает или запрещает разным потокам процессов ожидать доступа к файлу или директории и синхронизироваться с другими потоками, которые могут уведомлять об этом. Это разрешение применяется только к многопоточным программам или программам с множеством процессов. |
| (R) FILE_READ_DATA Содержание папки / чтение данных |
Для файлов - разрешение на чтение файла Для директорий - разрешение на просмотр ее содержимого |
| (W) FILE_WRITE_DATA Создание файлов / запись данных |
Для файлов - разрешение на запись файла Для директорий - разрешение на создание новых файлов в директории |
| (A) FILE_APPEND_DATA Создание папок / дозапись данных |
Для файлов - разрешение на запись в конец файла (append) Для директорий - разрешение на создание новых подкаталогов |
| (E) FILE_EXECUTE Траверс папок / выполнение файлов |
Для файлов - разрешение на исполнение файла Для директорий - разрешает доступ к подкаталогам/файлам по их имени (полному пути) |
| (DC) DELETE_CHILD Удаление подпапок и файлов |
Разрешение на удаление файлов и подкаталогов (без наличия права DELETE на самих объектах) |
| (RA) FILE_READ_ATTRIBUTES Чтение атрибутов |
Разрешение на чтение аттрибутов |
| (WA) FILE_WRITE_ATTRIBUTES Запись атрибутов |
Разрешение на запись аттрибутов |
| (REA) FILE_READ_EA Чтение дополнительных атрибутов |
Разрешение на чтение расширенных аттрибутов |
| (WEA) FILE_WRITE_EA Запись дополнительных атрибутов |
Разрешение на запись расширенных аттрибутов |
| READ Чтение и выполнение |
Соответствует RC, S, R, E, REA, RA или GR,GE (универсальные наборы прав на чтение и исполнение, используются программами при доступе к файлу/директории; не назначаются) |
| CHANGE Изменение |
Соответствует D, RC, S, R, W, A, E, REA, WEA, RA, WA |
| FULL Полный доступ |
Соответствует D, RC, P, O, S, R, W, A, E, DC, REA, WEA, RA, WA |