Permissões em UNIX e Linux
Colaboração: Daniel Duclos
Data de Publicação: 01 de Maio de 2005
O UNIX possui um sistema de permissões que define os direitos dos usuários e dos programas sobre todos os arquivos e diretórios. Essas permissões são controladas pelo comando chmod. Para este tutorial utilizaremos a sintaxe da versão GNU desse programa.
Sistema Básico de permissões
O sistema básico de permissões é dado em três níveis principais: dono do arquivo (user, em inglês), grupo de usuários ao qual pertence o arquivo (group) e o restante (others). Dos termos em inglês utilizaremos u para representar o dono do arquivo, g para grupo e o para os outros.
Cada nível pode ter, por sua vez, três tipos de permissões: leitura (read, representado pela letra r), escrita (write, w) e execução (execute, representado pela letra x). A nomenclatura ugo e rwx, derivadas dos nomes em inglês para os níveis e permissões é comumente usada na Internet e será adotada neste tutorial.
O sistema garante o acesso de leitura, gravação ou execução dependendo do valro de um bit associado ao arquivo. Cada bit pode ter o valor de 0 ou 1. Existem então 9 bits para representar as permissões, pois são três níveis (ugo) vezes três permissões possíveis (rwx).
Vamos observar as permissões de um arquivo de exemplo:
$ ls -l index.html -rw-r--r-- 1 daniduc webmasters 4632 2004-12-17 13:39 index.html $
Repare no -rw-rr. Essas são as permissões do
arquivo. As três primeiras são para o dono do arquivo
(daniduc), as três seguintes representam os direitos
do grupo (webmasters) e as três últimas dos demais
usuários. Vamos destrinchá-las.
Analisemos agora as permissões do dono do arquivo, representadas por são rw-. O traço representa o bit inativo (valor zero) e a letra o bit ativo (valor 1). Então vemos que o dono tem permissão de ler e escrever no arquivo, mas não executá-lo. Veja um teste:
$ ./index.html bash: ./index.html: Permissão negada $
O sistema avisou que não há permissão para executar o arquivo, como esperado.
Assim, concluimos que o arquivo pode ser lido e escrito pelo seu dono e pelos membros do grupo que o possui, e os demais apenas podem lê-lo.
Agora veremos como alterar essas permnissões. Para isso, é preciso entender como se referir numericamente à essas permissões. A teoria é muito simples. Vamos montar uma tabela de valores possíveis para os bits de leitura, gravação e execução, que podem estar desligados (representados por 0) ou ligados (1)
rwx 000 001 010 011 100 101 110 111
Ora, podemos converter os valores binários em decimais, e então a tabela ficaria assim:
rwx - Valor octal 000 - 0 001 - 1 010 - 2 011 - 3 100 - 4 101 - 5 110 - 6 111 - 7
Assim fica fácil visualizar o valor numérico que representa nossa escolha de permissões. Se queremos que um arquivo tenha permissão de leitura, gravação mas não de escrita teremos o primeiro e o segundo bits ligados e o terceiro desligado, ou seja, 110, que em octal é 6. Agora basta aplicar o mesmo sistema para cada um dos níveis. Para representar as permissões do nosso arquivo de exemplo (rw-, rw-, r--) ficaria 110, 110, 001, ou seja 664.
Agora, suponha que eu queira dar a permissão de escrita para todo mundo no arquivo index.html. Bastaria dar o comando:
$ chmod 666 index.html
Veja como fica:
$ ls -l index.html -rw-rw-rw- 1 daniduc webmasters 4632 2004-12-17 13:39 index.html
Para retirar a permissão de escrita de todos e do grupo fica:
$ chmod 644 index.html $ ls -l index.html -rw-r--r-- 1 daniduc webmasters 4632 2004-12-17 13:39 index.html
Diretórios
Um diretório deve ter permissão de execução para que se possa entrar nele. Além disso, as permissões de um diretório tem precedência sobre as dos arquivos que ele contém. Veja um exemplo:
Primeiro temos um diretório pertencente ao usuário daniduc
$ ls -ld /dir/ drwxr-xr-x 2 daniduc daniduc 72 2005-04-19 03:14 /dir/ $
Agora o usuário daniduc cria um arquivo dentro de /dir e em seguida dá à ele permissões totais para todos os usuários:
daniduc $ cd /dir daniduc $ touch teste daniduc $ ls -l teste -rw-r--r-- 1 daniduc daniduc 0 2005-04-19 03:14 teste daniduc $ chmod 777 teste daniduc $ ls -l teste -rwxrwxrwx 1 daniduc daniduc 0 2005-04-19 03:14 teste
Teoricamente, outro usuário pdoeria remover esse arquivo. Mas vamos ver que o usuário carla não consegue isso:
carla $ ls -l teste -rwxrwxrwx 1 daniduc daniduc 0 2005-04-19 03:14 teste carla $ rm -f teste rm: imposível remover `teste': Permissão negada carla $
Isso se dá por causa das permissões do diretório no qual o arquivo teste está contido:
drwxr-xr-x 2 daniduc daniduc 72 2005-04-19 03:14 /dir/
Vamos alterar as permissões do diretório para que todos tenham controle sobre ele, mas manter o arquivo teste exatamente igual:
daniduc $ chmod 777 /dir daniduc $ -> ls -ld /dir drwxrwxrwx 2 daniduc daniduc 72 2005-04-19 03:14 /dir/ daniduc $
Vamos ver agora se a carla consegue seu intento:
carla $ ls -l teste -rwxrwxrwx 1 daniduc daniduc 0 2005-04-19 03:14 teste carla $ rm -f teste carla $ ls -l teste ls: teste: Arquivo ou diretório não encontrado carla $
Bits extras
Sticky Bit
Além dos bits básicos já vistos até agora, há ainda mais dois extras. O primeiro deles é o "sticky bit", associado à diretórios e representado pela letra t. Caso este bit esteja ativado (com valor 1), o diretório não pode ser removido, mesmo que com permissão 777. Além disso, os arquivos criados dentro desse diretório só podem ser apagados pelo seu dono. Isso é muito útil em diretórios temporários, como o tmp, onde todos podem escrever:
$ ls -ld /tmp/ drwxrwxrwt 9 root root 45056 2005-04-19 04:04 /tmp/ $
Para ativar o sticky bit utiliza-se o valor 1 À frente das permissões já vistas:
daniduc $ chmod 1777 /dir/ daniduc $ ls -ld /biboca/ drwxrwxrwt 2 daniduc daniduc 48 2005-04-19 03:30 /dir/ daniduc $
SUID
Normalmente quando um arquivo é executado ele roda com os privilégios do usuário que o está executando. Mas há momentos em que isso precisa ser contornado. Por exemplo, para um usuário alterar sua senha ele chama o comando passwd. Esse comando precisa remover a senha antiga e inserir a senha nova no arquivo /etc/shadow. Porém, esse arquivo normalmente só pode ser alterado pelo root. Como fazer isso, se o passwd foi chamado pelo usuário comum?
A resposta é ativar o bit SUID. Com esse bit ativado o programa passa a rodar com as permissões do usuário dono do arquivo, e não mais de quem o invocou. O bit SUID é representado pela letra s logo após a área de permissões do usuário. Veja:
daniduc $ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 26616 2004-11-02 19:51 /usr/bin/passwd daniduc $
Para se ativar o bit SUID com o comando chmod utiliza-se o valor 4 á frente das permissões básicas (ugo):
daniduc $ touch teste daniduc $ ls -l teste -rw-r--r-- 1 daniduc daniduc 0 2005-04-19 03:50 teste daniduc $ chmod 4755 teste daniduc $ ls -l teste -rwsr-xr-x 1 daniduc daniduc 0 2005-04-19 03:50 teste daniduc $
GUID
Similarmente ao BIT SUID, o GID faz com que o arquivo seja executado com os privilégios do grupo ao qual pertence e não do usuário que o executa. O bit GID é representado pela letra s logo após o conjunto de permissões do grupo. Para ativar o GID, utilize o 2 no comando chmod:
daniduc $ touch teste daniduc $ ls -l teste -rw-r--r-- 1 daniduc daniduc 0 2005-04-19 04:06 teste daniduc $ chmod 2755 teste daniduc $ ls -l teste -rwxr-sr-x 1 daniduc daniduc 0 2005-04-19 04:06 teste daniduc $
ATENÇÃO: Não é aconselhável, por questões de segurança, ativar os bits SUID e GID em novos arquivos, especialmente se eles pertecerem ao root.
MÁSCARA
Quando criamos um arquivo ele é criado com permissões totais, ou seja, 666. Note que eles jamais são criados com permissão de execução. Isso em geral não é seguro, claro. Esse modo de criação pode ser alterado com o comando umask. Similarmente ao chmod, no qual se especifica quais bits devem ser desligados, o comando umask determina quais bits devem ser desligados.
Se você quer que os arquivos sejam criados sem permissão de escrita para o grupo e para os outros, então o comando ficaria assim:
umask 022
Nenhum bit foi desligado para o dono, e o bit de escrita (010, ou 2 em octal) desligado para grupo e outros.
Esse comando está em geral incluido no arquivo /etc/profile ou arquivo equivalente que determina o ambiente para todos os usuários.
Conclusão
Isso cobre o sistema básico de permissões de arquivos. Pode-se continuar avançando com o conceito de ACL no tutorial seguinte presente no cybershark.net