Приоритет ACLS, когда пользователь принадлежит нескольким группам

Если файл имеет записи ACL для двух групп, предоставляя им разные разрешения, например:

group:admin:rw- group:staff:r-- 

какие разрешения имеет пользователь, если он принадлежит к обеим группам? Какая запись имеет приоритет? Эксперимент, похоже, показывает, что применяются самые ограничительные разрешения. Если да, то каков наилучший способ справиться с ситуациями, когда я действительно хочу, чтобы члены одной группы имели повышенные привилегии, даже если они принадлежат к другим, более ограниченным группам?

Из стандарта :

В словах, Алгоритм определения общего доступа должен интерпретироваться следующим образом (это описание является свободным парафразом алгоритма определения общего доступа, который указан в подробном псевдокоде в менеджерах ACL):

  • Сопоставьте (в смысле, определенном в псевдокоде в менеджерах ACL) входящий PAC на ACLE доступа ACLE (в показанном сверху порядке: UO, U, FU, GO / G / FG, O, FO, AO), останавливаясь при первом таком совпадении (за исключением того, что все совпадения считаются «одновременно» в случае указанных групповых ACLE), и обратите внимание на разрешения, предоставленные согласованным ACLE (или, в случае группы – как ACLE, объединение разрешений, предоставленных всеми соответствующими ACLE).

  • Маска (то есть пересечь) полученные разрешения против разрешений в ACLE маски ACL, если это необходимо (а именно, маска с разрешениями MASK_OBJ, если совпадение произошло в центральном столбце 1 , и / или маску с UNAUTHENTICATED разрешениями, если PAC не аутентифицирован ). (Если ACL Manager не поддерживает эти две маски ACLE, этот шаг является нулевой операцией.)

(акцент в оригинале, добавлена ​​сноска)

То есть, если есть файл с правами пользователя и группы root и разрешениями 0600 называемые acl-test , содержащие однострочное read possible , то:

 $ getfacl acl-test # file acl-test # owner: root # group: root user::rw- group::--- other::--- 

Теперь, если я (как пользовательский fox ) попытаюсь сделать это:

 $ cat acl-test cat: acl-test: Permission denied 

Групповые разрешения объединены

Я попадаю в группы users и wheel , поэтому мы можем добавлять определенные списки ACL для этих групп:

 # setfacl -mg:users:--- -mg:wheel:r-- acl-test $ cat acl-test read possible 

Это связано с тем, что записи в group (считающиеся одновременно) позволяют разрешить чтение одной из моих групп. Их можно комбинировать:

 # setfacl -mg:users:-w- acl-test $ getfacl acl-test # file: acl-test # owner: root # group: root user::rw- group::--- group:wheel:r-- group:users:-w- mask::rw- other::--- $ printf '%s\n' 'write possible' >> acl-test $ cat acl-test read possible write possible 

Поэтому теперь я могу читать и писать файл, даже если группы, разрешающие эти разрешения, не являются одной и той же группой.

Разрешения для пользователя переопределяют все группы

Поскольку правила пользователя применяются перед групповыми правилами, мы все равно можем ограничить данного пользователя чтением и / или записью содержимого:

 # setfacl -mu:fox:--- acl-test $ getfacl acl-test # file: acl-test # owner: root # group: root user::rw- user:fox:--- group::--- group:wheel:r-- group:users:-w- mask::rw- other::--- $ cat acl-test cat: acl-test: Permission denied 

Маска, если она установлена, перекрывает почти все

Если файл предназначен для по-настоящему доступного для чтения только для любого пользователя, кроме владельца:

 # setfacl -xu:fox -mg::rw- -mm:r-- acl-test $ getfacl acl-test # file: acl-test # owner: root # group: root user::rw- group::rw- #effective:r-- group:wheel:r-- group:users:-w- #effective:--- mask::r-- other::--- $ printf '%s\n' 'now writing is impossible' >> acl-test bash: acl-test: Permission denied # printf '%s\n' 'owner can still write' >> acl-test 

Интересно, что маска не отменяет другие права, поэтому:

 # setfacl -xg:users -xg:wheel -mo:rw- -n acl-test $ getfacl acl-test # file: acl-test # owner: root # group: root user::rw- group::rw- #effective:r-- mask::r-- other::rw- $ printf '%s\n' 'others can write now' >> acl-test # chown :users acl-test $ printf '%s\n' 'but not members of the owning group' >> acl-test bash: acl-test: Permission denied 

1 « Центральный столбец» относится к этому изображению и содержит все, кроме UO и O, поэтому владелец и другие пользователи не подвержены влиянию маски. Все группы и пользователи, не владеющие определенными правилами, подвергаются воздействию.