O Linux é definitivamente um sistema multiusuário, então é necessário prover um sistema de permissões para controlar um conjunto de operações autorizadas em arquivos e diretórios, o que inclui todos os recursos e dispositivos do sistema (em um sistema Unix, qualquer dispositivo é representado por um arquivo ou diretório). Esse princípio é comum a todos os sistemas Unix, porém o lembrete é sempre útil, especialmente porque existem alguns interessantes e relativamente avançados usos desconhecidos.
9.3.1. Proprietários(as) e permissões
Cada arquivo ou diretório tem permissões específicas para três categorias de usuários(as):
seu proprietário(a) (simbolizado por u
como em "user");
seu grupo proprietário(a) (simbolizado por g
como em “group”), representando todos os membros do grupo;
outros (simbolizado por o
como em “other”).
Os três tipos básicos de direitos podem ser combinados:
leitura (simbolizado por r
como em “read”);
escrita (ou modificação, simbolizado por w
como em “write”);
execução (simbolizado por x
como em “eXecute”).
No caso de um arquivo, essas permissões são facilmente compreendidas: acesso de leitura permite ler o conteúdo (incluindo copiar), acesso a escrita permite alterá-lo, e acesso de execução permite rodá-lo (o que só vai funcionar se for um programa).
Um diretório é gerenciado de maneira diferente. O acesso a leitura dá o direito de consultar a lista de suas entradas (arquivos e diretórios), acesso a escrita permite criar e apagar arquivos, e acesso a execução permite navegar por ele (especialmente para usar o comando cd
). Conseguir navegar pelo diretório sem ser capaz de lê-lo dá a permissão de acessar as entradas dentro dele que são conhecidas pelo nome, mas não para encontrá-las se você não souber de sua existência ou nome exato.
Três comandos controlam as permissões associadas a um arquivo:
chown usuário(a) arquivo
muda o(a) proprietário(a) do arquivo;
chgrp grupo arquivo
altera o grupo;
chmod direitos arquivo
muda as permissões do arquivo.
Há duas formas de apresentar direitos. Entre elas, a representação simbólica é provavelmente a mais fácil de entender e lembrar. Ela envolve os símbolos das letras mencionadas acima. Você pode definir os direitos de cada categoria de usuários(as) (u
/g
/o
), definindo-as explicitamente (com =
), adicionando (+
) ou subtraindo (-
). Assim, as permissões u=rwx,g+rw,o-r
fornecem ao(à) proprietário(a) a permissão de ler, escrever e executar, acrescenta permissão de ler e escrever para o grupo proprietário, e remove a permissão de leitura para outros(as) usuários(as). Direitos não alterados pela adição ou subtração de tal comando não sofrerão alterações. A letra a
, para "todos" (“all” em inglês), abrange as três categorias de usuários(as), de modo que a=rx
concede a todas as três categorias os mesmos direitos (leitura e execução, mas não de escrita).
A representação numérica (octal) associa cada direito com um valor: 4 para leitura, 2 para gravação, e 1 para execução. Associamos cada combinação de direitos com a soma dos valores. Cada valor é então atribuído a diferentes categorias de usuários(as), colocando-os de ponta a ponta na ordem usual (proprietário(a), grupo, outros).
Por exemplo, o comando chmod 754 arquivo
definirá os seguintes direitos: leitura, escrita e execução para o(a) proprietário(a) (já que 7 = 4 + 2 + 1); leitura e execução para o grupo (já que 5 = 4 + 1); para os outros somente leitura . O 0
(zero) significa que não há direitos; assim chmod 600 arquivo
concede direito de leitura e gravação ao(à) proprietário(a), e nenhum direito para qualquer outra pessoa. As combinações certas mais frequentes são 755
para arquivos executáveis e diretórios, e 644
para arquivos de dados.
Para representar os direitos especiais, você pode prefixar um quarto dígito para este número de acordo com o mesmo princípio, onde os bits setuid
, setgid
e sticky
são 4, 2 e 1, respectivamente, chmod 4754
associará o setuid
aos direitos descritos anteriormente.
Observe que o uso da notação octal só permite definir todos os direitos de uma só vez em um arquivo; você não pode usá-lo para simplesmente adicionar um novo direito, como acesso de leitura para o(a) proprietário(a) do grupo, uma vez que você deve levar em conta os direitos já existentes e calcular o novo valor numérico correspondente.
9.3.2. ACLs - Listas de controle de acesso
Muitos sistemas de arquivos, por ex. Btrfs, Ext3, Ext4, JFS, XFS, etc., suportam o uso de Listas de Controle de Acesso (ACLs). Eles estendem os recursos básicos de propriedade e permissão de arquivo, descritos na seção anterior, e permitem um controle mais refinado de cada objeto (arquivo). Por exemplo: um(a) usuário(a) deseja compartilhar um arquivo com outro(a) usuário(a), e esse(a) usuário(a) só deve poder ler o arquivo, mas não escrever nele ou alterá-lo.
Para alguns dos sistemas de arquivos, o uso de ACLs é ativado por padrão (por exemplo, Btrfs, Ext3, Ext4). Para outros sistemas de arquivos ou sistemas mais antigos, deve ser ativado usando a opção de montagem acl
- diretamente no comando mount
ou em /etc/fstab
. Da mesma forma, o uso de ACLs pode ser desativado usando a opção de montagem noacl
. Para sistemas de arquivos Ext* também é possível usar o comando tune2fs -o [no]acl /dev/device
para ativar/desativar o uso de ACLs por padrão. Os valores padrão para cada sistema de arquivos geralmente podem ser encontrados em suas páginas de manual homônimas na seção 5 (sistema de arquivos(5)) ou em mount(8).
Depois de ativar as ACLs, as permissões podem ser definidas usando o comando setfacl(1), enquanto getfacl( 1) permite recuperar as ACLs para um determinado objeto ou caminho. Esses comandos fazem parte do pacote acl. Com setfacl
também é possível configurar arquivos ou diretórios recém-criados para herdar permissões do diretório pai. É importante observar que as ACLs são processadas em sua ordem e que uma entrada anterior adequada à situação tem precedência sobre entradas posteriores.
Se um arquivo tiver ACLs definidas, a saída do comando ls -l
mostrará um sinal de adição após as permissões tradicionais. Ao usar ACLs, o comando chmod
se comporta um pouco diferente e umask
pode ser ignorado. A extensa documentação, por exemplo acl(5) contém mais informações.