De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

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 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 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 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:

$ cd /dir
$ touch teste
$ ls -l teste
-rw-r--r--  1 daniduc daniduc 0 2005-04-19 03:14 teste
$ chmod 777 teste
$ 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: imposível remover `teste': Permissão negada

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:

$ chmod 777 /dir
$ ls -ld /dir
drwxrwxrwx  2 daniduc daniduc 72 2005-04-19 03:14 /dir/

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

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:

$ chmod 1777 /dir/
$ ls -ld /biboca/
drwxrwxrwt  2 daniduc daniduc 48 2005-04-19 03:30 /dir/

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:

$ ls -l /usr/bin/passwd
-rwsr-xr-x  1 root root 26616 2004-11-02 19:51 /usr/bin/passwd

Para se ativar o bit SUID com o comando chmod utiliza-se o valor 4 á frente das permissões básicas (ugo):

$ touch teste
$ ls -l teste
-rw-r--r--  1 daniduc daniduc 0 2005-04-19 03:50 teste 
$ chmod 4755 teste
$ ls -l teste
-rwsr-xr-x  1 daniduc daniduc 0 2005-04-19 03:50 teste

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
$ ls -l teste
-rw-r--r--  1 daniduc daniduc 0 2005-04-19 04:06 teste
$ chmod 2755 teste
$ ls -l teste
-rwxr-sr-x  1 daniduc daniduc 0 2005-04-19 04:06 teste

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 ligados, 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

versão on line

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Daniel Duclos