Arquivos históricos do BR-Linux.org apresenta:

Linux in Brazil (ACLs )

Instalando e Manipulando ACL's POSIX em Sistemas Linux

por Fabiano Felix (fabianofelix@hotmail.com)

O que são ACL's ?

No Linux (e sistemas UNIX), as permissões dos arquivos são definidas pelo o que chamamos file mode. Os file modes contém 9 bits que determinam as permissões para determinado arquivo. Esse mecanismo nos permite definir 3 classes de usuários: o dono do arquivo, o grupo a qual o dono pertence e os outros usuários do sistema.

Esse sistema de permissões é considerado muito seguro e simples de utilizar, sendo que ele atende a maioria das necessidades das empresas. Entretanto, com o crescimento do Linux no segmento de servidor de arquivos, pode existir a necessidade do uso de permissões um pouco mais especificas. Essas permissões mais especificas podem ser implementadas com o suporte a ACL's(Access Control List). Com as ACL's, podemos garantir ou negar o acesso a qualquer arquivo ou pasta de uma forma na qual as permissões tradicionais não conseguiriam trabalhar. As ACL's nos permite garantir direitos a mais de um usuário/grupo em um mesmo arquivo, não usando necessariamente os direitos gerais (permissão para outros usuários).

Para podermos ilustrar o uso das ACL's, vamos apresentar um caso típico onde as permissões padrão do Linux não suprem todas as necessidades. Vamos considerar uma empresa de desenvolvimento Web, no qual temos o seguinte quadro:

  • Existe uma estrutura de diretórios na qual estão todos os arquivos do usuários, separados por grupos de trabalho;

  • Cada diretório é de propriedade do grupo, e todos os membros tem direito de gravação no mesmo;

  • Em cada diretório, existem um subdiretório compartilhado chamado geral, onde todos os membros tem direito de gravação, e existem os diretórios dos usuários, onde somente os próprios tem direitos. Um exemplo dessa estrutura seria:
    d---rwx---	2	root	rh	1024	Sep 14 12:00	RH
    d---rwx---	2	root	contab	1024	Sep 14 12:00	contabilidade
    d---rwx---	2	root	diretor	1024	Sep 14 12:00	diretoria
    d---rwx---	2	root	servger	1024	Sep 14 12:00	servgerais
    d---rwx---	2	root	ti	1024	Sep 14 12:00	TI
    

    A diretoria necessita ler alguns arquivos do diretório geral do departamento pessoal (RH), e a contabilidade necessita gravar arquivos no diretório RH/geral/contabil. As permissões padrão somente nos permitiriam garantir as permissões para todos os usuários, o que é inseguro, porque não conseguiriamos controlar quais pessoas estão acessando esses dados.

    Com as ACL's, poderemos informar que o grupo diretoria (ou algum usuário especifico) também poderá ler os arquivos no diretório geral do RH, bem como a contabilidade poderá gravar arquivos no diretório RH/geral/contabil.

    Instalação

    Para iniciarmos a instalação, precisamos fazer o download dos arquivos e patchs para o nosso sistema. Os arquivos necessários estão na página do projeto em http://acl.bestbits.at/download.html. Os arquivos estão disponíveis em formato tgz ou rpm, para esse artigo iremos utilizar os rpms. Utilizaremos também a versão 2.4.18 do kernel, caso sua versão seja diferente, os patchs também estão disponíveis.

    Os arquivos necessários para a nossa instalação são:

    linux-2.4.18ea-"version".diff.gz
    linux-2.4.18acl-"version".diff.gz
    e2fsprogs
    libattr
    libacl
    acl
    fileutils
    star
    kernel 2.4.18 (nosso exemplo)
    

    Descompactamos o código-fonte do kernel (não explicaremos aqui o procedimento para a compilação do kernel, para isso procure algum documento especializado) e aplicaremos os patchs para adicionar o suporte aos atributos extendidos(extended atributes) e ACL. Os atributos extendidos são necessários para a utilização das ACL's, maiores informações sobre esse atributos podem ser encontradas na página do projeto.

    A aplicação do patch deve ser feita dessa forma e ordem:

    cd /usr/src/linux # (local onde estão os fontes do kernel por padrão)
    zcat /dir_download/linux-2.4.18ea-"version".diff.gz | patch -p1
    zcat /dir_download/linux-2.4.18acl-"version".diff.gz | patch -p1
    

    Configure o novo kernel e adicione as opções para o suporte aos atributos e as ACL's(no menu filesystem do comando make menuconfig). No seu arquivo .config, devem constar as seguintes opções:

    CONFIG_FS_POSIX_ACL=y
    CONFIG_EXT3_FS_XATTR=y	(suporte a ext3)
    CONFIG_EXT3_FS_XATTR_SHARING=y	(suporte a ext3)
    CONFIG_EXT3_FS_XATTR_USER=y	(suporte a ext3)
    CONFIG_EXT3_FS_POSIX_ACL=y	(suporte a ext3)
    CONFIG_EXT2_FS_XATTR=y
    CONFIG_EXT2_FS_XATTR_SHARING=y
    CONFIG_EXT2_FS_XATTR_USER=y
    CONFIG_EXT2_FS_POSIX_ACL=y
    

    Dependendo da versão do kernel, a descrição das opções podem variar, mas a opção CONFIG_EXT2_FS_XATTR=y (ou ext3) e CONFIG_EXT2_FS_POSIX_ACL=y (ou ext3) devem estar presentes.

    Compile e instale seu kernel normalmente. Ao reiniciar o sistema com o suporte já ativo, devemos instalar os utilitários. No caso do RPM, as dependências entres os pacotes são:

    efsprogs	:
    libattr		:
    libacl		: libattr
    acl		: libattr libacl
    acl-devel	: libattr libacl
    fileutils	: libattr libacl
    star		: libattr libacl
    

    A versão do fileutils que será instalada já tem o suporte as ACL's.

    Utilizando as ACL's.

    Existem duas ferramentas para o gerenciamento das ACL's: setfacl, utilizada para a manipulação, e getfacl, utilizada para a consulta das permissões existentes. Quando utilizamos o getfacl em um arquivo que contém as permissões comuns, ele nos retorna exatamente como elas estão, só que a saida é feita no formato das novas aplicações. Um exemplo:

    drwxr-xr--	2	fabiano	ti	1024	Sep 14 12:00	arquivo.txt
    

    Utilizando o getfacl:

    bacchus:~# getfacl arquivo.txt
    
    

    # file: arquivo.txt # owner: fabiano # group: ti user::rwx group::r-x other::r--

    A saida do comando getfacl nos mostra o nome do arquivo, o dono e o grupo do arquivo, seguido das permissões atuais. Vamos supor que um outro usuário chamado bruno, necessite alterar esse arquivo. Para isso, devemos utilizar o setfacl para garantir os direitos para o usuário bruno:

    bacchus:~# setfacl -m u:bruno:rw arquivo.txt
    bacchus:~# getfacl arquivo.txt
    
    

    # file: arquivo.txt # owner: fabiano # group: ti user::rwx user:bruno:rw- group::r-x mask::rwx other::r--

    Como vimos, com o comando acima nós modificamos as permissões atuais e adicionamos a permissão para que somente o usuário bruno (além do dono) possa ler e escrever no arquivo. Como saber se um arquivo contém permissões ACL's? Na saida da listagem do diretório/arquivo, você verá um sinal de adição (+) ao lado das permissões tradicionais. Exemplo:

    bacchus:~# ls -l arquivo.txt
    
    

    -rwxrwxr--+ 1 fabianom ti 1024 May 17 08:47 arquivo.txt

    Para que essa indicação esteja disponível, é necessário que utilizemos o pacote fileutils com o patch para as ACL's, apesar de o sistema trabalhar normalmente sem ele, mas não é recomendável a não utilização do pacote. Vamos voltar ao nosso exemplo da empresa fictícia. Nesse momento nós já conseguiriamos resolver ambos os problemas. Os comandos utilizados seriam os seguintes:

    bacchus:~# setfacl -m g:diretoria:r RH/geral/*
    bacchus:~# setfacl -m g:contabil:rw RH/geral/contabil/*
    

    Dessa forma, o grupo diretoria terá acesso a todos os arquivos e subdiretórios que estão dentro do diretório geral, bem como a contabilidade poderá gravar arquivos abaixo do diretório contabil. Note que os comandos estão simplificados, pois para o funcionamento correto, deve ser concedido direito de, pelo menos, leitura para esse grupos no diretório RH. Caso contrário, eles não poderão entrar no diretório.

    Mas o que acontece com os novos arquivos que serão criados nesses diretórios ? Se eles forem criados pelos usuários do grupo rh, os grupos diretoria e contabil não teriam acesso a esse novos arquivos. Para isso devemos setar as permissões padrão (default) para a criação de novos arquivos e diretórios dentro dessas pastas. O comando seria:

    bacchus:~# setfacl -d -m g:diretoria:r RH/geral/
    bacchus:~# setfacl -d -m g:contabil:rw RH/geral/contabil/
    

    O parâmetro -d indica a criação de uma ACL padrão para aquele arquivo/diretório.

    Isso significa que novos arquivos/diretórios terão as permissões setadas de acordo com as definições criadas. A saida do comando getfacl seria:

    bacchus:~# getfacl RH/geral/contabil
    
    

    # file: geral/ # owner: root # group: rh user::--- group::rwx group:contabil:rw- mask::rwx other::--- default:user::--- default:group::rwx default:group:contabil:rw- default:mask::rwx default:other::---

    Até o momento, nós utilizamos o parâmetro -m, que modifica uma ACL existente. Como pudemos observar, ele criou a ACL, já que não existia nenhuma até aquele momento. Utilizei esse comando porque senão teriámos que passar todos os direitos, sendo que os outros usuários não foram afetados. Se caso precisarmos modificar todos os direitos, devemos passar uma lista de todos os usuários/grupos, seguidos de suas respectivas permissões. Um exemplo:

    bacchus:~# setfacl -s u::rw,u:fabiano:r,g::rw,g:diretoria:rw,g:users:r,o::---
    RH/geral/
    

    Os parâmetros tem o seguinte formato:

    tipo_usuário:descrição_usuário:permissões

    onde:

    tipo_usuário - são os três tipos de usuários possíveis: dono, grupo e outros;

    descrição_usuário - nome do usuário/grupo. Caso o mesmo seja dono do arquivo, pode ser deixado em branco;

    permissões - é o sistema tradicional de direitos (rwx).

    Para removermos as ACL's, devemos utilizar o comando setfacl -b. Caso precisemos remover somente determinada ACL, utilizamos o seguinte comando:

    bacchus:~# setfacl -x g:contabil:rw RH/geral/contabil
    

    Dessa forma, removemos as entradas com as permissões para o grupo contabil. Existem outras opções para a manipulação das ACL's, sendo que descrevemos aqui as principais, para maiores informações consulte as man-pages ou o site do projeto.

    A mascára de entrada

    Existe uma permissão que não é listada no modo tradicional e que tem uma função muito importante dentro das ACL's conhecida como ACL_MASK ENTRY. Essa mascára existe para limitar os direitos efetivos garantidos para os usuários/grupos nas ACL's. Os direitos efetivos que os usuários tem são os que estão listados tanto nos direitos do usuário/grupos quanto da mascára.

    Quando um processo solicita o acesso a um arquivo, o seguinte algoritmo determina se o acesso será permitido ou negado:

  • Se o usuário é o dono e tem permissões, o acesso é permitido;

  • Se a ACL contém um usuário e ele tem as permissões necessárias, ele irá para a mascára de entrada (explicado abaixo). Caso contrário, o acesso é negado;

  • Se o usuário faz parte do grupo dono do arquivo, ou se o usuário faz parte de um grupo que contém uma entrada ACL, então:

    - Se as entradas contém as permissões necessárias, ele irá para a mascára de entrada;

    - Caso contrário, o acesso é negado.

  • Se a solicitação não se encaixar nas permissões acima, então:

    - Se as permissões para outros usuários tiver as permissões necessárias, o acesso é permitido;

    - Caso contrário, o acesso é negado.

    Checando a mascára de acesso:

    - Se a mascára de acesso contém as permissões necessárias, o acesso é permitido;

    - Caso contrário, o acesso é negado.

    Vamos utilizar o exemplo abaixo:

    bacchus:~# setfacl -d -m g:contabil:rwx RH/geral/contabil/
    bacchus:~# getfacl RH/geral/contabil
    
    

    # file: geral/ # owner: root # group: rh user::--- group::rwx group:contabil:rwx- mask::rwx other::--- default:user::--- default:group::rwx default:group:contabil:rwx- default:mask::rwx default:other::---

    Como observamos, os usuários tem suas permissões efetivas conforme foram setadas, já que a mascára de entrada (mask) tem as permissões rwx. Vamos setar as mascáras (tanto a do arquivo quanto a default) para rw:

    bacchus:~# setfacl -m m::rw RH/geral/contabil/
    bacchus:~# setfacl -d -m m::rw RH/geral/contabil/
    bacchus:~# getfacl RH/geral/contabil
    
    

    # file: contabil/ # owner: root # group: rh user::--- group::rwx #effective:rw- group:contabil:rwx #effective:rw- mask::rw- other::r-x default:user::rwx default:group::r-x #effective:r-- default:group:contabil:rwx #effective:rw- default:mask::rw- default:other::r-x

    Observamos que com a nova mascára, que não permite a execução dos arquivos, os usuários/grupos que tinham a permissão para executar, efetivamente não a podem utilizar, já que a mascára não permite a mesma. A influência da mascára é direta, sendo muito importante entender bem o seu conceito, pois ela é um fator muito importante para evitar-mos permissões mal planejadas.

    Efetuando o Backup e Restore de arquivos com ACL's

    O backup e restore das ACL's podem ser feitos de duas formas: podemos criar um arquivo que contenha a lista com todas as entradas dos nossos diretórios/arquivos, efetuar o backup normalmente (guardando também o arquivo que foi criado), e, caso necessário, efetuar o restore dos arquivos e "aplicar" o arquivo das ACL's. Esse processo é um pouco complicado e nada prático, para isso iremos utilizar o STAR.

    O STAR é uma implementação do tar totalmente compatível com o padrão POSIX. Ele manipula arquivos tar comuns, só que ele é mais rápido e completo, tendo como o grande diferencial (e a parte que nos interessa) o suporte a ACL's. A criação de backups com suporte a ACL's com o STAR é muito simples e segura, sendo que nos dá o garantia de que os arquivos manterão suas permissões intactas. O comando para a criação de um arquivo é:

    bacchus:~# star -H=exustar -acl -x "o_que_copiar" -f arquivo_backup.tar
    

    Os parâmetros -H=exustar e -acl são necessários para que o arquivo mantenha nossas ACL's. Para recuperarmos nossos arquivos, o comando seria:

    bacchus:~# star -acl -x -f arquivo_backup.tar
    

    Novamente o parâmetro -acl é necessário para manter as ACL's.

    Terminamos assim o nosso primeiro contato com as ACL's POSIX, uma nova ferramente que tende a crescer muito rápido devido a grande funcionalidade que nos proporciona, abrindo assim um espaço ainda maior para que o Linux possa ser utilizado como um grande servidor de arquivos.

    No próximo artigo, demonstratei como integrar o SAMBA com as ACL's, para que elas possam ser manipuladas pelo próprio Windows. Qualquer sugestão, dúvida ou correção serão bem-vindas.

    Referências:

    Linux ACL's POSIX project: http://acl.bestbits.at/

    STAR - A very fast and POSIX 1003.1 compliant tar archiver for UNIX http://www.fokus.gmd.de/research/cc/glone/employees/joerg.schilling/private/star.html


    por Fabiano Felix (fabianofelix@hotmail.com)


    O Arquivo Histórico do BR-Linux.org mantém no ar (sem alteração, exceto quanto à formatação) notícias, artigos e outros textos publicados originalmente no site na segunda metade da década de 1990 e na primeira década do século XXI, que contam parte considerável a história do Linux e do Open Source no Brasil. Exceto quando indicado em contrário, a autoria dos textos é de Augusto Campos, e os termos de uso podem ser consultados na capa do BR-Linux.org. Considerando seu caráter histórico, é provável que boa parte dos links estejam quebrados, e que as informações deste texto estejam desatualizadas.