Permissão em sistemas UNIX

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 valor 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 o 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-r–r–. 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 os dos demais usuários. Vamos destrinchá-las.

Os três primeiros bits 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, concluímos 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 permissõ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, 100, 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 poderia 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: impossí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 $ 

SGID

Similarmente ao BIT SUID, o SGID 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 SGID é representado pela letra s logo após o conjunto de permissões do grupo. Para ativar o SGID, 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 pertencerem 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 incluído no arquivo /etc/profile ou arquivo equivalente que determina o ambiente para todos os usuários.

Sorry, comments are closed for this post.