2.6 ACL's no Linux


O sistema tradicional de segurança do Linux se mostra eficiente em muitos cenários (ou, em outras palavras, em todos os cenários em que a organização é feita de modo eficiente). No entanto, as ACL's servem para dar permissões isoladas a usuários e grupos que ficam de fora destas organizações.

ACL é a sigla para Access Control List, ou Lista de Controle de Acesso. Cada arquivo ou diretório tem uma lista onde estão todos os usuários e grupos que podem acessá-lo. Isto facilita, e muito, a administração de um ambiente multi-usuário, ao mesmo tempo que dificulta esta mesma administração, ao fazer com que, por exemplo, um arquivo de um usuário X seja acessado por um usuário de um grupo Y isolado e sem nenhuma relação aparente, fazendo com que as permissões, por vezes, sejam um emaranhado difícil de ser organizado de forma coerente.

No entanto, a solução de ACL's foi desenvolvida para Linux (tanto que, no sistema de arquivos Ext2 e Ext3 existe, em cada i-node, um espaço reservado para futuras implementações de ACL's.), a qual é possível instalar opcionalmente neste sistema operacional, e uma de suas implementações é a chamada POSIX Access Control Lists.

Este tipo de ACL funciona da seguinte forma: cada objeto do sistema (arquivos e diretórios) possui uma ACL correspondente, que por sua vez possui ACE's (entradas de lista) que informam o que cada usuário ou grupo pode fazer com o objeto em questão. Cada ACE é composta dos seguintes valores:
- Entry Tag Qualifier (opcional): Inforrma a qual usuário e grupo esta ACE está se referindo. - ACL_USER_OBJECT: Direitos de acesso aao usuário ao qual o arquivo pertence.
- ACL_USER: Direitos de acesso ao usuárrio informado em Entry Tag Qualifier.
- ACL_GROUP_OBJECT: Direitos de acesso ao grupo dono do arquivo.
- ACL_GROUP: Direitos de acesso ao gruppo informado em Entry Tag Qualifier.
- ACL_MASK: Direito máximo que qualquerr um dos direitos citados pode exercer sobre o arquivo.
- ACL_OTHER: Direito de acesso a qualquuer outro processo em que o objeto não se encaixe em nenhuma das outras opções descritas.

Quando uma ACL é criada, é utilizada a chamda de sistema acl_init(), que retorna um ponteiro para um espaço reservado para a mesma, que inicialmente é na memória. ACE's são manipuladas por funções qua criam, copiam, deletam, verificam, setam usuários e grupos, setam permissões. Estas ACE's são armazenada inicialmente também na memória, recebendo cada uma um ponteiro para sua ACL correspondente.

O algoritmo de acesso a um objeto ocorre da seguinte forma:

1. O USER ID do processo coincide com o USER ID do dono do arquivo? Caso verdadeiro, o ACL_USER_OBJECT coincide com os direitos requisitados? Caso verdadeiro, o acesso é permitido. Caso contrário, o acesso é negado.
2. Senão, o USER_ID do processo coincide com o setado em "Entry Tag Qualifier"? Caso verdadeiro, o ACL_MASK contém os direitos requisitados? Caso verdadeiro, o acesso é permitido, caso contrário, o acesso é negado.
3. Senão, o GROUP_ID ou os ID's dos grupos complementares coincidem com o grupo dono do arquivo, ou com as entradas em "Entry Tag Qualifier"? Caso verdadeiro, o ACL_MAKS, ACL_GROUP ou ACL_GROUP_OBJECT contém os direitos requisitados, o acesso é permitido. Caso contrário, acesso negado.
4. Senão, o ACL_OTHER contém os direitos requisitados? Caso verdadeiro, acesso permitido, senão acesso negado.
5. Se nenhuma das alternativas acima retornar verdadeiro, o acesso é negado.

Quando as ACL's são necessárias?

Vamos imaginar o seguinte exemplo: existem os grupos tecnicos e comercial. Os usuários marcelo e ricardo pertencem ao grupo técnicos, e marcio pertence ao grupo comercial, mas tem como grupo secundário o tecnicos. O diretório /home/tecnicos, que pertence aos componentes deste grupo, tem a estrutura como mostrada no exemplo 5.

drwx------ 9 marcelo tecnicos 4096 Oct 24 18:20 marcelo/
drwxr-x--- 4 marcelo tecnicos 4096 Oct 24 18:32 publico/
drwx------ 2 ricardo tecnicos 4096 Oct 09 09:52 ricardo/
Exemplo 5

É possível visualizar, no exemplo 5, que cada usuário tem seu diretório privado, onde somente ele tem acesso, e existe um diretório publico, onde estes usuários podem compartilhar de arquivos utlizados comumente, e o qual é administrado pelo usuário marcelo. Como o usuário marcio tem como grupo secundário o tecnicos, ele também tem dirito de entrar no diretório /home/tecnicos/publico. A estrutura do diretório publico pode ser visualizada no exemplo 6.

drwxrwx--- 3 marcelo comercia 4096 Oct 24 18:39 comercial/
drwxrwx--- 2 marcelo tecnicos 4096 Oct 24 18:32 tecnicos/
Exemplo 6

Supondo que o usuário marcio entrasse no diretório /home/tecnicos/publico/comercial (pois para tanto tem direitos) e criasse um diretório, este diretório e seu conteúdo não seria visível pelo administrador do diretório publico (marcelo), sendo assim perdido o controle sobre a estrutura hierárquico de diretórios, como mostrado no exemplo 7.

drwxrwx--- 3 marcelo comercia 4096 Oct 24 18:39 ./
drwxr-x--- 4 marcelo tecnicos 4096 Oct 24 18:32 ../
drwxr-xr-x 2 marcio comercia 4096 Oct 24 18:39 teste/
Exemplo 7

Obviamente, do ponto de vista organizacional e sem uma visão contextual, não faz sentido um usuário do grupo comercial ter acesso à estrutura de diretórios do grupo tecnicos. Mas supondo que isto seja realmente necessário, é possível resolver este problema utilizando ACL's, que serão melhor explicadas no capítulo referente ao Windows.