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.
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.
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
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
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/
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
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.
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.
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
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários