Introdução
O sistema padrão de permissão de acesso para arquivos e diretórios no Linux pode ser extendido com o uso da ACL – Access Control Lista.
O sistema utilizado aqui é o Debian 8.6, mas aplica-se basicamente em qualquer distribuição Linux.
Três tipos de permissão padrão são definidos em sistemas Linux: (r) leitura, (w) gravação e (x) execução. Essas permissões são aplicáveis no arquivos e diretórios para o dono, grupo e outros.
As ACLs reduzem um pouco a performance do sistema. Na partição do sistema (/) as permissões padrões são suficientes. Ative a ACL em partições específicas como a “home” o crie uma para a sua necessidade.
Através das ACLs (Listas de Controle de Acesso) podemos estender essa capacidade adicionando mais donos, grupos e outros mesmo que não correspondam aos originais.
Alguns dos sistemas de arquivos que possuem suporte para ACLs são: Ext2, Ext3, Ext4, ReiserFS, JFS e XFS
A ACL é um recurso do kernel Linux, para verificar se o sistema de arquivos possui essa característica use o comando abaixo
tune2fs -l /dev/sda1 | grep "Default mount options:"
Caso não seja exibida a opção “acl” edite /etc/fstab e acrescente acl em options. Talvez seja necessário instalar o pacote e reiniciar o sistema
apt-get install acl
Obs: Para esse nível de operação do sistema evitei explicar conceitos básicos como criar usuário e grupo, troca de usuário, tipos de permissão, entre outros.
Criando um cenário
Imaginando um cenário relativamente simples, mas que exemplificará o uso de ACLs, temos um servidor de arquivos com um diretório pub (público) onde existem subdiretórios para os departamentos financeiro e comercial com seus respectivos arquivos caixa e vendas.
- Diretório pub
- subdiretório financeiro
- arquivo caixa
- subdiretório comercial
- arquivo vendas
- subdiretório financeiro
O diretório pub terá permissão de leitura e execução para todos (555/rwx). Nos subdiretórios o controle de acesso é restrito aos seus respectivos grupos.
- Grupo diretores (acesso ao subdiretório financeiro)
- Usuário alberto
- Usuário augusto
- Grupo gerentes (acesso ao subdiretório comercial)
- usuário joao
- usuário jose
Vamos utilizar a ACL para criar uma exceção para o usuário joao do grupo gerentes do departamento comercial ter permissão de leitura e gravação no arquivo relatório.txt no subdiretório financeiro, mas não poderá ler os outros arquivos neste mesmo diretório
Comando básicos
Uma vez definida a política de segurança (workflow – fluxo de trabalho) vamos criar os usuários, os grupos, a estrutura de diretórios, e definir as permissões de acesso.
Obs.: Os comandos serão executados sendo o diretório corrente /mnt.
Adicionado usuários alberto, augusto, joao e jose
adduser alberto adduser augusto adduser joao adduser jose
Adicionado os grupos diretores e gerentes
addgroup diretores addgroup gerentes
Adicionando usuários aos respectivos grupos
usermod -a -G diretores alberto usermod -a -G diretores augusto usermod -a -G gerentes joao usermod -a -G gerentes jose
Criando o diretório pub e subdiretórios financeiro e comercial
mkdir -p pub/{comercial,financeiro}
Definindo permissões para diretórios
chmod 555 pub chmod 770 pub/{comercial,financeiro}
Utilizando ACL
Existem apenas dois tipos de ACLs:
- Regras de Acesso – especificam as informações de acesso para um arquivo ou diretório único
- Regras Padrão – aplicadas apenas a diretórios e especificam informações de acesso padronizadas para todos os arquivos dentro do diretório.
Arquivos que não possuem regras herdam a configuração do diretório pai com base nas permissões padrão.
Conforme brevemente explicado anteriormente é possível definir valores padrões para usuários, grupos e outros, em pastas e arquivos, diferente do dono, grupo e outros padrão do sistema de arquivos.
getfacl – utilizado para visualizar as permissões
setfacl – utilizado para alterar as permissões
Obtendo informações do arquivo planilha.txt com getfacl
getfacl pub/comercial/planilha.txt # file: pub/comercial/planilha.txt # owner: jose # group: jose user::rw- group::r-- other::r--
Como podemos observar temos as permissões padrões.
Com o comando setfacl vamos alterar tais permissões
setfacl -m user:joao:rw pub/comercial/planilha.txt
Utilize o parâmetro -m seguido de user, group, other para adicionar novas permissões para usuários distintos, grupos e outros. Pode-se abreviar user para u, g e o.
É possível atribuir permissões para usuários e grupos simultaneamente.
setffacl -m u:joao:rw,g:diretores:rw pub/financeiro/relatorio.txt
Observe que será necessário da permissão de leitura e execução no subdiretório financeiro para que joao possa editar o arquivos relatório.txt.
setfacl -m u:joao:rx pub/financeiro
Desta forma, mesmo joao não sendo dono original do arquivo relatório.txt e nem fazendo parte do grupo diretores, estou me referindo das permissões padrões do sistema, terá acesso de leitura e gravação no arquivo, pois, ele também tem permissão de leitura e execução do diretório financeiro através de regras ACLs.
O usuário joao ainda poderá ler outros arquivos nesse subdiretório, mas alterar somente o arquivo relatorio.txt
Obtendo informações com getfacl do sub diretório financeiro e arquivo relatorio.txt
getfacl pub/financeiro # file: pub/financeiro/ # owner: root # group: diretores user::rwx user:joao:r-x group::rwx mask::rwx other::--- getfacl pub/financeiro/relatorio.txt # file: pub/financeiro/relatorio.txt # owner: alberto # group: alberto user::rw- user:joao:rw- group::r-- group:diretores:rw- mask::rw- other::r--
Criando arquivos com o usuário alberto e jose
su alberto touch pub/financeiro/relatorio.txt su jose touch pub/comercial/planilha.txt
Da forma como está configurado até agora, usando a permissões de acesso padrão, o arquivo criado pelo usuário jose no subdiretório comercial terá permissão de somente leitura para o usuário joao que faz parte do mesmo grupo gerentes definido neste subdiretório, a depender da umask definida.
Ainda, no subdiretório financeiro o usuário joao não poderá acessar arquivos, independente da umask definida, pois ele não é o dono do subdiretório, não faz parte do grupo diretores e outros não tem permissão de acesso.
Obs: Obrigado Mike pelo compartilhamento, apesar deste texto (e o site também) ainda estar em construção, finalizarei o mais breve possível.