5.4. Gerenciando ACLs

A Tabela 5.1, “Tipos de entrada de ACL” resume os seis tipos possíveis de entradas de ACL, cada um definindo permissões para um usuário ou um grupo de usuários. A entrada proprietário define as permissões do usuário proprietário do arquivo ou diretório. A entrada grupo proprietário define as permissões do grupo proprietário do arquivo. O superusuário pode mudar o proprietário ou o grupo proprietário com chown ou chgrp. Neste caso, as entradas de proprietário e grupo proprietário referem-se ao novo usuário e grupo proprietário. Cada entrada usuário nomeado define as permissões do usuário especificado no campo qualificador da entrada. Cada entrada grupo nomeado define as permissões do grupo especificado no campo qualificador da entrada. Somente as entradas usuário nomeado e grupo nomeado possuem um campo qualificador que não está vazio. A entrada outros define as permissões de todos os outros usuários.

A entrada máscara limita ainda mais as permissões concedidas pelas entradas usuário nomeado, grupo nomeado e grupo proprietário, pois define quais das permissões nessas entradas são efetivas e quais estão mascaradas. Se existirem permissões em uma das entradas mencionadas, assim como na máscara, elas serão efetivas. As permissões contidas somente na máscara ou somente na entrada real não são efetivas, significando que as permissões não são concedidas. Todas as permissões definidas nas entradas proprietário e grupo proprietário são sempre efetivas. O exemplo na Tabela 5.2, “Mascarando permissões de acesso” demonstra este mecanismo.

Existem duas classes básicas de ACLs. Uma ACL mínima contém somente as entradas dos tipos proprietário, grupo proprietário e outros, que correspondem aos bits de permissão convencionais para arquivos e diretórios. Uma ACL estendida vai além disso. Ela deve conter uma entrada máscara e pode conter várias entradas dos tipos usuário nomeado e grupo nomeado.

Tabela 5.1. Tipos de entrada de ACL

Tipo

Formato do texto

proprietário

user::rwx

usuário nomeado

user:name:rwx

grupo proprietário

group::rwx

grupo nomeado

group:name:rwx

máscara

mask::rwx

outros

other::rwx

Tabela 5.2. Mascarando permissões de acesso

Tipo de entrada

Formato do texto

Permissões

usuário nomeado

user:geeko:r-x

r-x

máscara

mask::rw-

rw-

permissões efetivas:

r--

5.4.1. Entradas de ACL e bits de permissão do modo do arquivo

A Figura 5.1, “ACL mínima: entradas de ACL comparadas a bits de permissão” e a Figura 5.2, “ACL estendida: entradas de ACL comparadas a bits de permissão” ilustram os dois casos de uma ACL mínima e de uma ACL estendida. As figuras são estruturadas em três blocos: o bloco esquerdo mostra as especificações de tipo das entradas de ACL, o bloco central mostra um exemplo de ACL e o bloco direito mostra os respectivos bits de permissão, de acordo com o conceito convencional de permissão; por exemplo, como mostrado pelo comando ls -l. Em ambos os casos, as permissões classe proprietária são mapeadas para a entrada de ACL proprietário. As permissões outra classe são mapeadas para a respectiva entrada de ACL. Porém, o mapeamento das permissões classe de grupo é diferente nos dois casos.

Figura 5.1. ACL mínima: entradas de ACL comparadas a bits de permissão

ACL mínima: entradas de ACL comparadas a bits de permissão

No caso de uma ACL mínima (sem máscara), as permissões classe de grupo são mapeadas para a entrada de ACL grupo proprietário. Você pode ver isso na Figura 5.1, “ACL mínima: entradas de ACL comparadas a bits de permissão”. No caso de uma ACL estendida (com máscara), as permissões classe de grupo são mapeadas para a entrada máscara. Você pode ver isso na Figura 5.2, “ACL estendida: entradas de ACL comparadas a bits de permissão”.

Figura 5.2. ACL estendida: entradas de ACL comparadas a bits de permissão

ACL estendida: entradas de ACL comparadas a bits de permissão

Este método de mapeamento assegura uma interação uniforme de aplicativos, tenham eles suporte a ACL ou não. As permissões de acesso que foram atribuídas através de bits de permissão representam o limite superior para todos os outros “ajustes finos” feitos com uma ACL. As mudanças feitas nos bits de permissão são refletidas pela ACL e vice-versa.

5.4.2. Diretório com uma ACL de acesso

Com getfacl e setfacl na linha de comando, você pode acessar ACLs. O uso desses comandos é demonstrado no exemplo a seguir.

Antes de criar o diretório, use o comando umask para definir quais permissões de acesso devem ser mascaradas toda vez que um objeto de arquivo for criado. O comando umask 027 define as permissões ao conceder ao proprietário todas as permissões (0), ao negar o acesso de gravação de grupo (2) e ao não conceder nenhuma permissão aos outros usuários (7). O comando umask, na verdade, mascara os bits de permissão correspondentes ou os desativa. Para obter detalhes, consulte a página de manual correspondente a umask.

O comando mkdir meudir cria o diretório meudir com as permissões padrão, como definido por umask. Use ls -dl meudir para verificar se todas as permissões foram atribuídas corretamente. A saída para este exemplo é:

 
drwxr-x--- ... tux project3 ... meudir

Com o comando getfacl meudir, verifique o estado inicial da ACL. Ele fornece informações como:

 
# file: meudir 
# owner: tux 
# group: project3 
user::rwx group::r-x 
other::--- 
     

As primeiras três linhas de saída mostram o nome, o proprietário e o grupo proprietário do diretório. As próximas três linhas contêm as três entradas de ACL proprietário, grupo proprietário e outros. Na verdade, no caso desta ACL mínima, o comando getfacl não produz nenhuma informação que você não pudesse obter com o comando ls.

Modifique a ACL para atribuir permissões de leitura, gravação e execução para um usuário geeko adicional e um grupo mascotes com:

 
setfacl -m user:geeko:rwx,group:mascotes:rwx meudir

A opção -m solicita que setfacl modifique a ACL existente. O argumento a seguir indica as entradas de ACL a serem modificadas (várias entradas são separadas por vírgulas). A parte final especifica o nome do diretório no qual essas modificações devem ser aplicadas. Use o comando getfacl para dar uma olhada na ACL resultante.

 
# file: meudir 
# owner: tux 
# group: project3 
user::rwx 
user:geeko:rwx 
group::r-x 
group:mascotes:rwx 
mask::rwx 
other::--- 

Além das entradas iniciadas para o usuário geeko e o grupo mascotes, uma entrada máscara foi gerada. A entrada máscara é definida automaticamente para que todas as permissões sejam efetivas. O comando setfacl adapta automaticamente as entradas máscara existentes às configurações modificadas, a não ser que você desative este recurso com -n. máscara define as permissões máximas de acesso efetivas para todas as entradas na classe de grupo. Isso inclui usuário nomeado, grupo nomeado e grupo proprietário. Os bits de permissão de classe de grupo exibidos pelo comando ls -dl meudir agora correspondem à entrada máscara.

 
drwxrwx---+ ... tux project3 ... meudir 
   

A primeira coluna da saída agora contém um sinal de + extra para indicar que existe uma ACL estendida para esse item.

De acordo com a saída do comando ls, as permissões para a entrada máscara incluem acesso de gravação. Tradicionalmente, esses bits de permissão significariam que o grupo proprietário (aqui, project3) também teria acesso de gravação no diretório meudir. Porém, as permissões de acesso efetivas para o grupo proprietário correspondem à parte sobreposta das permissões definidas para o grupo proprietário e para a máscara, que é r-x em nosso exemplo (consulte a Tabela 5.2, “Mascarando permissões de acesso”). Em relação às permissões efetivas do grupo proprietário do exemplo, nada mudou mesmo após a adição das entradas de ACL.

Edite a entrada máscara com setfacl ou chmod. Por exemplo, use chmod g-w meudir. O comando ls -dl meudir mostrará:

 
drwxr-x---+ ... tux project3 ... meudir 

getfacl meudir fornece a seguinte saída:

 
# file: meudir 
# owner: tux 
# group: project3 
user::rwx user:geeko:rwx          # effective: r-x 
group::r-x 
group:mascotes:rwx      # effective: r-x 
mask::r-x 
other::--- 

Após executar o comando chmod para remover a permissão de gravação dos bits classe de grupo, a saída do comando ls será suficiente para indicar que os bits máscara devem ter mudado de acordo: a permissão de gravação é novamente limitada ao proprietário de meudir. A saída de getfacl confirma isso. Esta saída inclui um comentário para todas as entradas nas quais os bits de permissão efetiva não correspondem às permissões originais, porque eles são filtrados de acordo com a entrada máscara. As permissões originais podem ser restauradas a qualquer momento com chmod g+w meudir.

5.4.3. Diretório com uma ACL padrão

Os diretórios podem ter uma ACL padrão, que é um tipo especial de ACL que define permissões de acesso herdadas pelos objetos no diretório quando são criados. Uma ACL padrão afeta subdiretórios e arquivos.

5.4.3.1. Efeitos em uma ACL padrão

Existem dois modos de passar as permissões de uma ACL padrão do diretório para os seus arquivos e subdiretórios:

  • Um subdiretório herda a ACL padrão do diretório pai como sua ACL padrão e como uma ACL de acesso.

  • Um arquivo herda a ACL padrão como a sua ACL de acesso.

Todas as chamadas de sistema que criam objetos Sistema de arquivos utilizam um parâmetro mode que define as permissões de acesso para o objeto Sistema de arquivos recém-criado. Se o diretório pai não tiver uma ACL padrão, os bits de permissão, como definidos por umask, serão subtraídos das permissões quando passados pelo parâmetro mode, e o resultado será atribuído ao novo objeto. Se existir uma ACL padrão para o diretório pai, os bits de permissão atribuídos ao novo objeto corresponderão à parte sobreposta das permissões do parâmetro mode e daqueles definidos na ACL padrão. O comando umask é desconsiderado neste caso.

5.4.3.2. Aplicação das ACLs padrão

Os três exemplos a seguir mostram as operações principais de diretórios e ACLs padrão:

  1. Adicione uma ACL padrão ao diretório meudir existente com:

     
    setfacl -d -m group:mascotes:r-x meudir 
    

    A opção -d do comando setfacl solicita que setfacl realize as seguintes modificações (opção -m) na ACL padrão.

    Preste bem atenção no resultado deste comando:

     
    getfacl meudir
    
    # file: meudir 
    # owner: tux 
    # group: project3 
    user::rwx 
    user:geeko:rwx 
    group::r-x 
    group:mascotes:rwx 
    mask::rwx 
    other::--- 
    default:user::rwx 
    default:group::r-x 
    default:group:mascotes:r-x 
    default:mask::r-x 
    default:other::--- 
    

    getfacl retorna a ACL de acesso e a ACL padrão. A ACL padrão é formada por todas as linhas que começam com default. Embora você tenha simplesmente executado o comando setfacl com uma entrada para o grupo mascotes na ACL padrão, setfacl copiou automaticamente todas as outras entradas da ACL de acesso para criar uma ACL padrão válida. As ACLs padrão não têm efeito imediato nas permissões de acesso. Elas apenas surgem quando os objetos Sistema de arquivos são criados. Esses novos objetos herdam permissões somente da ACL padrão de seu diretório pai.

  2. No próximo exemplo, use mkdir para criar um subdiretório em meudir, que herda a ACL padrão.

     
    mkdir meudir/meusubdir
    
    getfacl meudir/meusubdir 
    
    # file: meudir/meusubdir 
    # owner: tux 
    # group: project3 
    user::rwx 
    group::r-x 
    group:mascotes:r-x 
    mask::r-x 
    other::--- 
    default:user::rwx 
    default:group::r-x 
    default:group:mascotes:r-x 
    default:mask::r-x 
    default:other::--- 
    

    Como esperado, o subdiretório meusubdir recém-criado tem permissões da ACL padrão do diretório pai. A ACL de acesso de meusubdir é um reflexo exato da ACL padrão de meudir. A ACL padrão que este diretório transmitirá para os seus objetos subordinados também é a mesma.

  3. Use o comando touch para criar um arquivo no diretório meudir, por exemplo, touch meudir/meuarq. O comando ls -l meudir/meuarq mostrará:

     
    -rw-r-----+ ... tux project3 ... meudir/meuarq 
    

    O resultado de getfacl meudir/meuarq será:

     
    # file: meudir/meuarq 
    # owner: tux 
    # group: project3 
    user::rw- 
    group::r-x          # effective:r-- 
    group:mascotes:r-x   # effective:r-- 
    mask::r-- 
    other::--- 
    

    touch usa um mode com o valor 0666 quando cria novos arquivos, o que significa que os arquivos são criados com permissões de leitura e gravação para todas as classes de usuários, desde que não existam outras restrições em umask ou na ACL padrão (consulte Seção 5.4.3.1, “Efeitos em uma ACL padrão”). Na verdade, isto significa que todas as permissões de acesso não contidas no valor mode são removidas de suas respectivas entradas de ACL. Embora nenhuma permissão tenha sido removida da entrada de ACL da classe de grupo, a entrada máscara foi modificada para mascarar permissões não definidas em mode.

    Este método assegura uma interação uniforme de aplicativos, como compiladores, com as ACLs. Você pode criar arquivos com permissões de acesso restritas e marcá-los como executáveis. O mecanismo mask garante que os usuários e grupos corretos poderão executá-los como desejado.

5.4.4. Algoritmo de verificação da ACL

Um algoritmo de verificação é aplicado antes que qualquer processo ou aplicativo receba acesso a um objeto Sistema de arquivos protegido por ACL. Como regra básica, as entradas de ACL são examinadas na seguinte seqüência: proprietário, usuário nomeado, grupo proprietário ou grupo nomeado e outros. O acesso é gerenciado de acordo com a entrada que melhor se adequar ao processo. Permissões não são cumulativas.

A situação será mais complicada se um processo pertencer a mais de um grupo e precisar se adaptar a várias entradas de grupo. Uma entrada é selecionada aleatoriamente das entradas adequadas com as permissões necessárias. Não importa qual das entradas aciona o resultado final “acesso concedido”. Do mesmo modo, se nenhuma das entradas adequadas de grupo contiver as permissões necessárias, uma entrada selecionada aleatoriamente acionará o resultado final “acesso negado”.