por Fabiano Felix (fabianofelix@hotmail.com)
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:
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.
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.
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
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.
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 as entradas contém as permissões necessárias, ele irá para a mascára de entrada;
- Caso contrário, o acesso é negado.
- 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.
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.
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.