quinta-feira, 3 de dezembro de 2009

Usando ACL para permissões avançadas no Linux

NÃO GOSTO DE FAZER ISSO, MAS COM ESSE ARTIGO EU USEI UM "COPIAR/COLAR". 

É que estou precisando armazenar essa informação e no momento é o método mais eficiênte para fazê-lo.

Peço desculpas ao autor, mas mantive os créditos....


Luis Felipe Silveira da Silva
08/09/2008

Algum um tempo atrás eu me perguntava se só poderiam existir três permissões nos sistemas Unix-Like, a permissão de dono, grupo e outros, o que me limitava bastante, principalmente quando se tratavam de fileservers (servidores de arquivo). Em um sistema Linux (ou Unix), as permissões de arquivos são definidas pelo modo do arquivo, que contém nove bits que determinam as permissões de acesso ao arquivo, mais três bits especiais. Este mecanismo permite definir justamente a permissão para os três tipos de classes de usuários: o proprietário do arquivo, o grupo e outros. Este mecanismo é muito simples, e com uma combinação destes bits, muitas permissões podem ser modeladas.

Utilizávamos Samba na empresa em que trabalhei e precisávamos de mais do que esses três tipos de permissões de usuários em certas pastas, o Linux então já não estava me satisfazendo. A necessidade era definir uma permissão para um grupo e outra para outro grupo, mas como fazer isso sendo que só poderia existir apenas um grupo dono daquela pasta ou arquivo?

Eu sabia que o Microsoft Windows já suportava a bastante tempo esse tipo de permissão, desde que a partição do sistema e/ou qualquer outra que ele fosse administrar estivesse formatada em NTFS, ou seja, você conseguia definir para vários grupos ou vários usuários o tipo de permissão que ele exercia naquele diretório, quantas vezes necessitasse. Um bom exemplo é leitura para certos usuários/grupos, leitura e escrita para alguns outros usuários/grupos, negado para os demais, e o que mais necessitar.

Eu precisava fazer isso, pois algumas aplicações requerem mais permissões do que este modelo que o Unix oferece. Iniciei minha pesquisa em forums e diversos sites (alguns em inglês). Foi então que encontrei as ACL (Access Control List), um sistema muito interessante onde você consegue definir qualquer tipo de permissão para qualquer usuário ou grupo. O Linux já suporta nativamente desde o Kernel 2.6. Com ACL podemos ter um modelo mais refinado de permissões. Além do proprietário do arquivo, do grupo e de outros, que o Unix nos oferece, usuários e grupos adicionais podem ter o acesso modelado, não sendo identificados pelo sistema, simplesmente como “outros” .

Comecei a testar e isso me surpreendeu bastante, enfim, você consegue fazer qualquer permissão do mesmo modo que você faz no Windows. E é suportado por partições ReiserFS, Ext2, Ext3, JFS e XFS.


Explorando



Quando você executa o comando $ ls -l em uma pasta qualquer que não está com as definições de ACL você vê essa saída:

drwxr-xr-x 3 root root 88 2003-09-15 10:07 dhcp3
drwxr-xr-x 2 root root 136 2007-06-01 11:55 dhcpc
drwxr-xr-x 2 root root 144 2005-03-25 00:59 dictionaries-common
drwxr-xr-x 2 root root 88 2006-02-22 18:50 discover.conf.d

Exemplo de saída do ls -l

Observe que o usuário dono é o root e o grupo também é o root, mas não era isso que eu quero que chame a atenção, notem na estrutura da primeira coluna: drwxr-xr-x, significa que d é um diretório, os três primeiros campos são os privilégios do dono do arquivo, no caso rwx é leitura escrita e execução (para que os diretórios possam ser acessados, é obrigatório ter a opção x), a segunda parte (do quarto ao sexto campo) é o grupo, que nesse caso está configurado para somente leitura e execução (r-x), e a terceira parte (do sétimo ao nono campo) são os outros, enfim, qualquer usuário que faça logon nesse computador, tem a mesma permissão do grupo (para esse caso) que é leitura e execução (r-x).

Quando você instala as ACL e personaliza e refina a configuração de permissões do diretório, você vê essa saída com o comando $ ls -l:

drwxrwxr-x 9 usuariodono grupo 288 2007-09-26 10:10 Pasta1
drwxrwx---+ 2 usuariodono grupo 3208 2007-10-02 17:35 Pasta2
drwxrwx---+ 5 usuariodono grupo 85512 2007-10-03 08:59 Pasta3
drwxr-x--- 2 usuariodono grupo 1448 2007-09-24 17:07 Pasta4

Exemplo de saída do ls -l

Você pode observar que o primeiro diretório Pasta1 ainda está com as permissões comuns do Linux, sem ACL. Notem os 2 próximos diretórios, no final, onde mostram as permissões comuns, ainda tem um sinal +, que significa que estes diretórios estão personalizados, ou seja, utilizam ACL. Posteriormente você verá como saber afinal qual é a permissão real para esse arquivo, ou ainda, o que tem por trás desse sinal de + se você preferir.


Começando a Instalação das ferramentas



Para começar a instalação das ferramentas, primeiro veja qual é o kernel do seu sistema, para isso utilize o comando:

# uname –a

A saída desse comando deve ser algo parecido com isso:

Linux computador 2.6.17.6-slh-up-1 #1 PREEMPT Sun Jul 16 02:05:58 CEST 2006 i686 GNU/Linux.

Reparem que o kernel que estou utilizando (meio velhinho por sinal), é o 2.6.17.6. Como dito anteriormente, se o seu kernel for o 2.6, ele já suporta as ACL nativamente, ou seja, não necessita de instalação do módulo. Entretanto, se seu kernel não for 2.6 ou superior (por exemplo, kernel 2.4) você deverá instalar o módulo de ACL e recompilar o kernel, o que é um pouco difícil e trabalhoso, portanto não abordaremos nesse tutorial.

Agora depois de checado e o seu kernel, você já pode começar a instalação das ferramentas. Irei me aprofundar mais em distribuições baseadas no debian (apt-get), mas vou comentar sobre distribuições que utilizam urpmi e o yum.

Para instalar as ferramentas de administração de ACL no debian ou outras distros que utilzam apt-get você deve utilizar o comando:

# apt-get update
# apt-get install acl

Para instalar no mandriva ou outras distros que utilizam o urpmi você deve utilizar o comando:

# urpmi acl

Para instalar no fedora ou outras distros que utilizam o yum você deve utilizar o comando:

# yum install acl

Para instalar no SuSE utilize o comando:

# yast2 –i acl

Se você prefere fazer download das ferramantas e instalar manualmente, você pode encontrar para download no site http://acl.bestbits.at/download.html


Habilitando ACL



Depois que as ferramentas de console para uso do ACL forem instaladas, para começar a utilização você deve habilitar a ACL para a partição desejada. Para isso edite o arquivo /etc/fstab, adicione a string “acl” nas opções do sistema de arquivo desejado:

# vi /etc/fstab

Veja abaixo a string “acl” em negrito nas opções:

# /etc/fstab: filesystem table.
#
# filesystem mountpoint type options dump pass
/dev/sda1 / reiserfs noatime,acl,notail 0 1
/dev/sda2 none swap sw 0 0

Se o seu sistema de arquivos (partição) já está montado, você pode reinciar o sistema ou simplesmente remontar a partição:

# mount / -o remount,acl


Configurando ACL



Com a instalação das ferramentas e nenhum erro após habilitar as ACL para o sistema de arquivos, então agora vamos colocar a mão na massa.

Supondo que você tenha um diretório e necessite que dois grupos tenham permissões diferentes, ou ainda personalizar dois usuários para permissões diferentes, vamos imaginar essa situação.

Primeiro vamos criar uma pasta e alterar os donos dela normalmente como se faz:

# mkdir pasta1
# chown user pasta1
# chgrp desenv pasta1

Pronto, criamos o diretório pasta1 e configuramos para que o usuario “user” seja o dono e o grupo “desenv” seja o grupo dono, agora vamos definir permissões para a pasta:

# chmod 750 pasta1

Agora configuramos para que o dono do diretório (usuario “user”) tenha acesso total (rwx), o grupo tenha acesso somente de leitura (r-x) e os outros não tenham nenhum acesso (---) (deny).

Vamos agora refletir, como é que eu poderia definir para que mais usuários tivessem controle total (rwx) sendo que eu preciso que o grupo “desenv” fique com permissões de acesso para somente de leitura? Na verdade não existe como, se você precisa que mais um grupo acesse com controle total (rwx), você teria que trocar as permissões de acesso do grupo “desenv” para controle total (rwx), e acrescentar usuários que necessitam de controle total no grupo “desenv” e mudar a permissão, de modo que o grupo “desenv” obtenha controle total a pasta. Esse tipo de problema acaba, graças a flexibilidade das ACL.


Personalizando/refinando permissões de arquivo com ACL



Para utilizar as ACL vamos usar 2 comandos basicos, setfacl e getfacl, o set é para definir e o get é para saber quais foram as permissões definidas (ou seja o que tem por trás do +)

Supondo que eu tenha o grupo “edita” e quero que esse grupo tenha controle total para a pasta1, você deve utilizar o seguinte comando:

Primeiramente vamos criar o diretório

# mkdir pasta1

Definir para controle total do grupo e usuário (root), e leitura e execução para outros

# chmod 775 pasta1/

Agora vamos executar o comando ls -l para ver o como está sendo exibido:

# ls -l

total 2
drwxrwxr-x 2 root root 1024 2008-05-06 11:41 pasta1

Vamos então aplicar uma ACL simples para que o grupo edita possa ter execução total

# setfacl -m g:edita:rwx pasta1/

Executando o comando ls -l

# ls -l

total 2
drwxrwxr-x+ 2 root root 1024 2008-05-06 11:41 pasta1

Reparem que agora existe um + após os 9 digitos binários, o que significa que existem permissões extras além do já permitido por padrão.

Vamos pegar o resultado agora com o comando getfacl, ele irá nos mostrar como estão aplicadas as ACL (o que tem por trás do +).

# getfacl pasta1/

# file: pasta1
# owner: root
# group: root
user::rwx
user:root:rwx
group::rwx
group:edita:rwx
mask::rwx
other::r-x

Podemos observar que as ACL foram corretamente aplicadas, de modo que o grupo edita é capaz de editar, ler e listar o conteúdo da pasta1.

Agora essa pasta está com as ACL definidas, portanto, podemos testar, entrando com os usuários bloqueados, usuários que são aceitos somente para leitura, usuários que são aceitos para controle total (leitura e escrita e etc).


Mais exemplos



Se necessitar que um usuário tenha apenas permissão de leitura em um determinado arquivo você pode usar a seguinte sintaxe abaixo:

# setfacl -m u:usuario:r-- arquivo.txt

Se for um grupo altere para “g:grupo” e assim por diante, é infinito o que você pode fazer com essas ACL.


Configurações para o Samba



Para que o samba consiga interpretar corretamente as ACL você deve seguir o exemplo abaixo:

Adicione o parâmetro map acl inherit = Yes no compartilhamento no qual você deseja ativar ACL (ou na pasta compartilhada que você alterou permissões e deseja efetivar as ACL).

Por padrão eu crio o meu compartilhamento da maneira descrita abaixo:

[compartilhado]
comment = compartilhado
path = /compartilhado
read only = No
create mask = 0777
force create mode = 0777
directory mask = 0777
force directory mode = 0777
map acl inherit = Yes

Não esqueça depois de alterar as ACL de reiniciar o samba para que ele aplique as configurações corretas.

# /etc/init.d/samba restart

Distribuições como fedora, mandriva, openSuSE, pode-se utilizar também o um dos seguintes comandos (variando de distribuição pra distribuição):

# service samba restart
# service smb restart


Conclusão



O que podemos observar é que com as ACL a combinação, personalização e refinamento necessário para permissões tornam-se quase infinitas. A forma de organização é bastante maleável e de fácil administração. Mas, o mais utilizado para isso seria num sistema de um servidor de arquivos, pois é um ambiente compartilhado onde se deseja que existam diversos perfis, e um determinado usuário ou grupo não deve ter acesso a alguma pasta.

Em breve estarei escrevendo um outro artigo para que vocês possam fazer as ACL e alterações direto no seu gerenciador de Janelas (KDE e GNOME) com ferramentas que eles já suportam.

Por Luis Felipe Silveira da Silva

Nenhum comentário: