Segue o resumo de comandos e conceitos vistos em Sala de Aula.
Este é um material de apoio aos meus alunos que tem todo embasamento durante as aulas presenciais.
O Gerenciamento de permissões de usuários do Linux é
bastante genérico e chega a um determinado momento que os commandos chown,
chgrp e chmod já não satisfazem a uma situação.
Veja este exemplo:
Quero que um grupo inteiro grave em um diretório e dois usuários
deste grupo tenham apenas acesso de somente leitura.
Como fazer exceções
deste tipo?
Para resolver situações bem particulares como esta, o uso de
ACL – Access Control List, (ou Lista de Controle de acessos) é muito bem-vinda.
Para usar ACLs no Linux é necessário instalar um pacote no
Linux.
Em distribuições baseadas em Debian/Ubuntu/Mint faça:
# apt-get install acl
Em distribuições baseadas em Redhat/Fedora faça:
# yum install acl
Porém antes de começar a usar, é necessário fazer uma
configuração.
1 - Abra o arquivo /etc/fstab
2 - Procure a linha que tem a montagem da sua partição raiz
(ou na partição que você deseja usar o ACLs). Na
quarta coluna, basta acrescentar ,acl
Veja um exemplo:
Antes:
/dev/sda1 / reiserfs noatime,notail 0 1
Depois:
/dev/sda1 / reiserfs noatime,notail,acl 0 1
Salve o arquivo e digite o seguinte comando no console:
# mount / -o remount,acl
Obs: Nos meus testes usando Debian em máquina virtual no
VMWARE PLAYER o comando acima não surtiu efeito. O gerenciamento das ACLs
ficaram inconsistentes. Depois de rebootar a máquina virtual, os comandos
começaram a funcionar imediatamente. Caso você tenha este mesmo problema,
reinicie a máquina.
Para ter certeza que a acl está ativa na partição, digite o
comando mount
O Resultado da minha máquina virtual foi o seguinte:
/dev/sda1 on / type ext3
(rw,errors=remount-ro,acl)
tmpfs on /lib/init/rw type tmpfs
(rw,nosuid,mode=0755)
proc on /proc type proc
(rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs
(rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs
(rw,nosuid,nodev)
devpts on /dev/pts type devpts
(rw,noexec,nosuid,gid=5,mode=620)
none on /proc/fs/vmblock/mountPoint type
vmblock (rw)
Note na primeira linha que a minha partição raiz está com a
acl ativada.
Se não houver erros, o comando foi configurado correto.
A partir de agora poderemos atribuir permissões não só ao
usuário dono e ao grupo, mas a cada usuário.
Vamos lá!
Vamos aprender a visualizar como estão as permissões de uma
pasta.
Vamos criar um diretório chamado pasta_exemplo
# mkdir pasta_exemplo
Vamos definir as seguintes permissões:
# chmod 775 pasta_exemplo
Para fazer a visualização normal, que aprendemos nas aulas
10 e 11 e ver as permissões do sistema.
# ls -ld pasta_exemplo
O resultado é este:
drwxrwxr-x 2 root root 1024 2008-05-06 11:41
pasta_exemplo
Para ficar mais interessante, vamos criar um grupo chamado
alunos e colocar tres alunos lá dentro:
# groupadd alunos
# useradd -m -s /bin/bash -g alunos aluno1
# useradd -m -s /bin/bash -g alunos aluno2
# useradd -m -s /bin/bash -g alunos aluno3
Vamos fazer o seguinte: Vamos passar a propriedade da pasta
para o grupo alunos e permitir manipulação total desta pasta:
# chgrp alunos pasta_exemplo
# chmod 770 pasta_exemplo
Veja que a partir de agora, a pasta_exemplo tem como grupo
dono, o grupo alunos.
# ls -ld pasta_exemplo
drwxrwx--- 2 root alunos 4096 Apr 18 19:26
pasta_exemplo/
Note também que apenas o usuário root e o grupo alunos tem
poder total sobre esta pasta.
O Grupo alunos tem três usuários dentro: aluno1, aluno2 e
aluno3. Como fazer para por exemplo, deixar que apenas o aluno3 fique com
acesso de somente leitura?
Fácil, vamos usar os comandos contidos no pacote acl que
acabamos de instalar. O comando que usaremos é o
setfacl
# setfacl -m u:aluno3:r-x pasta_exemplo
Explicando:
setfacl --> comando que altera as acls
-m --> modificar
u: --> especifica que vamos alterar as permissões de um
usuário
aluno3 --> o usuário em questão
r-x --> estou tirando o poder de gravação na pasta deste
usuário
pasta_exemplo --> o diretório alvo do comando.
Para ver o resultado disso, usaremos o comando getfacl
# getfacl pasta_exemplo
# file: pasta_exemplo
# owner: root
# group: alunos
user::rwx
user:aluno3:r-x
group::rwx
mask::rwx
other::---
Note que todos do grupo tem permissão EXCETO o usuário
aluno3
Vamos repetir com o aluno1? Ele só poderá executar. Veja:
# setfacl -m u:aluno1:--- pasta_exemplo
O Resultado:
# getfacl pasta_exemplo/
# file: pasta_exemplo/
# owner: root
# group: root
user::rwx
user:aluno1:---
user:aluno3:r-x
group::r-x
mask::r-x
other::---
Vamos fazer agora com um grupo. O Grupo professores, terá
permissão total na pasta
# setfacl -m g:professores:rwx pasta_exemplo/
O Resultado:
# getfacl pasta_exemplo/
# file: pasta_exemplo/
# owner: root
# group: root
user::rwx
user:aluno1:---
user:aluno3:r-x
group::r-x
group:professores:rwx
mask::rwx
other::---
E não tem limite... Você pode ir fazendo suas alterações de
acordo com a necessidade.
A partir de agora, quando você der um ls -l na
pasta_exemplo, o resultado será este:
drwxrwx---+ 2 root alunos 1024 2008-05-06
11:41 pasta_exemplo
Notou a presença do caracter + ... isso quer dizer que esta
pasta tem permissões especiais...
Vamos a alguns
exemplos:
Atribuir ao grupo alunos, poder total sobre a pasta
# setfacl -m g:alunos:rwx pasta_exemplo
Exibir as novas permissões:
# getfacl pasta_exemplo
Vamos entrar na pasta_exemplo
# cd pasta_exemplo
Vamos criar um arquivo em branco chamado arquivo.txt
# touch arquivo.txt
Vamos fazer que apenas o usuário aluno1 tenha permissão de
modificar este arquivo.
# setfacl -m u:aluno1:rw- arquivo.txt
Para visualizar, faça:
# getfacl arquivo.txt
# file: arquivo.txt
# owner: root
# group: root
user::rw-
user:aluno1:rw-
group::r--
mask::rw-
other::r--
Se preferir, faça os testes, logue com os usuários criados e
tente gravar no arquivo ou fazer outras modificações não permitidas.
Obs: este comando aceita os parametros de recursividade como
-R
Exemplo:
setfacl -R -m g:alunos:r-x /teste
No exemplo acima, todo os arquivos e subdiretório do
diretório /teste será afetado.
Retirando ACLs:
Para retirar ACLs
# setfacl -x u:aluno3 pasta_exemplo
# setfacl -x g:alunos pasta_exemplo