Jump to content
From ArchWiki
Status de tradução: Esse artigo é uma tradução de Access Control Lists. Data da última tradução: 2020-04-07. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Lista de controle de acesso (ACL, do inglês "Access Control List") fornece um mecanismo de permissão adicional e mais flexível para sistemas de arquivos. Ele foi projetado para ajudar com as permissões de arquivo UNIX. A ACL permite conceder permissões para qualquer usuário ou grupo a qualquer recurso de disco.

## Instalação

O pacote acl é uma dependência do systemd, e já deve estar instalado.

## Habilitar ACL

Para habilitar a ACL, o sistema de arquivos deve ser montado com a opção `acl`. Você pode usar fstab para torná-lo permanente em seu sistema.

Existe a possibilidade de a opção `acl` já estar habilitada como opção de montagem padrão no sistema de arquivos. Btrfs faz e os sistemas de arquivos Ext2/3/4 também. Use o seguinte comando para verificar a opção de partições ext* formatadas:

    # tune2fs -l /dev/sdXY | grep "Default mount options:"

    Default mount options:    user_xattr acl

Verifique também se a opção de montagem padrão não está substituída; nesse caso, você verá `noacl` em `/proc/mounts` na linha relevante.

Você pode definir as opções de montagem padrão de um sistema de arquivos usando o comando `tune2fs -o opção partição`, por exemplo:

    # tune2fs -o acl /dev/sdXY

Usar as opções de montagem padrão em vez de uma entrada em `/etc/fstab` é muito útil para unidades externas, essa partição será montada com a opção `acl` também em outras máquinas Linux. Não há necessidade de editar o `/etc/fstab` em todas as máquinas.

Nota:

- `acl` é especificado como opção de montagem padrão ao criar um sistema de arquivos ext2/3/4. Isso está configurado em `/etc/mke2fs.conf`.
- As opções padrão de montagem não estão listadas em `/proc/mounts`.

## Uso

### Definir ACL

A ACL pode ser modificada usando o comando setfacl.

Dica: Você pode listar as alterações de permissão de arquivo/diretório sem modificar as permissões (ou seja, "dry-run") anexando a opção `--test`.

Para definir permissões para um usuário (`usuário` é o nome do usuário ou o ID):

    # setfacl -m "u:usuário:permissões" <arquivo/diretório>

Para definir permissões para um grupo (`grupo` é o nome ou o ID do grupo):

    # setfacl -m "g:grupo:permissões" <arquivo/diretório>

Para definir permissões para outras pessoas:

    # setfacl -m "other:permissões" <arquivo/diretório>

Para permitir que todos os arquivos ou diretórios recém-criados herdem entradas do diretório pai (isso não afetará os arquivos que serão copiados para o diretório):

    # setfacl -dm "entrada" <diretório>

Para remover uma entrada específica:

    # setfacl -x "entrada" <arquivo/diretório>

Para remover as entradas padrão:

    # setfacl -k <arquivo/diretório>

Para remover todas as entradas (as entradas do dono, grupo e outras são mantidas):

    # setfacl -b <arquivo/diretório>

Nota: O comportamento padrão de setfacl é recalcular a entrada da máscara da ACL, a menos que uma entrada `--mask` tenha sido explicitamente fornecida. A entrada da máscara é definida para a união de todas as permissões do grupo proprietário e todas as entradas de usuário e grupo nomeadas (essas são exatamente as entradas afetadas pela entrada da máscara).
Dica: Para aplicar operações a todos os arquivos e diretórios recursivamente, acrescente o argumento `-R`.

### Mostrar ACL

Para mostrar permissões, use:

    # getfacl <arquivo/diretório>

## Exemplos

Defina todas as permissões para o usuário `joao` no arquivo chamado `abc`:

    # setfacl -m "u:joao:rwx" abc

Verifica permissões:

    # getfacl abc

    # file: abc
    # owner: alguém
    # group: alguém
    user::rw-
    user:joao:rwx
    group::r--
    mask::rwx
    other::r--

Altera permissões para o usuário `joao`:

    # setfacl -m "u:joao:r-x" abc

Verifica permissões:

    # getfacl abc

    # file: abc
    # owner: alguém
    # group: alguém
    user::rw-
    user:joao:r-x
    group::r--
    mask::r-x
    other::r--

Remove todas as entradas estendidas ACL:

    # setfacl -b abc

Verifica permissões:

    # getfacl abc

    # file: abc
    # owner: alguém
    # group: alguém
    user::rw-
    group::r--
    other::r--

### Saída do comando ls

Você notará que há uma ACL para um determinado arquivo porque ele exibirá um `+` (sinal de mais) após as permissões do Unix na saída de `ls -l`.

    $ ls -l /dev/audio

    crw-rw----+ 1 root audio 14, 4 nov.   9 12:49 /dev/audio

    $ getfacl /dev/audio

    getfacl: Removing leading '/' from absolute path names
    # file: dev/audio
    # owner: root
    # group: audio
    user::rw-
    user:solstice:rw-
    group::rw-
    mask::rw-
    other::---

### Concedendo permissões de execução para arquivos privados a um servidor web

A técnica a seguir descreve como um processo como um servidor web pode receber acesso a arquivos que residem no diretório inicial de um usuário, sem comprometer a segurança, fornecendo acesso ao mundo inteiro.

A seguir, presumimos que o servidor web é executado como usuário `http` e concedemos acesso ao diretório "home" do `geoffrey` `/home/geoffrey`.

A primeira etapa é conceder permissões de execução para o usuário `http`:

    # setfacl -m "u:http:--x" /home/geoffrey

Nota: Permissões de execução para um diretório são necessárias para um processo listar o conteúdo do diretório.

Como o usuário `http` agora pode acessar arquivos em `/home/geoffrey`, outros não precisam mais acessar:

    # chmod o-rx /home/geoffrey

Use `getfacl` para verificar as alterações:

    $ getfacl /home/geoffrey

    getfacl: Removing leading '/' from absolute path names
    # file: home/geoffrey
    # owner: geoffrey
    # group: geoffrey
    user::rwx
    user:http:--x
    group::r-x
    mask::r-x
    other::---

Como mostra a saída acima, o `other` não tem mais permissões, mas o usuário `http` ainda pode acessar os arquivos, portanto, a segurança pode ser considerada aumentada.

Nota: Pode ser necessário conceder acesso de gravação para o usuário `http` em diretórios e/ou arquivos específicos:

    # setfacl -dm "u:http:rwx" /home/geoffrey/project1/cache

## Veja também

- getfacl(1)
- setfacl(1)
- Um guia antigo, mas ainda relevante (e completo) sobre ACL
- Como definir permissões de arquivo padrão para todas as pastas/arquivos em um diretório? (inglês)

Category:

- Access control (Português)